diff options
Diffstat (limited to 'install-sh')
| -rwxr-xr-x | install-sh | 258 | 
1 files changed, 139 insertions, 119 deletions
| @@ -1,7 +1,7 @@  #!/bin/sh  # install - install a program, script, or datafile -scriptversion=2006-10-14.15 +scriptversion=2011-11-20.07; # UTC  # This originates from X11R5 (mit/util/scripts/install.sh), which was  # later released in X11R6 (xc/config/util/install.sh) with the @@ -35,7 +35,7 @@ scriptversion=2006-10-14.15  # FSF changes to this file are in the public domain.  #  # Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it +# 'make' implicit rules from creating a file called install from it  # when there is no Makefile.  #  # This script is compatible with the BSD install script, but was written @@ -48,7 +48,7 @@ IFS=" ""	$nl"  # set DOITPROG to echo to test this script  # Don't use :- since 4.3BSD and earlier shells don't like it. -doit="${DOITPROG-}" +doit=${DOITPROG-}  if test -z "$doit"; then    doit_exec=exec  else @@ -58,34 +58,49 @@ fi  # Put in absolute file names if you don't have them in your path;  # or use environment vars. -mvprog="${MVPROG-mv}" -cpprog="${CPPROG-cp}" -chmodprog="${CHMODPROG-chmod}" -chownprog="${CHOWNPROG-chown}" -chgrpprog="${CHGRPPROG-chgrp}" -stripprog="${STRIPPROG-strip}" -rmprog="${RMPROG-rm}" -mkdirprog="${MKDIRPROG-mkdir}" +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' +  test "$posix_glob" != "?" || { +    if (set -f) 2>/dev/null; then +      posix_glob= +    else +      posix_glob=: +    fi +  } +' -posix_glob=  posix_mkdir=  # Desired mode of installed file.  mode=0755 +chgrpcmd=  chmodcmd=$chmodprog  chowncmd= -chgrpcmd= -stripcmd= +mvcmd=$mvprog  rmcmd="$rmprog -f" -mvcmd="$mvprog" +stripcmd= +  src=  dst=  dir_arg= -dstarg= +dst_arg= + +copy_on_change=false  no_target_directory= -usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE     or: $0 [OPTION]... SRCFILES... DIRECTORY     or: $0 [OPTION]... -t DIRECTORY SRCFILES...     or: $0 [OPTION]... -d DIRECTORIES... @@ -95,65 +110,59 @@ In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.  In the 4th, create DIRECTORIES.  Options: --c         (ignored) --d         create directories instead of installing files. --g GROUP   $chgrpprog installed files to GROUP. --m MODE    $chmodprog installed files to MODE. --o USER    $chownprog installed files to USER. --s         $stripprog installed files. --t DIRECTORY  install into DIRECTORY. --T         report an error if DSTFILE is a directory. ---help     display this help and exit. ---version  display version info and exit. +     --help     display this help and exit. +     --version  display version info and exit. + +  -c            (ignored) +  -C            install only if different (preserve the last data modification time) +  -d            create directories instead of installing files. +  -g GROUP      $chgrpprog installed files to GROUP. +  -m MODE       $chmodprog installed files to MODE. +  -o USER       $chownprog installed files to USER. +  -s            $stripprog installed files. +  -t DIRECTORY  install into DIRECTORY. +  -T            report an error if DSTFILE is a directory.  Environment variables override the default commands: -  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG +  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG +  RMPROG STRIPPROG  "  while test $# -ne 0; do    case $1 in -    -c) shift -        continue;; +    -c) ;; -    -d) dir_arg=true -        shift -        continue;; +    -C) copy_on_change=true;; + +    -d) dir_arg=true;;      -g) chgrpcmd="$chgrpprog $2" -        shift -        shift -        continue;; +	shift;;      --help) echo "$usage"; exit $?;;      -m) mode=$2 -        shift -        shift  	case $mode in  	  *' '* | *'	'* | *'  '*	  | *'*'* | *'?'* | *'['*)  	    echo "$0: invalid mode: $mode" >&2  	    exit 1;;  	esac -        continue;; +	shift;;      -o) chowncmd="$chownprog $2" -        shift -        shift -        continue;; +	shift;; -    -s) stripcmd=$stripprog -        shift -        continue;; +    -s) stripcmd=$stripprog;; -    -t) dstarg=$2 -	shift -	shift -	continue;; +    -t) dst_arg=$2 +	# Protect names problematic for 'test' and other utilities. +	case $dst_arg in +	  -* | [=\(\)!]) dst_arg=./$dst_arg;; +	esac +	shift;; -    -T) no_target_directory=true -	shift -	continue;; +    -T) no_target_directory=true;;      --version) echo "$0 $scriptversion"; exit $?;; @@ -165,21 +174,26 @@ while test $# -ne 0; do      *)  break;;    esac +  shift  done -if test $# -ne 0 && test -z "$dir_arg$dstarg"; then +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then    # When -d is used, all remaining arguments are directories to create.    # When -t is used, the destination is already specified.    # Otherwise, the last argument is the destination.  Remove it from $@.    for arg    do -    if test -n "$dstarg"; then +    if test -n "$dst_arg"; then        # $@ is not empty: it contains at least $arg. -      set fnord "$@" "$dstarg" +      set fnord "$@" "$dst_arg"        shift # fnord      fi      shift # arg -    dstarg=$arg +    dst_arg=$arg +    # Protect names problematic for 'test' and other utilities. +    case $dst_arg in +      -* | [=\(\)!]) dst_arg=./$dst_arg;; +    esac    done  fi @@ -188,13 +202,17 @@ if test $# -eq 0; then      echo "$0: no input file specified." >&2      exit 1    fi -  # It's OK to call `install-sh -d' without argument. +  # It's OK to call 'install-sh -d' without argument.    # This can happen when creating conditional directories.    exit 0  fi  if test -z "$dir_arg"; then -  trap '(exit $?); exit' 1 2 13 15 +  do_exit='(exit $ret); exit $ret' +  trap "ret=129; $do_exit" 1 +  trap "ret=130; $do_exit" 2 +  trap "ret=141; $do_exit" 13 +  trap "ret=143; $do_exit" 15    # Set umask so as not to create temps with too-generous modes.    # However, 'strip' requires both read and write access to temps. @@ -222,9 +240,9 @@ fi  for src  do -  # Protect names starting with `-'. +  # Protect names problematic for 'test' and other utilities.    case $src in -    -*) src=./$src ;; +    -* | [=\(\)!]) src=./$src;;    esac    if test -n "$dir_arg"; then @@ -242,22 +260,17 @@ do        exit 1      fi -    if test -z "$dstarg"; then +    if test -z "$dst_arg"; then        echo "$0: no destination specified." >&2        exit 1      fi - -    dst=$dstarg -    # Protect names starting with `-'. -    case $dst in -      -*) dst=./$dst ;; -    esac +    dst=$dst_arg      # If destination is a directory, append the input filename; won't work      # if double slashes aren't ignored.      if test -d "$dst"; then        if test -n "$no_target_directory"; then -	echo "$0: $dstarg: Is a directory" >&2 +	echo "$0: $dst_arg: Is a directory" >&2  	exit 1        fi        dstdir=$dst @@ -341,7 +354,7 @@ do  	      if test -z "$dir_arg" || {  		   # Check for POSIX incompatibilities with -m.  		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or -		   # other-writeable bit of parent directory when it shouldn't. +		   # other-writable bit of parent directory when it shouldn't.  		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.  		   ls_ld_tmpdir=`ls -ld "$tmpdir"`  		   case $ls_ld_tmpdir in @@ -378,33 +391,26 @@ do        # directory the slow way, step by step, checking for races as we go.        case $dstdir in -	/*) prefix=/ ;; -	-*) prefix=./ ;; -	*)  prefix= ;; +	/*) prefix='/';; +	[-=\(\)!]*) prefix='./';; +	*)  prefix='';;        esac -      case $posix_glob in -        '') -	  if (set -f) 2>/dev/null; then -	    posix_glob=true -	  else -	    posix_glob=false -	  fi ;; -      esac +      eval "$initialize_posix_glob"        oIFS=$IFS        IFS=/ -      $posix_glob && set -f +      $posix_glob set -f        set fnord $dstdir        shift -      $posix_glob && set +f +      $posix_glob set +f        IFS=$oIFS        prefixes=        for d        do -	test -z "$d" && continue +	test X"$d" = X && continue  	prefix=$prefix$d  	if test -d "$prefix"; then @@ -459,41 +465,54 @@ do      # ignore errors from any of these, just make sure not to ignore      # errors from the above "$doit $cpprog $src $dsttmp" command.      # -    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ -      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ -      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ -      && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && - -    # Now rename the file to the real destination. -    { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \ -      || { -	   # The rename failed, perhaps because mv can't rename something else -	   # to itself, or perhaps because mv is so ancient that it does not -	   # support -f. - -	   # Now remove or move aside any old file at destination location. -	   # We try this two ways since rm can't unlink itself on some -	   # systems and the destination file might be busy for other -	   # reasons.  In this case, the final cleanup might fail but the new -	   # file should still install successfully. -	   { -	     if test -f "$dst"; then -	       $doit $rmcmd -f "$dst" 2>/dev/null \ -	       || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \ -		     && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\ -	       || { -		 echo "$0: cannot unlink or rename $dst" >&2 -		 (exit 1); exit 1 -	       } -	     else -	       : -	     fi -	   } && - -	   # Now rename the file to the real destination. -	   $doit $mvcmd "$dsttmp" "$dst" -	 } -    } || exit 1 +    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && +    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && +    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && +    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + +    # If -C, don't bother to copy if it wouldn't change the file. +    if $copy_on_change && +       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` && +       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` && + +       eval "$initialize_posix_glob" && +       $posix_glob set -f && +       set X $old && old=:$2:$4:$5:$6 && +       set X $new && new=:$2:$4:$5:$6 && +       $posix_glob set +f && + +       test "$old" = "$new" && +       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 +    then +      rm -f "$dsttmp" +    else +      # Rename the file to the real destination. +      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + +      # The rename failed, perhaps because mv can't rename something else +      # to itself, or perhaps because mv is so ancient that it does not +      # support -f. +      { +	# Now remove or move aside any old file at destination location. +	# We try this two ways since rm can't unlink itself on some +	# systems and the destination file might be busy for other +	# reasons.  In this case, the final cleanup might fail but the new +	# file should still install successfully. +	{ +	  test ! -f "$dst" || +	  $doit $rmcmd -f "$dst" 2>/dev/null || +	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && +	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } +	  } || +	  { echo "$0: cannot unlink or rename $dst" >&2 +	    (exit 1); exit 1 +	  } +	} && + +	# Now rename the file to the real destination. +	$doit $mvcmd "$dsttmp" "$dst" +      } +    fi || exit 1      trap '' 0    fi @@ -503,5 +522,6 @@ done  # eval: (add-hook 'write-file-hooks 'time-stamp)  # time-stamp-start: "scriptversion="  # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC"  # End: | 
