install-sh revision 50276
150276Speter#! /bin/sh 250276Speter# 350276Speter# install - install a program, script, or datafile 450276Speter# This comes from X11R5. 550276Speter# 650276Speter# Calling this script install-sh is preferred over install.sh, to prevent 750276Speter# `make' implicit rules from creating a file called install from it 850276Speter# when there is no Makefile. 950276Speter# 1050276Speter# This script is compatible with the BSD install script, but was written 1150276Speter# from scratch. 1250276Speter# 1350276Speter 1450276Speter 1550276Speter# set DOITPROG to echo to test this script 1650276Speter 1750276Speter# Don't use :- since 4.3BSD and earlier shells don't like it. 1850276Speterdoit="${DOITPROG-}" 1950276Speter 2050276Speter 2150276Speter# put in absolute paths if you don't have them in your path; or use env. vars. 2250276Speter 2350276Spetermvprog="${MVPROG-mv}" 2450276Spetercpprog="${CPPROG-cp}" 2550276Speterchmodprog="${CHMODPROG-chmod}" 2650276Speterchownprog="${CHOWNPROG-chown}" 2750276Speterchgrpprog="${CHGRPPROG-chgrp}" 2850276Speterstripprog="${STRIPPROG-strip}" 2950276Speterrmprog="${RMPROG-rm}" 3050276Spetermkdirprog="${MKDIRPROG-mkdir}" 3150276Speter 3250276Spetertranformbasename="" 3350276Spetertransform_arg="" 3450276Speterinstcmd="$mvprog" 3550276Speterchmodcmd="$chmodprog 0755" 3650276Speterchowncmd="" 3750276Speterchgrpcmd="" 3850276Speterstripcmd="" 3950276Speterrmcmd="$rmprog -f" 4050276Spetermvcmd="$mvprog" 4150276Spetersrc="" 4250276Speterdst="" 4350276Speterdir_arg="" 4450276Speter 4550276Speterwhile [ x"$1" != x ]; do 4650276Speter case $1 in 4750276Speter -c) instcmd="$cpprog" 4850276Speter shift 4950276Speter continue;; 5050276Speter 5150276Speter -d) dir_arg=true 5250276Speter shift 5350276Speter continue;; 5450276Speter 5550276Speter -m) chmodcmd="$chmodprog $2" 5650276Speter shift 5750276Speter shift 5850276Speter continue;; 5950276Speter 6050276Speter -o) chowncmd="$chownprog $2" 6150276Speter shift 6250276Speter shift 6350276Speter continue;; 6450276Speter 6550276Speter -g) chgrpcmd="$chgrpprog $2" 6650276Speter shift 6750276Speter shift 6850276Speter continue;; 6950276Speter 7050276Speter -s) stripcmd="$stripprog" 7150276Speter shift 7250276Speter continue;; 7350276Speter 7450276Speter -t=*) transformarg=`echo $1 | sed 's/-t=//'` 7550276Speter shift 7650276Speter continue;; 7750276Speter 7850276Speter -b=*) transformbasename=`echo $1 | sed 's/-b=//'` 7950276Speter shift 8050276Speter continue;; 8150276Speter 8250276Speter *) if [ x"$src" = x ] 8350276Speter then 8450276Speter src=$1 8550276Speter else 8650276Speter # this colon is to work around a 386BSD /bin/sh bug 8750276Speter : 8850276Speter dst=$1 8950276Speter fi 9050276Speter shift 9150276Speter continue;; 9250276Speter esac 9350276Speterdone 9450276Speter 9550276Speterif [ x"$src" = x ] 9650276Speterthen 9750276Speter echo "install: no input file specified" 9850276Speter exit 1 9950276Speterelse 10050276Speter true 10150276Speterfi 10250276Speter 10350276Speterif [ x"$dir_arg" != x ]; then 10450276Speter dst=$src 10550276Speter src="" 10650276Speter 10750276Speter if [ -d $dst ]; then 10850276Speter instcmd=: 10950276Speter else 11050276Speter instcmd=mkdir 11150276Speter fi 11250276Speterelse 11350276Speter 11450276Speter# Waiting for this to be detected by the "$instcmd $src $dsttmp" command 11550276Speter# might cause directories to be created, which would be especially bad 11650276Speter# if $src (and thus $dsttmp) contains '*'. 11750276Speter 11850276Speter if [ -f $src -o -d $src ] 11950276Speter then 12050276Speter true 12150276Speter else 12250276Speter echo "install: $src does not exist" 12350276Speter exit 1 12450276Speter fi 12550276Speter 12650276Speter if [ x"$dst" = x ] 12750276Speter then 12850276Speter echo "install: no destination specified" 12950276Speter exit 1 13050276Speter else 13150276Speter true 13250276Speter fi 13350276Speter 13450276Speter# If destination is a directory, append the input filename; if your system 13550276Speter# does not like double slashes in filenames, you may need to add some logic 13650276Speter 13750276Speter if [ -d $dst ] 13850276Speter then 13950276Speter dst="$dst"/`basename $src` 14050276Speter else 14150276Speter true 14250276Speter fi 14350276Speterfi 14450276Speter 14550276Speter## this sed command emulates the dirname command 14650276Speterdstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` 14750276Speter 14850276Speter# Make sure that the destination directory exists. 14950276Speter# this part is taken from Noah Friedman's mkinstalldirs script 15050276Speter 15150276Speter# Skip lots of stat calls in the usual case. 15250276Speterif [ ! -d "$dstdir" ]; then 15350276SpeterdefaultIFS=' 15450276Speter' 15550276SpeterIFS="${IFS-${defaultIFS}}" 15650276Speter 15750276SpeteroIFS="${IFS}" 15850276Speter# Some sh's can't handle IFS=/ for some reason. 15950276SpeterIFS='%' 16050276Speterset - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` 16150276SpeterIFS="${oIFS}" 16250276Speter 16350276Speterpathcomp='' 16450276Speter 16550276Speterwhile [ $# -ne 0 ] ; do 16650276Speter pathcomp="${pathcomp}${1}" 16750276Speter shift 16850276Speter 16950276Speter if [ ! -d "${pathcomp}" ] ; 17050276Speter then 17150276Speter $mkdirprog "${pathcomp}" 17250276Speter else 17350276Speter true 17450276Speter fi 17550276Speter 17650276Speter pathcomp="${pathcomp}/" 17750276Speterdone 17850276Speterfi 17950276Speter 18050276Speterif [ x"$dir_arg" != x ] 18150276Speterthen 18250276Speter $doit $instcmd $dst && 18350276Speter 18450276Speter if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && 18550276Speter if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && 18650276Speter if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && 18750276Speter if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi 18850276Speterelse 18950276Speter 19050276Speter# If we're going to rename the final executable, determine the name now. 19150276Speter 19250276Speter if [ x"$transformarg" = x ] 19350276Speter then 19450276Speter dstfile=`basename $dst` 19550276Speter else 19650276Speter dstfile=`basename $dst $transformbasename | 19750276Speter sed $transformarg`$transformbasename 19850276Speter fi 19950276Speter 20050276Speter# don't allow the sed command to completely eliminate the filename 20150276Speter 20250276Speter if [ x"$dstfile" = x ] 20350276Speter then 20450276Speter dstfile=`basename $dst` 20550276Speter else 20650276Speter true 20750276Speter fi 20850276Speter 20950276Speter# Make a temp file name in the proper directory. 21050276Speter 21150276Speter dsttmp=$dstdir/#inst.$$# 21250276Speter 21350276Speter# Move or copy the file name to the temp name 21450276Speter 21550276Speter $doit $instcmd $src $dsttmp && 21650276Speter 21750276Speter trap "rm -f ${dsttmp}" 0 && 21850276Speter 21950276Speter# and set any options; do chmod last to preserve setuid bits 22050276Speter 22150276Speter# If any of these fail, we abort the whole thing. If we want to 22250276Speter# ignore errors from any of these, just make sure not to ignore 22350276Speter# errors from the above "$doit $instcmd $src $dsttmp" command. 22450276Speter 22550276Speter if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && 22650276Speter if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && 22750276Speter if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && 22850276Speter if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && 22950276Speter 23050276Speter# Now rename the file to the real destination. 23150276Speter 23250276Speter $doit $rmcmd -f $dstdir/$dstfile && 23350276Speter $doit $mvcmd $dsttmp $dstdir/$dstfile 23450276Speter 23550276Speterfi && 23650276Speter 23750276Speter 23850276Speterexit 0 239