1#!/bin/sh 2# 3# install - install a program, script, or datafile 4# This comes from X11R5. 5# 6# $XConsortium: install.sh,v 1.2 89/12/18 14:47:22 jim Exp $ 7# 8# This script is compatible with the BSD install script, but was written 9# from scratch. 10# 11 12 13# set DOITPROG to echo to test this script 14 15# Don't use :- since 4.3BSD and earlier shells don't like it. 16doit="${DOITPROG-}" 17 18 19# put in absolute paths if you don't have them in your path; or use env. vars. 20 21mvprog="${MVPROG-mv}" 22cpprog="${CPPROG-cp}" 23chmodprog="${CHMODPROG-chmod}" 24chownprog="${CHOWNPROG-chown}" 25chgrpprog="${CHGRPPROG-chgrp}" 26stripprog="${STRIPPROG-strip}" 27rmprog="${RMPROG-rm}" 28mkdirprog="${MKDIRPROG-mkdir}" 29 30tranformbasename="" 31transform_arg="" 32instcmd="$mvprog" 33chmodcmd="$chmodprog 0755" 34chowncmd="" 35chgrpcmd="" 36stripcmd="" 37rmcmd="$rmprog -f" 38mvcmd="$mvprog" 39src="" 40dst="" 41dir_arg="" 42 43while [ x"$1" != x ]; do 44 case $1 in 45 -c) instcmd="$cpprog" 46 shift 47 continue;; 48 49 -d) dir_arg=true 50 shift 51 continue;; 52 53 -m) chmodcmd="$chmodprog $2" 54 shift 55 shift 56 continue;; 57 58 -o) chowncmd="$chownprog $2" 59 shift 60 shift 61 continue;; 62 63 -g) chgrpcmd="$chgrpprog $2" 64 shift 65 shift 66 continue;; 67 68 -s) stripcmd="$stripprog" 69 shift 70 continue;; 71 72 -t=*) transformarg=`echo $1 | sed 's/-t=//'` 73 shift 74 continue;; 75 76 -b=*) transformbasename=`echo $1 | sed 's/-b=//'` 77 shift 78 continue;; 79 80 *) if [ x"$src" = x ] 81 then 82 src=$1 83 else 84 # this colon is to work around a 386BSD /bin/sh bug 85 : 86 dst=$1 87 fi 88 shift 89 continue;; 90 esac 91done 92 93if [ x"$src" = x ] 94then 95 echo "install: no input file specified" 96 exit 1 97else 98 true 99fi 100 101if [ x"$dir_arg" != x ]; then 102 dst=$src 103 src="" 104 105 if [ -d $dst ]; then 106 instcmd=: 107 else 108 instcmd=mkdir 109 fi 110else 111 112# Waiting for this to be detected by the "$instcmd $src $dsttmp" command 113# might cause directories to be created, which would be especially bad 114# if $src (and thus $dsttmp) contains '*'. 115 116 if [ -f $src -o -d $src ] 117 then 118 true 119 else 120 echo "install: $src does not exist" 121 exit 1 122 fi 123 124 if [ x"$dst" = x ] 125 then 126 echo "install: no destination specified" 127 exit 1 128 else 129 true 130 fi 131 132# If destination is a directory, append the input filename; if your system 133# does not like double slashes in filenames, you may need to add some logic 134 135 if [ -d $dst ] 136 then 137 dst="$dst"/`basename $src` 138 else 139 true 140 fi 141fi 142 143## this sed command emulates the dirname command 144dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` 145 146# Make sure that the destination directory exists. 147# this part is taken from Noah Friedman's mkinstalldirs script 148 149# Skip lots of stat calls in the usual case. 150if [ ! -d "$dstdir" ]; then 151defaultIFS=' 152' 153IFS="${IFS-${defaultIFS}}" 154 155oIFS="${IFS}" 156# Some sh's can't handle IFS=/ for some reason. 157IFS='%' 158set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` 159IFS="${oIFS}" 160 161pathcomp='' 162 163while [ $# -ne 0 ] ; do 164 pathcomp="${pathcomp}${1}" 165 shift 166 167 if [ ! -d "${pathcomp}" ] ; 168 then 169 $mkdirprog "${pathcomp}" 170 else 171 true 172 fi 173 174 pathcomp="${pathcomp}/" 175done 176fi 177 178if [ x"$dir_arg" != x ] 179then 180 $doit $instcmd $dst && 181 182 if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && 183 if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && 184 if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && 185 if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi 186else 187 188# If we're going to rename the final executable, determine the name now. 189 190 if [ x"$transformarg" = x ] 191 then 192 dstfile=`basename $dst` 193 else 194 dstfile=`basename $dst $transformbasename | 195 sed $transformarg`$transformbasename 196 fi 197 198# don't allow the sed command to completely eliminate the filename 199 200 if [ x"$dstfile" = x ] 201 then 202 dstfile=`basename $dst` 203 else 204 true 205 fi 206 207# Make a temp file name in the proper directory. 208 209 dsttmp=$dstdir/#inst.$$# 210 211# Move or copy the file name to the temp name 212 213 $doit $instcmd $src $dsttmp && 214 215 trap "rm -f ${dsttmp}" 0 && 216 217# and set any options; do chmod last to preserve setuid bits 218 219# If any of these fail, we abort the whole thing. If we want to 220# ignore errors from any of these, just make sure not to ignore 221# errors from the above "$doit $instcmd $src $dsttmp" command. 222 223 if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && 224 if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && 225 if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && 226 if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && 227 228# Now rename the file to the real destination. 229 230 $doit $rmcmd -f $dstdir/$dstfile && 231 $doit $mvcmd $dsttmp $dstdir/$dstfile 232 233fi && 234 235 236exit 0 237