• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
11SYMLINK="ln -s"
12MKDIR="mkdir -p"
13RM="rm -f"
14
15MODE=""
16
17if [ "$1" = "-d" ] ; then
18	# make a directory path
19	$MKDIR "$2"
20	exit 0
21fi
22
23if [ "$1" = "-m" ] ; then
24	# set file mode
25	MODE=$2
26	shift 2
27fi
28
29# install file(s) into destination
30if [ $# -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
106fi
107
108# If we get here, we didn't find anything to do
109echo "Usage:"
110echo "  install -d dir                      Create named directory"
111echo "  install [-m mode] file [...] dest   Install files in destination"
112
113