1464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul#!/bin/sh
2464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul
3464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul
4464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul# A minimal replacement for 'install' that supports installing symbolic links.
5464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul# Only a limited number of options are supported:
6464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul# -d dir          Create a directory
7464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul# -m mode         Sets a file's mode when installing
8464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul
9464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul
10464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul# If these commands aren't portable, we'll need some "if (arch)" type stuff
11464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian PaulSYMLINK="ln -s"
12464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian PaulMKDIR="mkdir -p"
13464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian PaulRM="rm -f"
14464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul
15464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian PaulMODE=""
16464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul
17464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paulif [ "$1" = "-d" ] ; then
18464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul	# make a directory path
19464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul	$MKDIR "$2"
20464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul	exit 0
21464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paulfi
22464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul
23464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paulif [ "$1" = "-m" ] ; then
24464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul	# set file mode
25464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul	MODE=$2
26464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul	shift 2
27464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paulfi
28464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul
29464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul# install file(s) into destination
30464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paulif [ $# -ge 2 ] ; then
31464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul
32464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul	# Last cmd line arg is the dest dir
33464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul	for FILE in $@ ; do
34c55a8a73a483305c7c9a7bcc7191dd7c833f873dJon TURNEY		DESTDIR="$FILE"
35464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul	done
36464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul
37464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul	# Loop over args, moving them to DEST directory
38464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul	I=1
39464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul	for FILE in $@ ; do
40464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul		if [ $I = $# ] ; then
41464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul			# stop, don't want to install $DEST into $DEST
42464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul			exit 0
43464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul		fi
44464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul
45c55a8a73a483305c7c9a7bcc7191dd7c833f873dJon TURNEY                DEST=$DESTDIR
46c55a8a73a483305c7c9a7bcc7191dd7c833f873dJon TURNEY
47c55a8a73a483305c7c9a7bcc7191dd7c833f873dJon TURNEY                # On CYGWIN, because DLLs are loaded by the native Win32 loader,
48c55a8a73a483305c7c9a7bcc7191dd7c833f873dJon TURNEY                # they are installed in the executable path.  Stub libraries used
49c55a8a73a483305c7c9a7bcc7191dd7c833f873dJon TURNEY                # only for linking are installed in the library path
50c55a8a73a483305c7c9a7bcc7191dd7c833f873dJon TURNEY                case `uname` in
51c55a8a73a483305c7c9a7bcc7191dd7c833f873dJon TURNEY                    CYGWIN*)
52c55a8a73a483305c7c9a7bcc7191dd7c833f873dJon TURNEY                        case $FILE in
53c55a8a73a483305c7c9a7bcc7191dd7c833f873dJon TURNEY                            *.dll)
54c55a8a73a483305c7c9a7bcc7191dd7c833f873dJon TURNEY                                DEST="$DEST/../bin"
55c55a8a73a483305c7c9a7bcc7191dd7c833f873dJon TURNEY                                ;;
56c55a8a73a483305c7c9a7bcc7191dd7c833f873dJon TURNEY                            *)
57c55a8a73a483305c7c9a7bcc7191dd7c833f873dJon TURNEY                                ;;
58c55a8a73a483305c7c9a7bcc7191dd7c833f873dJon TURNEY                        esac
59c55a8a73a483305c7c9a7bcc7191dd7c833f873dJon TURNEY	                ;;
60c55a8a73a483305c7c9a7bcc7191dd7c833f873dJon TURNEY                    *)
61c55a8a73a483305c7c9a7bcc7191dd7c833f873dJon TURNEY                        ;;
62c55a8a73a483305c7c9a7bcc7191dd7c833f873dJon TURNEY                esac
63c55a8a73a483305c7c9a7bcc7191dd7c833f873dJon TURNEY
641043a7c71ab6b655fa3345dd34df0a5e84f3e031Alan Coopersmith		PWDSAVE=`pwd`
651043a7c71ab6b655fa3345dd34df0a5e84f3e031Alan Coopersmith
66464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul		# determine file's type
67464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul		if [ -h "$FILE" ] ; then
68464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul			#echo $FILE is a symlink
69464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul			# Unfortunately, cp -d isn't universal so we have to
70464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul			# use a work-around.
71464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul
72464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul			# Use ls -l to find the target that the link points to
73464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul			LL=`ls -l "$FILE"`
74464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul			for L in $LL ; do
75464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul				TARGET=$L
76464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul			done
77464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul			#echo $FILE is a symlink pointing to $TARGET
78464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul
79464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul			FILE=`basename "$FILE"`
80464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul			# Go to $DEST and make the link
81464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul			cd "$DEST"        # pushd
82464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul				$RM "$FILE"
83464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul				$SYMLINK "$TARGET" "$FILE"
84464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul			cd "$PWDSAVE"     # popd
85464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul
86464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul		elif [ -f "$FILE" ] ; then
87464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul			#echo "$FILE" is a regular file
88d2f4c2b6327832ce59dde5d7741a656b5ff5c46dCarl Worth			# Only copy if the files differ
89d2f4c2b6327832ce59dde5d7741a656b5ff5c46dCarl Worth			if ! cmp -s $FILE $DEST/`basename $FILE`; then
90d2f4c2b6327832ce59dde5d7741a656b5ff5c46dCarl Worth				$RM "$DEST/`basename $FILE`"
91d2f4c2b6327832ce59dde5d7741a656b5ff5c46dCarl Worth				cp "$FILE" "$DEST"
92d2f4c2b6327832ce59dde5d7741a656b5ff5c46dCarl Worth			fi
93464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul			if [ $MODE ] ; then
94464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul				FILE=`basename "$FILE"`
95464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul				chmod $MODE "$DEST/$FILE"
96464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul			fi
97464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul		else
98464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul			echo "Unknown type of argument: " "$FILE"
99464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul			exit 1
100464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul		fi
101464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul
102464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul		I=`expr $I + 1`
103464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul	done
104464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul
105464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul	exit 0
106464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paulfi
107464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul
108464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul# If we get here, we didn't find anything to do
109464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paulecho "Usage:"
110464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paulecho "  install -d dir                      Create named directory"
111464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paulecho "  install [-m mode] file [...] dest   Install files in destination"
112464fcd0dd84cf4c705b992a087cdcb8b403eb8efBrian Paul
113