]>
git.saurik.com Git - bison.git/blob - config/install-sh
   3 # install - install a program, script, or datafile 
   4 # This comes from X11R5 (mit/util/scripts/install.sh). 
   6 # Copyright 1991 by the Massachusetts Institute of Technology 
   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. 
  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. 
  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. 
  27 # set DOITPROG to echo to test this script 
  29 # Don't use :- since 4.3BSD and earlier shells don't like it. 
  33 # put in absolute paths if you don't have them in your path; or use env. vars. 
  37 chmodprog
="${CHMODPROG-chmod}" 
  38 chownprog
="${CHOWNPROG-chown}" 
  39 chgrpprog
="${CHGRPPROG-chgrp}" 
  40 stripprog
="${STRIPPROG-strip}" 
  42 mkdirprog
="${MKDIRPROG-mkdir}" 
  47 chmodcmd
="$chmodprog 0755" 
  57 while [ x
"$1" != x 
]; do 
  67         -m) chmodcmd
="$chmodprog $2" 
  72         -o) chowncmd
="$chownprog $2" 
  77         -g) chgrpcmd
="$chgrpprog $2" 
  82         -s) stripcmd
=$stripprog 
  86         -t=*) transformarg
=`echo $1 | sed 's/-t=//'` 
  90         -b=*) transformbasename
=`echo $1 | sed 's/-b=//'` 
  98                 # this colon is to work around a 386BSD /bin/sh bug 
 109         echo "$0: no input file specified" >&2 
 115 if [ x
"$dir_arg" != x 
]; then 
 119         if [ -d "$dst" ]; then 
 127 # Waiting for this to be detected by the "$instcmd $src $dsttmp" command 
 128 # might cause directories to be created, which would be especially bad 
 129 # if $src (and thus $dsttmp) contains '*'. 
 131         if [ -f "$src" ] || [ -d "$src" ] 
 135                 echo "$0: $src does not exist" >&2 
 141                 echo "$0: no destination specified" >&2 
 147 # If destination is a directory, append the input filename; if your system 
 148 # does not like double slashes in filenames, you may need to add some logic 
 152                 dst
=$dst/`basename "$src"` 
 158 ## this sed command emulates the dirname command 
 159 dstdir
=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` 
 161 # Make sure that the destination directory exists. 
 162 #  this part is taken from Noah Friedman's mkinstalldirs script 
 164 # Skip lots of stat calls in the usual case. 
 165 if [ ! -d "$dstdir" ]; then 
 168 IFS
="${IFS-$defaultIFS}" 
 171 # Some sh's can't handle IFS=/ for some reason. 
 173 set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` 
 178 while [ $# -ne 0 ] ; do 
 182         if [ ! -d "$pathcomp" ] ; 
 184                 $mkdirprog "$pathcomp" 
 193 if [ x
"$dir_arg" != x 
] 
 195         $doit $instcmd "$dst" && 
 197         if [ x
"$chowncmd" != x 
]; then $doit $chowncmd "$dst"; else : ; fi && 
 198         if [ x
"$chgrpcmd" != x 
]; then $doit $chgrpcmd "$dst"; else : ; fi && 
 199         if [ x
"$stripcmd" != x 
]; then $doit $stripcmd "$dst"; else : ; fi && 
 200         if [ x
"$chmodcmd" != x 
]; then $doit $chmodcmd "$dst"; else : ; fi 
 203 # If we're going to rename the final executable, determine the name now. 
 205         if [ x
"$transformarg" = x 
] 
 207                 dstfile
=`basename "$dst"` 
 209                 dstfile
=`basename "$dst" $transformbasename | 
 210                         sed $transformarg`$transformbasename 
 213 # don't allow the sed command to completely eliminate the filename 
 215         if [ x
"$dstfile" = x 
] 
 217                 dstfile
=`basename "$dst"` 
 222 # Make a couple of temp file names in the proper directory. 
 224         dsttmp
=$dstdir/#inst.$$# 
 225         rmtmp
=$dstdir/#rm.$$# 
 227 # Trap to clean up temp files at exit. 
 229         trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 
 230         trap '(exit $?); exit' 1 2 13 15 
 232 # Move or copy the file name to the temp name 
 234         $doit $instcmd "$src" "$dsttmp" && 
 236 # and set any options; do chmod last to preserve setuid bits 
 238 # If any of these fail, we abort the whole thing.  If we want to 
 239 # ignore errors from any of these, just make sure not to ignore 
 240 # errors from the above "$doit $instcmd $src $dsttmp" command. 
 242         if [ x
"$chowncmd" != x 
]; then $doit $chowncmd "$dsttmp"; else :;fi && 
 243         if [ x
"$chgrpcmd" != x 
]; then $doit $chgrpcmd "$dsttmp"; else :;fi && 
 244         if [ x
"$stripcmd" != x 
]; then $doit $stripcmd "$dsttmp"; else :;fi && 
 245         if [ x
"$chmodcmd" != x 
]; then $doit $chmodcmd "$dsttmp"; else :;fi && 
 247 # Now remove or move aside any old file at destination location.  We try this 
 248 # two ways since rm can't unlink itself on some systems and the destination 
 249 # file might be busy for other reasons.  In this case, the final cleanup 
 250 # might fail but the new file should still install successfully. 
 253         if [ -f "$dstdir/$dstfile" ] 
 255                 $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev
/null 
|| 
 256                 $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev
/null 
|| 
 258                   echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 
 266 # Now rename the file to the real destination. 
 268         $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" 
 272 # The final little trick to "correctly" pass the exit status to the exit trap.