#!/bin/sh # A minimal replacement for 'install' that supports installing symbolic links. # Only a limited number of options are supported: # -d dir Create a directory # -m mode Sets a file's mode when installing # If these commands aren't portable, we'll need some "if (arch)" type stuff SYMLINK="ln -s" MKDIR="mkdir -p" RM="rm -f" MODE="" if [ "$1" = "-d" ] ; then # make a directory path $MKDIR "$2" exit 0 fi if [ "$1" = "-m" ] ; then # set file mode MODE=$2 shift 2 fi # install file(s) into destination if [ $# -ge 2 ] ; then # Last cmd line arg is the dest dir for FILE in $@ ; do DESTDIR="$FILE" done # Loop over args, moving them to DEST directory I=1 for FILE in $@ ; do if [ $I = $# ] ; then # stop, don't want to install $DEST into $DEST exit 0 fi DEST=$DESTDIR # On CYGWIN, because DLLs are loaded by the native Win32 loader, # they are installed in the executable path. Stub libraries used # only for linking are installed in the library path case `uname` in CYGWIN*) case $FILE in *.dll) DEST="$DEST/../bin" ;; *) ;; esac ;; *) ;; esac PWDSAVE=`pwd` # determine file's type if [ -h "$FILE" ] ; then #echo $FILE is a symlink # Unfortunately, cp -d isn't universal so we have to # use a work-around. # Use ls -l to find the target that the link points to LL=`ls -l "$FILE"` for L in $LL ; do TARGET=$L done #echo $FILE is a symlink pointing to $TARGET FILE=`basename "$FILE"` # Go to $DEST and make the link cd "$DEST" # pushd $RM "$FILE" $SYMLINK "$TARGET" "$FILE" cd "$PWDSAVE" # popd elif [ -f "$FILE" ] ; then #echo "$FILE" is a regular file # Only copy if the files differ if ! cmp -s $FILE $DEST/`basename $FILE`; then $RM "$DEST/`basename $FILE`" cp "$FILE" "$DEST" fi if [ $MODE ] ; then FILE=`basename "$FILE"` chmod $MODE "$DEST/$FILE" fi else echo "Unknown type of argument: " "$FILE" exit 1 fi I=`expr $I + 1` done exit 0 fi # If we get here, we didn't find anything to do echo "Usage:" echo " install -d dir Create named directory" echo " install [-m mode] file [...] dest Install files in destination"