xref: /freebsd/contrib/ncurses/install-sh (revision 0e3d540892016a47f6a68ec9ba2879d35ce5f7c2)
10e3d5408SPeter Wemm#! /bin/sh
20e3d5408SPeter Wemm#
30e3d5408SPeter Wemm# install - install a program, script, or datafile
40e3d5408SPeter Wemm# This comes from X11R5.
50e3d5408SPeter Wemm#
60e3d5408SPeter Wemm# Calling this script install-sh is preferred over install.sh, to prevent
70e3d5408SPeter Wemm# `make' implicit rules from creating a file called install from it
80e3d5408SPeter Wemm# when there is no Makefile.
90e3d5408SPeter Wemm#
100e3d5408SPeter Wemm# This script is compatible with the BSD install script, but was written
110e3d5408SPeter Wemm# from scratch.
120e3d5408SPeter Wemm#
130e3d5408SPeter Wemm
140e3d5408SPeter Wemm
150e3d5408SPeter Wemm# set DOITPROG to echo to test this script
160e3d5408SPeter Wemm
170e3d5408SPeter Wemm# Don't use :- since 4.3BSD and earlier shells don't like it.
180e3d5408SPeter Wemmdoit="${DOITPROG-}"
190e3d5408SPeter Wemm
200e3d5408SPeter Wemm
210e3d5408SPeter Wemm# put in absolute paths if you don't have them in your path; or use env. vars.
220e3d5408SPeter Wemm
230e3d5408SPeter Wemmmvprog="${MVPROG-mv}"
240e3d5408SPeter Wemmcpprog="${CPPROG-cp}"
250e3d5408SPeter Wemmchmodprog="${CHMODPROG-chmod}"
260e3d5408SPeter Wemmchownprog="${CHOWNPROG-chown}"
270e3d5408SPeter Wemmchgrpprog="${CHGRPPROG-chgrp}"
280e3d5408SPeter Wemmstripprog="${STRIPPROG-strip}"
290e3d5408SPeter Wemmrmprog="${RMPROG-rm}"
300e3d5408SPeter Wemmmkdirprog="${MKDIRPROG-mkdir}"
310e3d5408SPeter Wemm
320e3d5408SPeter Wemmtranformbasename=""
330e3d5408SPeter Wemmtransform_arg=""
340e3d5408SPeter Wemminstcmd="$mvprog"
350e3d5408SPeter Wemmchmodcmd="$chmodprog 0755"
360e3d5408SPeter Wemmchowncmd=""
370e3d5408SPeter Wemmchgrpcmd=""
380e3d5408SPeter Wemmstripcmd=""
390e3d5408SPeter Wemmrmcmd="$rmprog -f"
400e3d5408SPeter Wemmmvcmd="$mvprog"
410e3d5408SPeter Wemmsrc=""
420e3d5408SPeter Wemmdst=""
430e3d5408SPeter Wemmdir_arg=""
440e3d5408SPeter Wemm
450e3d5408SPeter Wemmwhile [ x"$1" != x ]; do
460e3d5408SPeter Wemm    case $1 in
470e3d5408SPeter Wemm	-c) instcmd="$cpprog"
480e3d5408SPeter Wemm	    shift
490e3d5408SPeter Wemm	    continue;;
500e3d5408SPeter Wemm
510e3d5408SPeter Wemm	-d) dir_arg=true
520e3d5408SPeter Wemm	    shift
530e3d5408SPeter Wemm	    continue;;
540e3d5408SPeter Wemm
550e3d5408SPeter Wemm	-m) chmodcmd="$chmodprog $2"
560e3d5408SPeter Wemm	    shift
570e3d5408SPeter Wemm	    shift
580e3d5408SPeter Wemm	    continue;;
590e3d5408SPeter Wemm
600e3d5408SPeter Wemm	-o) chowncmd="$chownprog $2"
610e3d5408SPeter Wemm	    shift
620e3d5408SPeter Wemm	    shift
630e3d5408SPeter Wemm	    continue;;
640e3d5408SPeter Wemm
650e3d5408SPeter Wemm	-g) chgrpcmd="$chgrpprog $2"
660e3d5408SPeter Wemm	    shift
670e3d5408SPeter Wemm	    shift
680e3d5408SPeter Wemm	    continue;;
690e3d5408SPeter Wemm
700e3d5408SPeter Wemm	-s) stripcmd="$stripprog"
710e3d5408SPeter Wemm	    shift
720e3d5408SPeter Wemm	    continue;;
730e3d5408SPeter Wemm
740e3d5408SPeter Wemm	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
750e3d5408SPeter Wemm	    shift
760e3d5408SPeter Wemm	    continue;;
770e3d5408SPeter Wemm
780e3d5408SPeter Wemm	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
790e3d5408SPeter Wemm	    shift
800e3d5408SPeter Wemm	    continue;;
810e3d5408SPeter Wemm
820e3d5408SPeter Wemm	*)  if [ x"$src" = x ]
830e3d5408SPeter Wemm	    then
840e3d5408SPeter Wemm		src=$1
850e3d5408SPeter Wemm	    else
860e3d5408SPeter Wemm		# this colon is to work around a 386BSD /bin/sh bug
870e3d5408SPeter Wemm		:
880e3d5408SPeter Wemm		dst=$1
890e3d5408SPeter Wemm	    fi
900e3d5408SPeter Wemm	    shift
910e3d5408SPeter Wemm	    continue;;
920e3d5408SPeter Wemm    esac
930e3d5408SPeter Wemmdone
940e3d5408SPeter Wemm
950e3d5408SPeter Wemmif [ x"$src" = x ]
960e3d5408SPeter Wemmthen
970e3d5408SPeter Wemm	echo "install:	no input file specified"
980e3d5408SPeter Wemm	exit 1
990e3d5408SPeter Wemmelse
1000e3d5408SPeter Wemm	true
1010e3d5408SPeter Wemmfi
1020e3d5408SPeter Wemm
1030e3d5408SPeter Wemmif [ x"$dir_arg" != x ]; then
1040e3d5408SPeter Wemm	dst=$src
1050e3d5408SPeter Wemm	src=""
1060e3d5408SPeter Wemm
1070e3d5408SPeter Wemm	if [ -d $dst ]; then
1080e3d5408SPeter Wemm		instcmd=:
1090e3d5408SPeter Wemm	else
1100e3d5408SPeter Wemm		instcmd=mkdir
1110e3d5408SPeter Wemm	fi
1120e3d5408SPeter Wemmelse
1130e3d5408SPeter Wemm
1140e3d5408SPeter Wemm# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
1150e3d5408SPeter Wemm# might cause directories to be created, which would be especially bad
1160e3d5408SPeter Wemm# if $src (and thus $dsttmp) contains '*'.
1170e3d5408SPeter Wemm
1180e3d5408SPeter Wemm	if [ -f $src -o -d $src ]
1190e3d5408SPeter Wemm	then
1200e3d5408SPeter Wemm		true
1210e3d5408SPeter Wemm	else
1220e3d5408SPeter Wemm		echo "install:  $src does not exist"
1230e3d5408SPeter Wemm		exit 1
1240e3d5408SPeter Wemm	fi
1250e3d5408SPeter Wemm
1260e3d5408SPeter Wemm	if [ x"$dst" = x ]
1270e3d5408SPeter Wemm	then
1280e3d5408SPeter Wemm		echo "install:	no destination specified"
1290e3d5408SPeter Wemm		exit 1
1300e3d5408SPeter Wemm	else
1310e3d5408SPeter Wemm		true
1320e3d5408SPeter Wemm	fi
1330e3d5408SPeter Wemm
1340e3d5408SPeter Wemm# If destination is a directory, append the input filename; if your system
1350e3d5408SPeter Wemm# does not like double slashes in filenames, you may need to add some logic
1360e3d5408SPeter Wemm
1370e3d5408SPeter Wemm	if [ -d $dst ]
1380e3d5408SPeter Wemm	then
1390e3d5408SPeter Wemm		dst="$dst"/`basename $src`
1400e3d5408SPeter Wemm	else
1410e3d5408SPeter Wemm		true
1420e3d5408SPeter Wemm	fi
1430e3d5408SPeter Wemmfi
1440e3d5408SPeter Wemm
1450e3d5408SPeter Wemm## this sed command emulates the dirname command
1460e3d5408SPeter Wemmdstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
1470e3d5408SPeter Wemm
1480e3d5408SPeter Wemm# Make sure that the destination directory exists.
1490e3d5408SPeter Wemm#  this part is taken from Noah Friedman's mkinstalldirs script
1500e3d5408SPeter Wemm
1510e3d5408SPeter Wemm# Skip lots of stat calls in the usual case.
1520e3d5408SPeter Wemmif [ ! -d "$dstdir" ]; then
1530e3d5408SPeter WemmdefaultIFS='
1540e3d5408SPeter Wemm'
1550e3d5408SPeter WemmIFS="${IFS-${defaultIFS}}"
1560e3d5408SPeter Wemm
1570e3d5408SPeter WemmoIFS="${IFS}"
1580e3d5408SPeter Wemm# Some sh's can't handle IFS=/ for some reason.
1590e3d5408SPeter WemmIFS='%'
1600e3d5408SPeter Wemmset - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
1610e3d5408SPeter WemmIFS="${oIFS}"
1620e3d5408SPeter Wemm
1630e3d5408SPeter Wemmpathcomp=''
1640e3d5408SPeter Wemm
1650e3d5408SPeter Wemmwhile [ $# -ne 0 ] ; do
1660e3d5408SPeter Wemm	pathcomp="${pathcomp}${1}"
1670e3d5408SPeter Wemm	shift
1680e3d5408SPeter Wemm
1690e3d5408SPeter Wemm	if [ ! -d "${pathcomp}" ] ;
1700e3d5408SPeter Wemm        then
1710e3d5408SPeter Wemm		$mkdirprog "${pathcomp}"
1720e3d5408SPeter Wemm	else
1730e3d5408SPeter Wemm		true
1740e3d5408SPeter Wemm	fi
1750e3d5408SPeter Wemm
1760e3d5408SPeter Wemm	pathcomp="${pathcomp}/"
1770e3d5408SPeter Wemmdone
1780e3d5408SPeter Wemmfi
1790e3d5408SPeter Wemm
1800e3d5408SPeter Wemmif [ x"$dir_arg" != x ]
1810e3d5408SPeter Wemmthen
1820e3d5408SPeter Wemm	$doit $instcmd $dst &&
1830e3d5408SPeter Wemm
1840e3d5408SPeter Wemm	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
1850e3d5408SPeter Wemm	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
1860e3d5408SPeter Wemm	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
1870e3d5408SPeter Wemm	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
1880e3d5408SPeter Wemmelse
1890e3d5408SPeter Wemm
1900e3d5408SPeter Wemm# If we're going to rename the final executable, determine the name now.
1910e3d5408SPeter Wemm
1920e3d5408SPeter Wemm	if [ x"$transformarg" = x ]
1930e3d5408SPeter Wemm	then
1940e3d5408SPeter Wemm		dstfile=`basename $dst`
1950e3d5408SPeter Wemm	else
1960e3d5408SPeter Wemm		dstfile=`basename $dst $transformbasename |
1970e3d5408SPeter Wemm			sed $transformarg`$transformbasename
1980e3d5408SPeter Wemm	fi
1990e3d5408SPeter Wemm
2000e3d5408SPeter Wemm# don't allow the sed command to completely eliminate the filename
2010e3d5408SPeter Wemm
2020e3d5408SPeter Wemm	if [ x"$dstfile" = x ]
2030e3d5408SPeter Wemm	then
2040e3d5408SPeter Wemm		dstfile=`basename $dst`
2050e3d5408SPeter Wemm	else
2060e3d5408SPeter Wemm		true
2070e3d5408SPeter Wemm	fi
2080e3d5408SPeter Wemm
2090e3d5408SPeter Wemm# Make a temp file name in the proper directory.
2100e3d5408SPeter Wemm
2110e3d5408SPeter Wemm	dsttmp=$dstdir/#inst.$$#
2120e3d5408SPeter Wemm
2130e3d5408SPeter Wemm# Move or copy the file name to the temp name
2140e3d5408SPeter Wemm
2150e3d5408SPeter Wemm	$doit $instcmd $src $dsttmp &&
2160e3d5408SPeter Wemm
2170e3d5408SPeter Wemm	trap "rm -f ${dsttmp}" 0 &&
2180e3d5408SPeter Wemm
2190e3d5408SPeter Wemm# and set any options; do chmod last to preserve setuid bits
2200e3d5408SPeter Wemm
2210e3d5408SPeter Wemm# If any of these fail, we abort the whole thing.  If we want to
2220e3d5408SPeter Wemm# ignore errors from any of these, just make sure not to ignore
2230e3d5408SPeter Wemm# errors from the above "$doit $instcmd $src $dsttmp" command.
2240e3d5408SPeter Wemm
2250e3d5408SPeter Wemm	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
2260e3d5408SPeter Wemm	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
2270e3d5408SPeter Wemm	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
2280e3d5408SPeter Wemm	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
2290e3d5408SPeter Wemm
2300e3d5408SPeter Wemm# Now rename the file to the real destination.
2310e3d5408SPeter Wemm
2320e3d5408SPeter Wemm	$doit $rmcmd -f $dstdir/$dstfile &&
2330e3d5408SPeter Wemm	$doit $mvcmd $dsttmp $dstdir/$dstfile
2340e3d5408SPeter Wemm
2350e3d5408SPeter Wemmfi &&
2360e3d5408SPeter Wemm
2370e3d5408SPeter Wemm
2380e3d5408SPeter Wemmexit 0
239