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