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