14edb46e9SPaul Traina#! /bin/sh 24edb46e9SPaul Traina# 34edb46e9SPaul Traina# install - install a program, script, or datafile 44edb46e9SPaul Traina# This comes from X11R5. 54edb46e9SPaul Traina# 64edb46e9SPaul Traina# Calling this script install-sh is preferred over install.sh, to prevent 74edb46e9SPaul Traina# `make' implicit rules from creating a file called install from it 84edb46e9SPaul Traina# when there is no Makefile. 94edb46e9SPaul Traina# 104edb46e9SPaul Traina# This script is compatible with the BSD install script, but was written 114edb46e9SPaul Traina# from scratch. 124edb46e9SPaul Traina# 134edb46e9SPaul Traina 144edb46e9SPaul Traina 154edb46e9SPaul Traina# set DOITPROG to echo to test this script 164edb46e9SPaul Traina 174edb46e9SPaul Traina# Don't use :- since 4.3BSD and earlier shells don't like it. 184edb46e9SPaul Trainadoit="${DOITPROG-}" 194edb46e9SPaul Traina 204edb46e9SPaul Traina 214edb46e9SPaul Traina# put in absolute paths if you don't have them in your path; or use env. vars. 224edb46e9SPaul Traina 234edb46e9SPaul Trainamvprog="${MVPROG-mv}" 244edb46e9SPaul Trainacpprog="${CPPROG-cp}" 254edb46e9SPaul Trainachmodprog="${CHMODPROG-chmod}" 264edb46e9SPaul Trainachownprog="${CHOWNPROG-chown}" 274edb46e9SPaul Trainachgrpprog="${CHGRPPROG-chgrp}" 284edb46e9SPaul Trainastripprog="${STRIPPROG-strip}" 294edb46e9SPaul Trainarmprog="${RMPROG-rm}" 304edb46e9SPaul Trainamkdirprog="${MKDIRPROG-mkdir}" 314edb46e9SPaul Traina 324edb46e9SPaul Trainatransformbasename="" 334edb46e9SPaul Trainatransform_arg="" 344edb46e9SPaul Trainainstcmd="$mvprog" 354edb46e9SPaul Trainachmodcmd="$chmodprog 0755" 364edb46e9SPaul Trainachowncmd="" 374edb46e9SPaul Trainachgrpcmd="" 384edb46e9SPaul Trainastripcmd="" 394edb46e9SPaul Trainarmcmd="$rmprog -f" 404edb46e9SPaul Trainamvcmd="$mvprog" 414edb46e9SPaul Trainasrc="" 424edb46e9SPaul Trainadst="" 434edb46e9SPaul Trainadir_arg="" 444edb46e9SPaul Traina 454edb46e9SPaul Trainawhile [ x"$1" != x ]; do 464edb46e9SPaul Traina case $1 in 474edb46e9SPaul Traina -c) instcmd="$cpprog" 484edb46e9SPaul Traina shift 494edb46e9SPaul Traina continue;; 504edb46e9SPaul Traina 514edb46e9SPaul Traina -d) dir_arg=true 524edb46e9SPaul Traina shift 534edb46e9SPaul Traina continue;; 544edb46e9SPaul Traina 554edb46e9SPaul Traina -m) chmodcmd="$chmodprog $2" 564edb46e9SPaul Traina shift 574edb46e9SPaul Traina shift 584edb46e9SPaul Traina continue;; 594edb46e9SPaul Traina 604edb46e9SPaul Traina -o) chowncmd="$chownprog $2" 614edb46e9SPaul Traina shift 624edb46e9SPaul Traina shift 634edb46e9SPaul Traina continue;; 644edb46e9SPaul Traina 654edb46e9SPaul Traina -g) chgrpcmd="$chgrpprog $2" 664edb46e9SPaul Traina shift 674edb46e9SPaul Traina shift 684edb46e9SPaul Traina continue;; 694edb46e9SPaul Traina 704edb46e9SPaul Traina -s) stripcmd="$stripprog" 714edb46e9SPaul Traina shift 724edb46e9SPaul Traina continue;; 734edb46e9SPaul Traina 744edb46e9SPaul Traina -t=*) transformarg=`echo $1 | sed 's/-t=//'` 754edb46e9SPaul Traina shift 764edb46e9SPaul Traina continue;; 774edb46e9SPaul Traina 784edb46e9SPaul Traina -b=*) transformbasename=`echo $1 | sed 's/-b=//'` 794edb46e9SPaul Traina shift 804edb46e9SPaul Traina continue;; 814edb46e9SPaul Traina 824edb46e9SPaul Traina *) if [ x"$src" = x ] 834edb46e9SPaul Traina then 844edb46e9SPaul Traina src=$1 854edb46e9SPaul Traina else 864edb46e9SPaul Traina # this colon is to work around a 386BSD /bin/sh bug 874edb46e9SPaul Traina : 884edb46e9SPaul Traina dst=$1 894edb46e9SPaul Traina fi 904edb46e9SPaul Traina shift 914edb46e9SPaul Traina continue;; 924edb46e9SPaul Traina esac 934edb46e9SPaul Trainadone 944edb46e9SPaul Traina 954edb46e9SPaul Trainaif [ x"$src" = x ] 964edb46e9SPaul Trainathen 974edb46e9SPaul Traina echo "install: no input file specified" 984edb46e9SPaul Traina exit 1 994edb46e9SPaul Trainaelse 1004edb46e9SPaul Traina true 1014edb46e9SPaul Trainafi 1024edb46e9SPaul Traina 1034edb46e9SPaul Trainaif [ x"$dir_arg" != x ]; then 1044edb46e9SPaul Traina dst=$src 1054edb46e9SPaul Traina src="" 1064edb46e9SPaul Traina 1074edb46e9SPaul Traina if [ -d $dst ]; then 1084edb46e9SPaul Traina instcmd=: 1094edb46e9SPaul Traina else 1104edb46e9SPaul Traina instcmd=mkdir 1114edb46e9SPaul Traina fi 1124edb46e9SPaul Trainaelse 1134edb46e9SPaul Traina 1144edb46e9SPaul Traina# Waiting for this to be detected by the "$instcmd $src $dsttmp" command 1154edb46e9SPaul Traina# might cause directories to be created, which would be especially bad 1164edb46e9SPaul Traina# if $src (and thus $dsttmp) contains '*'. 1174edb46e9SPaul Traina 1184edb46e9SPaul Traina if [ -f $src -o -d $src ] 1194edb46e9SPaul Traina then 1204edb46e9SPaul Traina true 1214edb46e9SPaul Traina else 1224edb46e9SPaul Traina echo "install: $src does not exist" 1234edb46e9SPaul Traina exit 1 1244edb46e9SPaul Traina fi 1254edb46e9SPaul Traina 1264edb46e9SPaul Traina if [ x"$dst" = x ] 1274edb46e9SPaul Traina then 1284edb46e9SPaul Traina echo "install: no destination specified" 1294edb46e9SPaul Traina exit 1 1304edb46e9SPaul Traina else 1314edb46e9SPaul Traina true 1324edb46e9SPaul Traina fi 1334edb46e9SPaul Traina 1344edb46e9SPaul Traina# If destination is a directory, append the input filename; if your system 1354edb46e9SPaul Traina# does not like double slashes in filenames, you may need to add some logic 1364edb46e9SPaul Traina 1374edb46e9SPaul Traina if [ -d $dst ] 1384edb46e9SPaul Traina then 1394edb46e9SPaul Traina dst="$dst"/`basename $src` 1404edb46e9SPaul Traina else 1414edb46e9SPaul Traina true 1424edb46e9SPaul Traina fi 1434edb46e9SPaul Trainafi 1444edb46e9SPaul Traina 1454edb46e9SPaul Traina## this sed command emulates the dirname command 1464edb46e9SPaul Trainadstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` 1474edb46e9SPaul Traina 1484edb46e9SPaul Traina# Make sure that the destination directory exists. 1494edb46e9SPaul Traina# this part is taken from Noah Friedman's mkinstalldirs script 1504edb46e9SPaul Traina 1514edb46e9SPaul Traina# Skip lots of stat calls in the usual case. 1524edb46e9SPaul Trainaif [ ! -d "$dstdir" ]; then 1534edb46e9SPaul TrainadefaultIFS=' 1544edb46e9SPaul Traina' 1554edb46e9SPaul TrainaIFS="${IFS-${defaultIFS}}" 1564edb46e9SPaul Traina 1574edb46e9SPaul TrainaoIFS="${IFS}" 1584edb46e9SPaul Traina# Some sh's can't handle IFS=/ for some reason. 1594edb46e9SPaul TrainaIFS='%' 1604edb46e9SPaul Trainaset - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` 1614edb46e9SPaul TrainaIFS="${oIFS}" 1624edb46e9SPaul Traina 1634edb46e9SPaul Trainapathcomp='' 1644edb46e9SPaul Traina 1654edb46e9SPaul Trainawhile [ $# -ne 0 ] ; do 1664edb46e9SPaul Traina pathcomp="${pathcomp}${1}" 1674edb46e9SPaul Traina shift 1684edb46e9SPaul Traina 1694edb46e9SPaul Traina if [ ! -d "${pathcomp}" ] ; 1704edb46e9SPaul Traina then 1714edb46e9SPaul Traina $mkdirprog "${pathcomp}" 1724edb46e9SPaul Traina else 1734edb46e9SPaul Traina true 1744edb46e9SPaul Traina fi 1754edb46e9SPaul Traina 1764edb46e9SPaul Traina pathcomp="${pathcomp}/" 1774edb46e9SPaul Trainadone 1784edb46e9SPaul Trainafi 1794edb46e9SPaul Traina 1804edb46e9SPaul Trainaif [ x"$dir_arg" != x ] 1814edb46e9SPaul Trainathen 1824edb46e9SPaul Traina $doit $instcmd $dst && 1834edb46e9SPaul Traina 1844edb46e9SPaul Traina if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && 1854edb46e9SPaul Traina if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && 1864edb46e9SPaul Traina if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && 1874edb46e9SPaul Traina if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi 1884edb46e9SPaul Trainaelse 1894edb46e9SPaul Traina 1904edb46e9SPaul Traina# If we're going to rename the final executable, determine the name now. 1914edb46e9SPaul Traina 1924edb46e9SPaul Traina if [ x"$transformarg" = x ] 1934edb46e9SPaul Traina then 1944edb46e9SPaul Traina dstfile=`basename $dst` 1954edb46e9SPaul Traina else 1964edb46e9SPaul Traina dstfile=`basename $dst $transformbasename | 1974edb46e9SPaul Traina sed $transformarg`$transformbasename 1984edb46e9SPaul Traina fi 1994edb46e9SPaul Traina 2004edb46e9SPaul Traina# don't allow the sed command to completely eliminate the filename 2014edb46e9SPaul Traina 2024edb46e9SPaul Traina if [ x"$dstfile" = x ] 2034edb46e9SPaul Traina then 2044edb46e9SPaul Traina dstfile=`basename $dst` 2054edb46e9SPaul Traina else 2064edb46e9SPaul Traina true 2074edb46e9SPaul Traina fi 2084edb46e9SPaul Traina 2094edb46e9SPaul Traina# Make a temp file name in the proper directory. 2104edb46e9SPaul Traina 2114edb46e9SPaul Traina dsttmp=$dstdir/#inst.$$# 2124edb46e9SPaul Traina 2134edb46e9SPaul Traina# Move or copy the file name to the temp name 2144edb46e9SPaul Traina 2154edb46e9SPaul Traina $doit $instcmd $src $dsttmp && 2164edb46e9SPaul Traina 2174edb46e9SPaul Traina trap "rm -f ${dsttmp}" 0 && 2184edb46e9SPaul Traina 2194edb46e9SPaul Traina# and set any options; do chmod last to preserve setuid bits 2204edb46e9SPaul Traina 2214edb46e9SPaul Traina# If any of these fail, we abort the whole thing. If we want to 2224edb46e9SPaul Traina# ignore errors from any of these, just make sure not to ignore 2234edb46e9SPaul Traina# errors from the above "$doit $instcmd $src $dsttmp" command. 2244edb46e9SPaul Traina 2254edb46e9SPaul Traina if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && 2264edb46e9SPaul Traina if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && 2274edb46e9SPaul Traina if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && 2284edb46e9SPaul Traina if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && 2294edb46e9SPaul Traina 2304edb46e9SPaul Traina# Now rename the file to the real destination. 2314edb46e9SPaul Traina 2324edb46e9SPaul Traina $doit $rmcmd -f $dstdir/$dstfile && 2334edb46e9SPaul Traina $doit $mvcmd $dsttmp $dstdir/$dstfile 2344edb46e9SPaul Traina 2354edb46e9SPaul Trainafi && 2364edb46e9SPaul Traina 2374edb46e9SPaul Traina 2384edb46e9SPaul Trainaexit 0 239