Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1901 | serge | 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 |