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