11#! /bin/sh
22# install - install a program, script, or datafile
33
4- scriptversion=2018-03-11.20 ; # UTC
4+ scriptversion=2020-11-14.01 ; # UTC
55
66# This originates from X11R5 (mit/util/scripts/install.sh), which was
77# later released in X11R6 (xc/config/util/install.sh) with the
@@ -69,6 +69,11 @@ posix_mkdir=
6969# Desired mode of installed file.
7070mode=0755
7171
72+ # Create dirs (including intermediate dirs) using mode 755.
73+ # This is like GNU 'install' as of coreutils 8.32 (2020).
74+ mkdir_umask=22
75+
76+ backupsuffix=
7277chgrpcmd=
7378chmodcmd=$chmodprog
7479chowncmd=
@@ -99,18 +104,28 @@ Options:
99104 --version display version info and exit.
100105
101106 -c (ignored)
102- -C install only if different (preserve the last data modification time)
107+ -C install only if different (preserve data modification time)
103108 -d create directories instead of installing files.
104109 -g GROUP $chgrpprog installed files to GROUP.
105110 -m MODE $chmodprog installed files to MODE.
106111 -o USER $chownprog installed files to USER.
112+ -p pass -p to $cpprog .
107113 -s $stripprog installed files.
114+ -S SUFFIX attempt to back up existing files, with suffix SUFFIX.
108115 -t DIRECTORY install into DIRECTORY.
109116 -T report an error if DSTFILE is a directory.
110117
111118Environment variables override the default commands:
112119 CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
113120 RMPROG STRIPPROG
121+
122+ By default, rm is invoked with -f; when overridden with RMPROG,
123+ it's up to you to specify -f if you want it.
124+
125+ If -S is not specified, no backups are attempted.
126+
127+ Email bug reports to bug-automake@gnu.org.
128+ Automake home page: https://www.gnu.org/software/automake/
114129"
115130
116131while test $# -ne 0; do
@@ -137,8 +152,13 @@ while test $# -ne 0; do
137152 -o) chowncmd=" $chownprog $2 "
138153 shift ;;
139154
155+ -p) cpprog=" $cpprog -p" ;;
156+
140157 -s) stripcmd=$stripprog ;;
141158
159+ -S) backupsuffix=" $2 "
160+ shift ;;
161+
142162 -t)
143163 is_target_a_directory=always
144164 dst_arg=$2
255275 dstdir=$dst
256276 test -d " $dstdir "
257277 dstdir_status=$?
278+ # Don't chown directories that already exist.
279+ if test $dstdir_status = 0; then
280+ chowncmd=" "
281+ fi
258282 else
259283
260284 # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
301325 if test $dstdir_status ! = 0; then
302326 case $posix_mkdir in
303327 ' ' )
304- # Create intermediate dirs using mode 755 as modified by the umask.
305- # This is like FreeBSD 'install' as of 1997-10-28.
306- umask=` umask`
307- case $stripcmd .$umask in
308- # Optimize common cases.
309- * [2367][2367]) mkdir_umask=$umask ;;
310- .* 0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
311-
312- * [0-7])
313- mkdir_umask=` expr $umask + 22 \
314- - $umask % 100 % 40 + $umask % 20 \
315- - $umask % 10 % 4 + $umask % 2
316- ` ;;
317- * ) mkdir_umask=$umask ,go-w;;
318- esac
319-
320328 # With -d, create the new directory with the user-specified mode.
321329 # Otherwise, rely on $mkdir_umask.
322330 if test -n " $dir_arg " ; then
326334 fi
327335
328336 posix_mkdir=false
329- case $umask in
330- * [123567][0-7][0-7])
331- # POSIX mkdir -p sets u+wx bits regardless of umask, which
332- # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
333- ;;
334- * )
335- # Note that $RANDOM variable is not portable (e.g. dash); Use it
336- # here however when possible just to lower collision chance.
337- tmpdir=${TMPDIR-/ tmp} /ins$RANDOM -$$
338-
339- trap ' ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
340-
341- # Because "mkdir -p" follows existing symlinks and we likely work
342- # directly in world-writeable /tmp, make sure that the '$tmpdir'
343- # directory is successfully created first before we actually test
344- # 'mkdir -p' feature.
345- if (umask $mkdir_umask &&
346- $mkdirprog $mkdir_mode " $tmpdir " &&
347- exec $mkdirprog $mkdir_mode -p -- " $tmpdir /a/b" ) > /dev/null 2>&1
348- then
349- if test -z " $dir_arg " || {
350- # Check for POSIX incompatibilities with -m.
351- # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
352- # other-writable bit of parent directory when it shouldn't.
353- # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
354- test_tmpdir=" $tmpdir /a"
355- ls_ld_tmpdir=` ls -ld " $test_tmpdir " `
356- case $ls_ld_tmpdir in
357- d???? -? r-* ) different_mode=700;;
358- d???? -? --* ) different_mode=755;;
359- * ) false ;;
360- esac &&
361- $mkdirprog -m$different_mode -p -- " $test_tmpdir " && {
362- ls_ld_tmpdir_1=` ls -ld " $test_tmpdir " `
363- test " $ls_ld_tmpdir " = " $ls_ld_tmpdir_1 "
364- }
365- }
366- then posix_mkdir=:
367- fi
368- rmdir " $tmpdir /a/b" " $tmpdir /a" " $tmpdir "
369- else
370- # Remove any dirs left behind by ancient mkdir implementations.
371- rmdir ./$mkdir_mode ./-p ./-- " $tmpdir " 2> /dev/null
372- fi
373- trap ' ' 0;;
374- esac ;;
337+ # The $RANDOM variable is not portable (e.g., dash). Use it
338+ # here however when possible just to lower collision chance.
339+ tmpdir=${TMPDIR-/ tmp} /ins$RANDOM -$$
340+
341+ trap '
342+ ret=$?
343+ rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
344+ exit $ret
345+ ' 0
346+
347+ # Because "mkdir -p" follows existing symlinks and we likely work
348+ # directly in world-writeable /tmp, make sure that the '$tmpdir'
349+ # directory is successfully created first before we actually test
350+ # 'mkdir -p'.
351+ if (umask $mkdir_umask &&
352+ $mkdirprog $mkdir_mode " $tmpdir " &&
353+ exec $mkdirprog $mkdir_mode -p -- " $tmpdir /a/b" ) > /dev/null 2>&1
354+ then
355+ if test -z " $dir_arg " || {
356+ # Check for POSIX incompatibilities with -m.
357+ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
358+ # other-writable bit of parent directory when it shouldn't.
359+ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
360+ test_tmpdir=" $tmpdir /a"
361+ ls_ld_tmpdir=` ls -ld " $test_tmpdir " `
362+ case $ls_ld_tmpdir in
363+ d???? -? r-* ) different_mode=700;;
364+ d???? -? --* ) different_mode=755;;
365+ * ) false ;;
366+ esac &&
367+ $mkdirprog -m$different_mode -p -- " $test_tmpdir " && {
368+ ls_ld_tmpdir_1=` ls -ld " $test_tmpdir " `
369+ test " $ls_ld_tmpdir " = " $ls_ld_tmpdir_1 "
370+ }
371+ }
372+ then posix_mkdir=:
373+ fi
374+ rmdir " $tmpdir /a/b" " $tmpdir /a" " $tmpdir "
375+ else
376+ # Remove any dirs left behind by ancient mkdir implementations.
377+ rmdir ./$mkdir_mode ./-p ./-- " $tmpdir " 2> /dev/null
378+ fi
379+ trap ' ' 0;;
375380 esac
376381
377382 if
382387 then :
383388 else
384389
385- # The umask is ridiculous, or mkdir does not conform to POSIX,
390+ # mkdir does not conform to POSIX,
386391 # or it failed possibly due to a race condition. Create the
387392 # directory the slow way, step by step, checking for races as we go.
388393
411416 prefixes=
412417 else
413418 if $posix_mkdir ; then
414- (umask= $mkdir_umask &&
419+ (umask $mkdir_umask &&
415420 $doit_exec $mkdirprog $mkdir_mode -p -- " $dstdir " ) && break
416421 # Don't fail if two instances are running concurrently.
417422 test -d " $prefix " || exit 1
451456 trap ' ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
452457
453458 # Copy the file name to the temp name.
454- (umask $cp_umask && $doit_exec $cpprog " $src " " $dsttmp " ) &&
459+ (umask $cp_umask &&
460+ { test -z " $stripcmd " || {
461+ # Create $dsttmp read-write so that cp doesn't create it read-only,
462+ # which would cause strip to fail.
463+ if test -z " $doit " ; then
464+ : > " $dsttmp " # No need to fork-exec 'touch'.
465+ else
466+ $doit touch " $dsttmp "
467+ fi
468+ }
469+ } &&
470+ $doit_exec $cpprog " $src " " $dsttmp " ) &&
455471
456472 # and set any options; do chmod last to preserve setuid bits.
457473 #
477493 then
478494 rm -f " $dsttmp "
479495 else
496+ # If $backupsuffix is set, and the file being installed
497+ # already exists, attempt a backup. Don't worry if it fails,
498+ # e.g., if mv doesn't support -f.
499+ if test -n " $backupsuffix " && test -f " $dst " ; then
500+ $doit $mvcmd -f " $dst " " $dst$backupsuffix " 2> /dev/null
501+ fi
502+
480503 # Rename the file to the real destination.
481504 $doit $mvcmd -f " $dsttmp " " $dst " 2> /dev/null ||
482505
491514 # file should still install successfully.
492515 {
493516 test ! -f " $dst " ||
494- $doit $rmcmd -f " $dst " 2> /dev/null ||
517+ $doit $rmcmd " $dst " 2> /dev/null ||
495518 { $doit $mvcmd -f " $dst " " $rmtmp " 2> /dev/null &&
496- { $doit $rmcmd -f " $rmtmp " 2> /dev/null; : ; }
519+ { $doit $rmcmd " $rmtmp " 2> /dev/null; : ; }
497520 } ||
498521 { echo " $0 : cannot unlink or rename $dst " >&2
499522 (exit 1); exit 1
0 commit comments