install-sh revision 166124
150276Speter#! /bin/sh
250276Speter#
350276Speter# install - install a program, script, or datafile
462449Speter# This comes from X11R5 (mit/util/scripts/install.sh).
550276Speter#
662449Speter# Copyright 1991 by the Massachusetts Institute of Technology
762449Speter#
862449Speter# Permission to use, copy, modify, distribute, and sell this software and its
962449Speter# documentation for any purpose is hereby granted without fee, provided that
1062449Speter# the above copyright notice appear in all copies and that both that
1162449Speter# copyright notice and this permission notice appear in supporting
1262449Speter# documentation, and that the name of M.I.T. not be used in advertising or
1362449Speter# publicity pertaining to distribution of the software without specific,
1462449Speter# written prior permission.  M.I.T. makes no representations about the
1562449Speter# suitability of this software for any purpose.  It is provided "as is"
1662449Speter# without express or implied warranty.
1762449Speter#
1850276Speter# Calling this script install-sh is preferred over install.sh, to prevent
1950276Speter# `make' implicit rules from creating a file called install from it
2050276Speter# when there is no Makefile.
2150276Speter#
2250276Speter# This script is compatible with the BSD install script, but was written
2362449Speter# from scratch.  It can only install one file at a time, a restriction
2462449Speter# shared with many OS's install programs.
2550276Speter
2650276Speter
2750276Speter# set DOITPROG to echo to test this script
2850276Speter
2950276Speter# Don't use :- since 4.3BSD and earlier shells don't like it.
3050276Speterdoit="${DOITPROG-}"
3150276Speter
3250276Speter
3350276Speter# put in absolute paths if you don't have them in your path; or use env. vars.
3450276Speter
3550276Spetermvprog="${MVPROG-mv}"
3650276Spetercpprog="${CPPROG-cp}"
3750276Speterchmodprog="${CHMODPROG-chmod}"
3850276Speterchownprog="${CHOWNPROG-chown}"
3950276Speterchgrpprog="${CHGRPPROG-chgrp}"
4050276Speterstripprog="${STRIPPROG-strip}"
4150276Speterrmprog="${RMPROG-rm}"
4250276Spetermkdirprog="${MKDIRPROG-mkdir}"
4350276Speter
4462449Spetertransformbasename=""
4550276Spetertransform_arg=""
4650276Speterinstcmd="$mvprog"
4750276Speterchmodcmd="$chmodprog 0755"
4850276Speterchowncmd=""
4950276Speterchgrpcmd=""
5050276Speterstripcmd=""
5150276Speterrmcmd="$rmprog -f"
5250276Spetermvcmd="$mvprog"
5350276Spetersrc=""
5450276Speterdst=""
5550276Speterdir_arg=""
5650276Speter
5750276Speterwhile [ x"$1" != x ]; do
5850276Speter    case $1 in
5950276Speter	-c) instcmd="$cpprog"
6050276Speter	    shift
6150276Speter	    continue;;
6250276Speter
6350276Speter	-d) dir_arg=true
6450276Speter	    shift
6550276Speter	    continue;;
6650276Speter
6750276Speter	-m) chmodcmd="$chmodprog $2"
6850276Speter	    shift
6950276Speter	    shift
7050276Speter	    continue;;
7150276Speter
7250276Speter	-o) chowncmd="$chownprog $2"
7350276Speter	    shift
7450276Speter	    shift
7550276Speter	    continue;;
7650276Speter
7750276Speter	-g) chgrpcmd="$chgrpprog $2"
7850276Speter	    shift
7950276Speter	    shift
8050276Speter	    continue;;
8150276Speter
8250276Speter	-s) stripcmd="$stripprog"
8350276Speter	    shift
8450276Speter	    continue;;
8550276Speter
8650276Speter	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
8750276Speter	    shift
8850276Speter	    continue;;
8950276Speter
9050276Speter	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
9150276Speter	    shift
9250276Speter	    continue;;
9350276Speter
9450276Speter	*)  if [ x"$src" = x ]
9550276Speter	    then
9650276Speter		src=$1
9750276Speter	    else
9850276Speter		# this colon is to work around a 386BSD /bin/sh bug
9950276Speter		:
10050276Speter		dst=$1
10150276Speter	    fi
10250276Speter	    shift
10350276Speter	    continue;;
10450276Speter    esac
10550276Speterdone
10650276Speter
10750276Speterif [ x"$src" = x ]
10850276Speterthen
10950276Speter	echo "install:	no input file specified"
11050276Speter	exit 1
11150276Speterelse
112166124Srafan	:
11350276Speterfi
11450276Speter
11550276Speterif [ x"$dir_arg" != x ]; then
11650276Speter	dst=$src
11750276Speter	src=""
118166124Srafan
11950276Speter	if [ -d $dst ]; then
12050276Speter		instcmd=:
121166124Srafan		chmodcmd=""
12250276Speter	else
123166124Srafan		instcmd=$mkdirprog
12450276Speter	fi
12550276Speterelse
12650276Speter
12750276Speter# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
128166124Srafan# might cause directories to be created, which would be especially bad
12950276Speter# if $src (and thus $dsttmp) contains '*'.
13050276Speter
13150276Speter	if [ -f $src -o -d $src ]
13250276Speter	then
133166124Srafan		:
13450276Speter	else
13550276Speter		echo "install:  $src does not exist"
13650276Speter		exit 1
13750276Speter	fi
138166124Srafan
13950276Speter	if [ x"$dst" = x ]
14050276Speter	then
14150276Speter		echo "install:	no destination specified"
14250276Speter		exit 1
14350276Speter	else
144166124Srafan		:
14550276Speter	fi
14650276Speter
14750276Speter# If destination is a directory, append the input filename; if your system
14850276Speter# does not like double slashes in filenames, you may need to add some logic
14950276Speter
15050276Speter	if [ -d $dst ]
15150276Speter	then
15250276Speter		dst="$dst"/`basename $src`
15350276Speter	else
154166124Srafan		:
15550276Speter	fi
15650276Speterfi
15750276Speter
15850276Speter## this sed command emulates the dirname command
15950276Speterdstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
16050276Speter
16150276Speter# Make sure that the destination directory exists.
16250276Speter#  this part is taken from Noah Friedman's mkinstalldirs script
16350276Speter
16450276Speter# Skip lots of stat calls in the usual case.
16550276Speterif [ ! -d "$dstdir" ]; then
166166124SrafandefaultIFS='
167166124Srafan	'
16850276SpeterIFS="${IFS-${defaultIFS}}"
16950276Speter
17050276SpeteroIFS="${IFS}"
17150276Speter# Some sh's can't handle IFS=/ for some reason.
17250276SpeterIFS='%'
17350276Speterset - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
17450276SpeterIFS="${oIFS}"
17550276Speter
17650276Speterpathcomp=''
17750276Speter
17850276Speterwhile [ $# -ne 0 ] ; do
17950276Speter	pathcomp="${pathcomp}${1}"
18050276Speter	shift
18150276Speter
18250276Speter	if [ ! -d "${pathcomp}" ] ;
18350276Speter        then
18450276Speter		$mkdirprog "${pathcomp}"
18550276Speter	else
186166124Srafan		:
18750276Speter	fi
18850276Speter
18950276Speter	pathcomp="${pathcomp}/"
19050276Speterdone
19150276Speterfi
19250276Speter
19350276Speterif [ x"$dir_arg" != x ]
19450276Speterthen
19550276Speter	$doit $instcmd $dst &&
19650276Speter
197166124Srafan	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi &&
198166124Srafan	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi &&
199166124Srafan	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi &&
200166124Srafan	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi
20150276Speterelse
20250276Speter
20350276Speter# If we're going to rename the final executable, determine the name now.
20450276Speter
205166124Srafan	if [ x"$transformarg" = x ]
20650276Speter	then
20750276Speter		dstfile=`basename $dst`
20850276Speter	else
209166124Srafan		dstfile=`basename $dst $transformbasename |
21050276Speter			sed $transformarg`$transformbasename
21150276Speter	fi
21250276Speter
21350276Speter# don't allow the sed command to completely eliminate the filename
21450276Speter
215166124Srafan	if [ x"$dstfile" = x ]
21650276Speter	then
21750276Speter		dstfile=`basename $dst`
21850276Speter	else
219166124Srafan		:
22050276Speter	fi
22150276Speter
22250276Speter# Make a temp file name in the proper directory.
22350276Speter
22450276Speter	dsttmp=$dstdir/#inst.$$#
22550276Speter
22650276Speter# Move or copy the file name to the temp name
22750276Speter
22850276Speter	$doit $instcmd $src $dsttmp &&
22950276Speter
23050276Speter	trap "rm -f ${dsttmp}" 0 &&
23150276Speter
23250276Speter# and set any options; do chmod last to preserve setuid bits
23350276Speter
23450276Speter# If any of these fail, we abort the whole thing.  If we want to
23550276Speter# ignore errors from any of these, just make sure not to ignore
23650276Speter# errors from the above "$doit $instcmd $src $dsttmp" command.
23750276Speter
238166124Srafan	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi &&
239166124Srafan	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi &&
240166124Srafan	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi &&
241166124Srafan	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi &&
24250276Speter
24350276Speter# Now rename the file to the real destination.
24450276Speter
24550276Speter	$doit $rmcmd -f $dstdir/$dstfile &&
246166124Srafan	$doit $mvcmd $dsttmp $dstdir/$dstfile
24750276Speter
24850276Speterfi &&
24950276Speter
25050276Speter
25150276Speterexit 0
252