diff options
Diffstat (limited to 'install-sh')
| -rwxr-xr-x | install-sh | 161 | 
1 files changed, 92 insertions, 69 deletions
| @@ -1,7 +1,7 @@  #!/bin/sh  # install - install a program, script, or datafile -scriptversion=2018-03-11.20; # UTC +scriptversion=2020-11-14.01; # UTC  # This originates from X11R5 (mit/util/scripts/install.sh), which was  # later released in X11R6 (xc/config/util/install.sh) with the @@ -69,6 +69,11 @@ posix_mkdir=  # Desired mode of installed file.  mode=0755 +# Create dirs (including intermediate dirs) using mode 755. +# This is like GNU 'install' as of coreutils 8.32 (2020). +mkdir_umask=22 + +backupsuffix=  chgrpcmd=  chmodcmd=$chmodprog  chowncmd= @@ -99,18 +104,28 @@ Options:       --version  display version info and exit.    -c            (ignored) -  -C            install only if different (preserve the last data modification time) +  -C            install only if different (preserve 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. +  -p            pass -p to $cpprog.    -s            $stripprog installed files. +  -S SUFFIX     attempt to back up existing files, with suffix SUFFIX.    -t DIRECTORY  install into DIRECTORY.    -T            report an error if DSTFILE is a directory.  Environment variables override the default commands:    CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG    RMPROG STRIPPROG + +By default, rm is invoked with -f; when overridden with RMPROG, +it's up to you to specify -f if you want it. + +If -S is not specified, no backups are attempted. + +Email bug reports to bug-automake@gnu.org. +Automake home page: https://www.gnu.org/software/automake/  "  while test $# -ne 0; do @@ -137,8 +152,13 @@ while test $# -ne 0; do      -o) chowncmd="$chownprog $2"          shift;; +    -p) cpprog="$cpprog -p";; +      -s) stripcmd=$stripprog;; +    -S) backupsuffix="$2" +        shift;; +      -t)          is_target_a_directory=always          dst_arg=$2 @@ -255,6 +275,10 @@ do      dstdir=$dst      test -d "$dstdir"      dstdir_status=$? +    # Don't chown directories that already exist. +    if test $dstdir_status = 0; then +      chowncmd="" +    fi    else      # Waiting for this to be detected by the "$cpprog $src $dsttmp" command @@ -301,22 +325,6 @@ do    if test $dstdir_status != 0; then      case $posix_mkdir in        '') -        # Create intermediate dirs using mode 755 as modified by the umask. -        # This is like FreeBSD 'install' as of 1997-10-28. -        umask=`umask` -        case $stripcmd.$umask in -          # Optimize common cases. -          *[2367][2367]) mkdir_umask=$umask;; -          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - -          *[0-7]) -            mkdir_umask=`expr $umask + 22 \ -              - $umask % 100 % 40 + $umask % 20 \ -              - $umask % 10 % 4 + $umask % 2 -            `;; -          *) mkdir_umask=$umask,go-w;; -        esac -          # With -d, create the new directory with the user-specified mode.          # Otherwise, rely on $mkdir_umask.          if test -n "$dir_arg"; then @@ -326,52 +334,49 @@ do          fi          posix_mkdir=false -        case $umask in -          *[123567][0-7][0-7]) -            # POSIX mkdir -p sets u+wx bits regardless of umask, which -            # is incompatible with FreeBSD 'install' when (umask & 300) != 0. -            ;; -          *) -            # Note that $RANDOM variable is not portable (e.g. dash);  Use it -            # here however when possible just to lower collision chance. -            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - -            trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 - -            # Because "mkdir -p" follows existing symlinks and we likely work -            # directly in world-writeable /tmp, make sure that the '$tmpdir' -            # directory is successfully created first before we actually test -            # 'mkdir -p' feature. -            if (umask $mkdir_umask && -                $mkdirprog $mkdir_mode "$tmpdir" && -                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 -            then -              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-writable bit of parent directory when it shouldn't. -                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. -                   test_tmpdir="$tmpdir/a" -                   ls_ld_tmpdir=`ls -ld "$test_tmpdir"` -                   case $ls_ld_tmpdir in -                     d????-?r-*) different_mode=700;; -                     d????-?--*) different_mode=755;; -                     *) false;; -                   esac && -                   $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { -                     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` -                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" -                   } -                 } -              then posix_mkdir=: -              fi -              rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" -            else -              # Remove any dirs left behind by ancient mkdir implementations. -              rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null -            fi -            trap '' 0;; -        esac;; +	# The $RANDOM variable is not portable (e.g., dash).  Use it +	# here however when possible just to lower collision chance. +	tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + +	trap ' +	  ret=$? +	  rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null +	  exit $ret +	' 0 + +	# Because "mkdir -p" follows existing symlinks and we likely work +	# directly in world-writeable /tmp, make sure that the '$tmpdir' +	# directory is successfully created first before we actually test +	# 'mkdir -p'. +	if (umask $mkdir_umask && +	    $mkdirprog $mkdir_mode "$tmpdir" && +	    exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 +	then +	  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-writable bit of parent directory when it shouldn't. +	       # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. +	       test_tmpdir="$tmpdir/a" +	       ls_ld_tmpdir=`ls -ld "$test_tmpdir"` +	       case $ls_ld_tmpdir in +		 d????-?r-*) different_mode=700;; +		 d????-?--*) different_mode=755;; +		 *) false;; +	       esac && +	       $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { +		 ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` +		 test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" +	       } +	     } +	  then posix_mkdir=: +	  fi +	  rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" +	else +	  # Remove any dirs left behind by ancient mkdir implementations. +	  rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null +	fi +	trap '' 0;;      esac      if @@ -382,7 +387,7 @@ do      then :      else -      # The umask is ridiculous, or mkdir does not conform to POSIX, +      # mkdir does not conform to POSIX,        # or it failed possibly due to a race condition.  Create the        # directory the slow way, step by step, checking for races as we go. @@ -411,7 +416,7 @@ do            prefixes=          else            if $posix_mkdir; then -            (umask=$mkdir_umask && +            (umask $mkdir_umask &&               $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break              # Don't fail if two instances are running concurrently.              test -d "$prefix" || exit 1 @@ -451,7 +456,18 @@ do      trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0      # Copy the file name to the temp name. -    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && +    (umask $cp_umask && +     { test -z "$stripcmd" || { +	 # Create $dsttmp read-write so that cp doesn't create it read-only, +	 # which would cause strip to fail. +	 if test -z "$doit"; then +	   : >"$dsttmp" # No need to fork-exec 'touch'. +	 else +	   $doit touch "$dsttmp" +	 fi +       } +     } && +     $doit_exec $cpprog "$src" "$dsttmp") &&      # and set any options; do chmod last to preserve setuid bits.      # @@ -477,6 +493,13 @@ do      then        rm -f "$dsttmp"      else +      # If $backupsuffix is set, and the file being installed +      # already exists, attempt a backup.  Don't worry if it fails, +      # e.g., if mv doesn't support -f. +      if test -n "$backupsuffix" && test -f "$dst"; then +        $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null +      fi +        # Rename the file to the real destination.        $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || @@ -491,9 +514,9 @@ do          # file should still install successfully.          {            test ! -f "$dst" || -          $doit $rmcmd -f "$dst" 2>/dev/null || +          $doit $rmcmd "$dst" 2>/dev/null ||            { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && -            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } +            { $doit $rmcmd "$rmtmp" 2>/dev/null; :; }            } ||            { echo "$0: cannot unlink or rename $dst" >&2              (exit 1); exit 1 | 
