13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#!/bin/sh
23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org# A minimal replacement for 'install' that supports installing symbolic links.
53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org# Only a limited number of options are supported:
63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org# -d dir          Create a directory
73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org# -m mode         Sets a file's mode when installing
83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org# If these commands aren't portable, we'll need some "if (arch)" type stuff
113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgSYMLINK="ln -s"
123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgMKDIR="mkdir -p"
133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgRM="rm -f"
143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgMODE=""
163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgif [ "$1" = "-d" ] ; then
183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	# make a directory path
193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	$MKDIR "$2"
203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	exit 0
213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgfi
223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgif [ "$1" = "-m" ] ; then
243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	# set file mode
253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	MODE=$2
263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	shift 2
273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgfi
283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org# install file(s) into destination
303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgif [ $# -ge 2 ] ; then
313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	# Last cmd line arg is the dest dir
333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	for FILE in $@ ; do
34760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org		DESTDIR="$FILE"
353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	done
363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	# Loop over args, moving them to DEST directory
383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	I=1
393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	for FILE in $@ ; do
403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		if [ $I = $# ] ; then
413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			# stop, don't want to install $DEST into $DEST
423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			exit 0
433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		fi
443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
45760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                DEST=$DESTDIR
46760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
47760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                # On CYGWIN, because DLLs are loaded by the native Win32 loader,
48760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                # they are installed in the executable path.  Stub libraries used
49760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                # only for linking are installed in the library path
50760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                case `uname` in
51760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                    CYGWIN*)
52760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                        case $FILE in
53760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                            *.dll)
54760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                                DEST="$DEST/../bin"
55760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                                ;;
56760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                            *)
57760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                                ;;
58760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                        esac
59760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org	                ;;
60760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                    *)
61760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                        ;;
62760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org                esac
63760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org
643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		PWDSAVE=`pwd`
653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		# determine file's type
673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		if [ -h "$FILE" ] ; then
683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			#echo $FILE is a symlink
693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			# Unfortunately, cp -d isn't universal so we have to
703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			# use a work-around.
713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			# Use ls -l to find the target that the link points to
733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			LL=`ls -l "$FILE"`
743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			for L in $LL ; do
753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org				TARGET=$L
763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			done
773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			#echo $FILE is a symlink pointing to $TARGET
783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			FILE=`basename "$FILE"`
803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			# Go to $DEST and make the link
813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			cd "$DEST"        # pushd
823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org				$RM "$FILE"
833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org				$SYMLINK "$TARGET" "$FILE"
843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			cd "$PWDSAVE"     # popd
853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		elif [ -f "$FILE" ] ; then
873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			#echo "$FILE" is a regular file
883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			# Only copy if the files differ
893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			if ! cmp -s $FILE $DEST/`basename $FILE`; then
903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org				$RM "$DEST/`basename $FILE`"
913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org				cp "$FILE" "$DEST"
923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			fi
933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			if [ $MODE ] ; then
943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org				FILE=`basename "$FILE"`
953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org				chmod $MODE "$DEST/$FILE"
963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			fi
973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		else
983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			echo "Unknown type of argument: " "$FILE"
993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			exit 1
1003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		fi
1013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		I=`expr $I + 1`
1033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	done
1043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	exit 0
1063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgfi
1073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org# If we get here, we didn't find anything to do
1093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgecho "Usage:"
1103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgecho "  install -d dir                      Create named directory"
1113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgecho "  install [-m mode] file [...] dest   Install files in destination"
1123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
113