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