Home | History | Annotate | Download | only in bin
      1 #!/bin/sh
      2 
      3 
      4 # A minimal replacement for 'install' that supports installing symbolic links.
      5 # Only a limited number of options are supported:
      6 # -d dir          Create a directory
      7 # -m mode         Sets a file's mode when installing
      8 
      9 
     10 # If these commands aren't portable, we'll need some "if (arch)" type stuff
     11 SYMLINK="ln -s"
     12 MKDIR="mkdir -p"
     13 RM="rm -f"
     14 
     15 MODE=""
     16 
     17 if [ "$1" = "-d" ] ; then
     18 	# make a directory path
     19 	$MKDIR "$2"
     20 	exit 0
     21 fi
     22 
     23 if [ "$1" = "-m" ] ; then
     24 	# set file mode
     25 	MODE=$2
     26 	shift 2
     27 fi
     28 
     29 # install file(s) into destination
     30 if [ $# -ge 2 ] ; then
     31 
     32 	# Last cmd line arg is the dest dir
     33 	for FILE in $@ ; do
     34 		DESTDIR="$FILE"
     35 	done
     36 
     37 	# Loop over args, moving them to DEST directory
     38 	I=1
     39 	for FILE in $@ ; do
     40 		if [ $I = $# ] ; then
     41 			# stop, don't want to install $DEST into $DEST
     42 			exit 0
     43 		fi
     44 
     45                 DEST=$DESTDIR
     46 
     47                 # On CYGWIN, because DLLs are loaded by the native Win32 loader,
     48                 # they are installed in the executable path.  Stub libraries used
     49                 # only for linking are installed in the library path
     50                 case `uname` in
     51                     CYGWIN*)
     52                         case $FILE in
     53                             *.dll)
     54                                 DEST="$DEST/../bin"
     55                                 ;;
     56                             *)
     57                                 ;;
     58                         esac
     59 	                ;;
     60                     *)
     61                         ;;
     62                 esac
     63 
     64 		PWDSAVE=`pwd`
     65 
     66 		# determine file's type
     67 		if [ -h "$FILE" ] ; then
     68 			#echo $FILE is a symlink
     69 			# Unfortunately, cp -d isn't universal so we have to
     70 			# use a work-around.
     71 
     72 			# Use ls -l to find the target that the link points to
     73 			LL=`ls -l "$FILE"`
     74 			for L in $LL ; do
     75 				TARGET=$L
     76 			done
     77 			#echo $FILE is a symlink pointing to $TARGET
     78 
     79 			FILE=`basename "$FILE"`
     80 			# Go to $DEST and make the link
     81 			cd "$DEST"        # pushd
     82 				$RM "$FILE"
     83 				$SYMLINK "$TARGET" "$FILE"
     84 			cd "$PWDSAVE"     # popd
     85 
     86 		elif [ -f "$FILE" ] ; then
     87 			#echo "$FILE" is a regular file
     88 			# Only copy if the files differ
     89 			if ! cmp -s $FILE $DEST/`basename $FILE`; then
     90 				$RM "$DEST/`basename $FILE`"
     91 				cp "$FILE" "$DEST"
     92 			fi
     93 			if [ $MODE ] ; then
     94 				FILE=`basename "$FILE"`
     95 				chmod $MODE "$DEST/$FILE"
     96 			fi
     97 		else
     98 			echo "Unknown type of argument: " "$FILE"
     99 			exit 1
    100 		fi
    101 
    102 		I=`expr $I + 1`
    103 	done
    104 
    105 	exit 0
    106 fi
    107 
    108 # If we get here, we didn't find anything to do
    109 echo "Usage:"
    110 echo "  install -d dir                      Create named directory"
    111 echo "  install [-m mode] file [...] dest   Install files in destination"
    112 
    113