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