File:  [Local Repository] / gnujdoc / install-sh
Revision 1.2: download - view: text, annotated - select for diffs
Tue May 31 12:09:13 2005 UTC (15 years, 2 months ago) by futoshi
Branches: MAIN
CVS tags: HEAD
acinclude.m4: quate first argument for AC_DEFUN.
configure.in: binutils version fix.
update some scripts from automake.

    1: #!/bin/sh
    2: # install - install a program, script, or datafile
    3: 
    4: scriptversion=2005-02-02.21
    5: 
    6: # This originates from X11R5 (mit/util/scripts/install.sh), which was
    7: # later released in X11R6 (xc/config/util/install.sh) with the
    8: # following copyright and license.
    9: #
   10: # Copyright (C) 1994 X Consortium
   11: #
   12: # Permission is hereby granted, free of charge, to any person obtaining a copy
   13: # of this software and associated documentation files (the "Software"), to
   14: # deal in the Software without restriction, including without limitation the
   15: # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
   16: # sell copies of the Software, and to permit persons to whom the Software is
   17: # furnished to do so, subject to the following conditions:
   18: #
   19: # The above copyright notice and this permission notice shall be included in
   20: # all copies or substantial portions of the Software.
   21: #
   22: # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   23: # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   24: # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
   25: # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
   26: # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
   27: # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
   28: #
   29: # Except as contained in this notice, the name of the X Consortium shall not
   30: # be used in advertising or otherwise to promote the sale, use or other deal-
   31: # ings in this Software without prior written authorization from the X Consor-
   32: # tium.
   33: #
   34: #
   35: # FSF changes to this file are in the public domain.
   36: #
   37: # Calling this script install-sh is preferred over install.sh, to prevent
   38: # `make' implicit rules from creating a file called install from it
   39: # when there is no Makefile.
   40: #
   41: # This script is compatible with the BSD install script, but was written
   42: # from scratch.  It can only install one file at a time, a restriction
   43: # shared with many OS's install programs.
   44: 
   45: # set DOITPROG to echo to test this script
   46: 
   47: # Don't use :- since 4.3BSD and earlier shells don't like it.
   48: doit="${DOITPROG-}"
   49: 
   50: # put in absolute paths if you don't have them in your path; or use env. vars.
   51: 
   52: mvprog="${MVPROG-mv}"
   53: cpprog="${CPPROG-cp}"
   54: chmodprog="${CHMODPROG-chmod}"
   55: chownprog="${CHOWNPROG-chown}"
   56: chgrpprog="${CHGRPPROG-chgrp}"
   57: stripprog="${STRIPPROG-strip}"
   58: rmprog="${RMPROG-rm}"
   59: mkdirprog="${MKDIRPROG-mkdir}"
   60: 
   61: chmodcmd="$chmodprog 0755"
   62: chowncmd=
   63: chgrpcmd=
   64: stripcmd=
   65: rmcmd="$rmprog -f"
   66: mvcmd="$mvprog"
   67: src=
   68: dst=
   69: dir_arg=
   70: dstarg=
   71: no_target_directory=
   72: 
   73: usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
   74:    or: $0 [OPTION]... SRCFILES... DIRECTORY
   75:    or: $0 [OPTION]... -t DIRECTORY SRCFILES...
   76:    or: $0 [OPTION]... -d DIRECTORIES...
   77: 
   78: In the 1st form, copy SRCFILE to DSTFILE.
   79: In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
   80: In the 4th, create DIRECTORIES.
   81: 
   82: Options:
   83: -c         (ignored)
   84: -d         create directories instead of installing files.
   85: -g GROUP   $chgrpprog installed files to GROUP.
   86: -m MODE    $chmodprog installed files to MODE.
   87: -o USER    $chownprog installed files to USER.
   88: -s         $stripprog installed files.
   89: -t DIRECTORY  install into DIRECTORY.
   90: -T         report an error if DSTFILE is a directory.
   91: --help     display this help and exit.
   92: --version  display version info and exit.
   93: 
   94: Environment variables override the default commands:
   95:   CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
   96: "
   97: 
   98: while test -n "$1"; do
   99:   case $1 in
  100:     -c) shift
  101:         continue;;
  102: 
  103:     -d) dir_arg=true
  104:         shift
  105:         continue;;
  106: 
  107:     -g) chgrpcmd="$chgrpprog $2"
  108:         shift
  109:         shift
  110:         continue;;
  111: 
  112:     --help) echo "$usage"; exit $?;;
  113: 
  114:     -m) chmodcmd="$chmodprog $2"
  115:         shift
  116:         shift
  117:         continue;;
  118: 
  119:     -o) chowncmd="$chownprog $2"
  120:         shift
  121:         shift
  122:         continue;;
  123: 
  124:     -s) stripcmd=$stripprog
  125:         shift
  126:         continue;;
  127: 
  128:     -t) dstarg=$2
  129: 	shift
  130: 	shift
  131: 	continue;;
  132: 
  133:     -T) no_target_directory=true
  134: 	shift
  135: 	continue;;
  136: 
  137:     --version) echo "$0 $scriptversion"; exit $?;;
  138: 
  139:     *)  # When -d is used, all remaining arguments are directories to create.
  140: 	# When -t is used, the destination is already specified.
  141: 	test -n "$dir_arg$dstarg" && break
  142:         # Otherwise, the last argument is the destination.  Remove it from $@.
  143: 	for arg
  144: 	do
  145:           if test -n "$dstarg"; then
  146: 	    # $@ is not empty: it contains at least $arg.
  147: 	    set fnord "$@" "$dstarg"
  148: 	    shift # fnord
  149: 	  fi
  150: 	  shift # arg
  151: 	  dstarg=$arg
  152: 	done
  153: 	break;;
  154:   esac
  155: done
  156: 
  157: if test -z "$1"; then
  158:   if test -z "$dir_arg"; then
  159:     echo "$0: no input file specified." >&2
  160:     exit 1
  161:   fi
  162:   # It's OK to call `install-sh -d' without argument.
  163:   # This can happen when creating conditional directories.
  164:   exit 0
  165: fi
  166: 
  167: for src
  168: do
  169:   # Protect names starting with `-'.
  170:   case $src in
  171:     -*) src=./$src ;;
  172:   esac
  173: 
  174:   if test -n "$dir_arg"; then
  175:     dst=$src
  176:     src=
  177: 
  178:     if test -d "$dst"; then
  179:       mkdircmd=:
  180:       chmodcmd=
  181:     else
  182:       mkdircmd=$mkdirprog
  183:     fi
  184:   else
  185:     # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
  186:     # might cause directories to be created, which would be especially bad
  187:     # if $src (and thus $dsttmp) contains '*'.
  188:     if test ! -f "$src" && test ! -d "$src"; then
  189:       echo "$0: $src does not exist." >&2
  190:       exit 1
  191:     fi
  192: 
  193:     if test -z "$dstarg"; then
  194:       echo "$0: no destination specified." >&2
  195:       exit 1
  196:     fi
  197: 
  198:     dst=$dstarg
  199:     # Protect names starting with `-'.
  200:     case $dst in
  201:       -*) dst=./$dst ;;
  202:     esac
  203: 
  204:     # If destination is a directory, append the input filename; won't work
  205:     # if double slashes aren't ignored.
  206:     if test -d "$dst"; then
  207:       if test -n "$no_target_directory"; then
  208: 	echo "$0: $dstarg: Is a directory" >&2
  209: 	exit 1
  210:       fi
  211:       dst=$dst/`basename "$src"`
  212:     fi
  213:   fi
  214: 
  215:   # This sed command emulates the dirname command.
  216:   dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
  217: 
  218:   # Make sure that the destination directory exists.
  219: 
  220:   # Skip lots of stat calls in the usual case.
  221:   if test ! -d "$dstdir"; then
  222:     defaultIFS='
  223: 	 '
  224:     IFS="${IFS-$defaultIFS}"
  225: 
  226:     oIFS=$IFS
  227:     # Some sh's can't handle IFS=/ for some reason.
  228:     IFS='%'
  229:     set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
  230:     shift
  231:     IFS=$oIFS
  232: 
  233:     pathcomp=
  234: 
  235:     while test $# -ne 0 ; do
  236:       pathcomp=$pathcomp$1
  237:       shift
  238:       if test ! -d "$pathcomp"; then
  239:         $mkdirprog "$pathcomp"
  240: 	# mkdir can fail with a `File exist' error in case several
  241: 	# install-sh are creating the directory concurrently.  This
  242: 	# is OK.
  243: 	test -d "$pathcomp" || exit
  244:       fi
  245:       pathcomp=$pathcomp/
  246:     done
  247:   fi
  248: 
  249:   if test -n "$dir_arg"; then
  250:     $doit $mkdircmd "$dst" \
  251:       && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
  252:       && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
  253:       && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
  254:       && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
  255: 
  256:   else
  257:     dstfile=`basename "$dst"`
  258: 
  259:     # Make a couple of temp file names in the proper directory.
  260:     dsttmp=$dstdir/_inst.$$_
  261:     rmtmp=$dstdir/_rm.$$_
  262: 
  263:     # Trap to clean up those temp files at exit.
  264:     trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
  265:     trap '(exit $?); exit' 1 2 13 15
  266: 
  267:     # Copy the file name to the temp name.
  268:     $doit $cpprog "$src" "$dsttmp" &&
  269: 
  270:     # and set any options; do chmod last to preserve setuid bits.
  271:     #
  272:     # If any of these fail, we abort the whole thing.  If we want to
  273:     # ignore errors from any of these, just make sure not to ignore
  274:     # errors from the above "$doit $cpprog $src $dsttmp" command.
  275:     #
  276:     { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
  277:       && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
  278:       && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
  279:       && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
  280: 
  281:     # Now rename the file to the real destination.
  282:     { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
  283:       || {
  284: 	   # The rename failed, perhaps because mv can't rename something else
  285: 	   # to itself, or perhaps because mv is so ancient that it does not
  286: 	   # support -f.
  287: 
  288: 	   # Now remove or move aside any old file at destination location.
  289: 	   # We try this two ways since rm can't unlink itself on some
  290: 	   # systems and the destination file might be busy for other
  291: 	   # reasons.  In this case, the final cleanup might fail but the new
  292: 	   # file should still install successfully.
  293: 	   {
  294: 	     if test -f "$dstdir/$dstfile"; then
  295: 	       $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
  296: 	       || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
  297: 	       || {
  298: 		 echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
  299: 		 (exit 1); exit 1
  300: 	       }
  301: 	     else
  302: 	       :
  303: 	     fi
  304: 	   } &&
  305: 
  306: 	   # Now rename the file to the real destination.
  307: 	   $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
  308: 	 }
  309:     }
  310:   fi || { (exit 1); exit 1; }
  311: done
  312: 
  313: # The final little trick to "correctly" pass the exit status to the exit trap.
  314: {
  315:   (exit 0); exit 0
  316: }
  317: 
  318: # Local variables:
  319: # eval: (add-hook 'write-file-hooks 'time-stamp)
  320: # time-stamp-start: "scriptversion="
  321: # time-stamp-format: "%:y-%02m-%02d.%02H"
  322: # time-stamp-end: "$"
  323: # End:

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>