Commit ee450ae6bbbf38180368b46486293593efc6588f

Authored by Jay Berkenbilt
1 parent a8682e0b

Update utility scripts from automake

Showing 2 changed files with 183 additions and 202 deletions
install-sh
1 1 #!/bin/sh
2 2 # install - install a program, script, or datafile
3 3  
4   -scriptversion=2011-01-19.21; # UTC
  4 +scriptversion=2014-09-12.12; # UTC
5 5  
6 6 # This originates from X11R5 (mit/util/scripts/install.sh), which was
7 7 # later released in X11R6 (xc/config/util/install.sh) with the
... ... @@ -35,25 +35,21 @@ scriptversion=2011-01-19.21; # UTC
35 35 # FSF changes to this file are in the public domain.
36 36 #
37 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
  38 +# 'make' implicit rules from creating a file called install from it
39 39 # when there is no Makefile.
40 40 #
41 41 # This script is compatible with the BSD install script, but was written
42 42 # from scratch.
43 43  
  44 +tab=' '
44 45 nl='
45 46 '
46   -IFS=" "" $nl"
  47 +IFS=" $tab$nl"
47 48  
48   -# set DOITPROG to echo to test this script
  49 +# Set DOITPROG to "echo" to test this script.
49 50  
50   -# Don't use :- since 4.3BSD and earlier shells don't like it.
51 51 doit=${DOITPROG-}
52   -if test -z "$doit"; then
53   - doit_exec=exec
54   -else
55   - doit_exec=$doit
56   -fi
  52 +doit_exec=${doit:-exec}
57 53  
58 54 # Put in absolute file names if you don't have them in your path;
59 55 # or use environment vars.
... ... @@ -68,17 +64,6 @@ mvprog=${MVPROG-mv}
68 64 rmprog=${RMPROG-rm}
69 65 stripprog=${STRIPPROG-strip}
70 66  
71   -posix_glob='?'
72   -initialize_posix_glob='
73   - test "$posix_glob" != "?" || {
74   - if (set -f) 2>/dev/null; then
75   - posix_glob=
76   - else
77   - posix_glob=:
78   - fi
79   - }
80   -'
81   -
82 67 posix_mkdir=
83 68  
84 69 # Desired mode of installed file.
... ... @@ -97,7 +82,7 @@ dir_arg=
97 82 dst_arg=
98 83  
99 84 copy_on_change=false
100   -no_target_directory=
  85 +is_target_a_directory=possibly
101 86  
102 87 usage="\
103 88 Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
... ... @@ -137,46 +122,57 @@ while test $# -ne 0; do
137 122 -d) dir_arg=true;;
138 123  
139 124 -g) chgrpcmd="$chgrpprog $2"
140   - shift;;
  125 + shift;;
141 126  
142 127 --help) echo "$usage"; exit $?;;
143 128  
144 129 -m) mode=$2
145   - case $mode in
146   - *' '* | *' '* | *'
147   -'* | *'*'* | *'?'* | *'['*)
148   - echo "$0: invalid mode: $mode" >&2
149   - exit 1;;
150   - esac
151   - shift;;
  130 + case $mode in
  131 + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
  132 + echo "$0: invalid mode: $mode" >&2
  133 + exit 1;;
  134 + esac
  135 + shift;;
152 136  
153 137 -o) chowncmd="$chownprog $2"
154   - shift;;
  138 + shift;;
155 139  
156 140 -s) stripcmd=$stripprog;;
157 141  
158   - -t) dst_arg=$2
159   - # Protect names problematic for `test' and other utilities.
160   - case $dst_arg in
161   - -* | [=\(\)!]) dst_arg=./$dst_arg;;
162   - esac
163   - shift;;
  142 + -t)
  143 + is_target_a_directory=always
  144 + dst_arg=$2
  145 + # Protect names problematic for 'test' and other utilities.
  146 + case $dst_arg in
  147 + -* | [=\(\)!]) dst_arg=./$dst_arg;;
  148 + esac
  149 + shift;;
164 150  
165   - -T) no_target_directory=true;;
  151 + -T) is_target_a_directory=never;;
166 152  
167 153 --version) echo "$0 $scriptversion"; exit $?;;
168 154  
169   - --) shift
170   - break;;
  155 + --) shift
  156 + break;;
171 157  
172   - -*) echo "$0: invalid option: $1" >&2
173   - exit 1;;
  158 + -*) echo "$0: invalid option: $1" >&2
  159 + exit 1;;
174 160  
175 161 *) break;;
176 162 esac
177 163 shift
178 164 done
179 165  
  166 +# We allow the use of options -d and -T together, by making -d
  167 +# take the precedence; this is for compatibility with GNU install.
  168 +
  169 +if test -n "$dir_arg"; then
  170 + if test -n "$dst_arg"; then
  171 + echo "$0: target directory not allowed when installing a directory." >&2
  172 + exit 1
  173 + fi
  174 +fi
  175 +
180 176 if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
181 177 # When -d is used, all remaining arguments are directories to create.
182 178 # When -t is used, the destination is already specified.
... ... @@ -190,7 +186,7 @@ if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
190 186 fi
191 187 shift # arg
192 188 dst_arg=$arg
193   - # Protect names problematic for `test' and other utilities.
  189 + # Protect names problematic for 'test' and other utilities.
194 190 case $dst_arg in
195 191 -* | [=\(\)!]) dst_arg=./$dst_arg;;
196 192 esac
... ... @@ -202,12 +198,21 @@ if test $# -eq 0; then
202 198 echo "$0: no input file specified." >&2
203 199 exit 1
204 200 fi
205   - # It's OK to call `install-sh -d' without argument.
  201 + # It's OK to call 'install-sh -d' without argument.
206 202 # This can happen when creating conditional directories.
207 203 exit 0
208 204 fi
209 205  
210 206 if test -z "$dir_arg"; then
  207 + if test $# -gt 1 || test "$is_target_a_directory" = always; then
  208 + if test ! -d "$dst_arg"; then
  209 + echo "$0: $dst_arg: Is not a directory." >&2
  210 + exit 1
  211 + fi
  212 + fi
  213 +fi
  214 +
  215 +if test -z "$dir_arg"; then
211 216 do_exit='(exit $ret); exit $ret'
212 217 trap "ret=129; $do_exit" 1
213 218 trap "ret=130; $do_exit" 2
... ... @@ -223,16 +228,16 @@ if test -z "$dir_arg"; then
223 228  
224 229 *[0-7])
225 230 if test -z "$stripcmd"; then
226   - u_plus_rw=
  231 + u_plus_rw=
227 232 else
228   - u_plus_rw='% 200'
  233 + u_plus_rw='% 200'
229 234 fi
230 235 cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
231 236 *)
232 237 if test -z "$stripcmd"; then
233   - u_plus_rw=
  238 + u_plus_rw=
234 239 else
235   - u_plus_rw=,u+rw
  240 + u_plus_rw=,u+rw
236 241 fi
237 242 cp_umask=$mode$u_plus_rw;;
238 243 esac
... ... @@ -240,7 +245,7 @@ fi
240 245  
241 246 for src
242 247 do
243   - # Protect names problematic for `test' and other utilities.
  248 + # Protect names problematic for 'test' and other utilities.
244 249 case $src in
245 250 -* | [=\(\)!]) src=./$src;;
246 251 esac
... ... @@ -269,41 +274,15 @@ do
269 274 # If destination is a directory, append the input filename; won't work
270 275 # if double slashes aren't ignored.
271 276 if test -d "$dst"; then
272   - if test -n "$no_target_directory"; then
273   - echo "$0: $dst_arg: Is a directory" >&2
274   - exit 1
  277 + if test "$is_target_a_directory" = never; then
  278 + echo "$0: $dst_arg: Is a directory" >&2
  279 + exit 1
275 280 fi
276 281 dstdir=$dst
277 282 dst=$dstdir/`basename "$src"`
278 283 dstdir_status=0
279 284 else
280   - # Prefer dirname, but fall back on a substitute if dirname fails.
281   - dstdir=`
282   - (dirname "$dst") 2>/dev/null ||
283   - expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
284   - X"$dst" : 'X\(//\)[^/]' \| \
285   - X"$dst" : 'X\(//\)$' \| \
286   - X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
287   - echo X"$dst" |
288   - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
289   - s//\1/
290   - q
291   - }
292   - /^X\(\/\/\)[^/].*/{
293   - s//\1/
294   - q
295   - }
296   - /^X\(\/\/\)$/{
297   - s//\1/
298   - q
299   - }
300   - /^X\(\/\).*/{
301   - s//\1/
302   - q
303   - }
304   - s/.*/./; q'
305   - `
306   -
  285 + dstdir=`dirname "$dst"`
307 286 test -d "$dstdir"
308 287 dstdir_status=$?
309 288 fi
... ... @@ -314,74 +293,81 @@ do
314 293 if test $dstdir_status != 0; then
315 294 case $posix_mkdir in
316 295 '')
317   - # Create intermediate dirs using mode 755 as modified by the umask.
318   - # This is like FreeBSD 'install' as of 1997-10-28.
319   - umask=`umask`
320   - case $stripcmd.$umask in
321   - # Optimize common cases.
322   - *[2367][2367]) mkdir_umask=$umask;;
323   - .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
324   -
325   - *[0-7])
326   - mkdir_umask=`expr $umask + 22 \
327   - - $umask % 100 % 40 + $umask % 20 \
328   - - $umask % 10 % 4 + $umask % 2
329   - `;;
330   - *) mkdir_umask=$umask,go-w;;
331   - esac
332   -
333   - # With -d, create the new directory with the user-specified mode.
334   - # Otherwise, rely on $mkdir_umask.
335   - if test -n "$dir_arg"; then
336   - mkdir_mode=-m$mode
337   - else
338   - mkdir_mode=
339   - fi
340   -
341   - posix_mkdir=false
342   - case $umask in
343   - *[123567][0-7][0-7])
344   - # POSIX mkdir -p sets u+wx bits regardless of umask, which
345   - # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
346   - ;;
347   - *)
348   - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
349   - trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
350   -
351   - if (umask $mkdir_umask &&
352   - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
353   - then
354   - if test -z "$dir_arg" || {
355   - # Check for POSIX incompatibilities with -m.
356   - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
357   - # other-writeable bit of parent directory when it shouldn't.
358   - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
359   - ls_ld_tmpdir=`ls -ld "$tmpdir"`
360   - case $ls_ld_tmpdir in
361   - d????-?r-*) different_mode=700;;
362   - d????-?--*) different_mode=755;;
363   - *) false;;
364   - esac &&
365   - $mkdirprog -m$different_mode -p -- "$tmpdir" && {
366   - ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
367   - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
368   - }
369   - }
370   - then posix_mkdir=:
371   - fi
372   - rmdir "$tmpdir/d" "$tmpdir"
373   - else
374   - # Remove any dirs left behind by ancient mkdir implementations.
375   - rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
376   - fi
377   - trap '' 0;;
378   - esac;;
  296 + # Create intermediate dirs using mode 755 as modified by the umask.
  297 + # This is like FreeBSD 'install' as of 1997-10-28.
  298 + umask=`umask`
  299 + case $stripcmd.$umask in
  300 + # Optimize common cases.
  301 + *[2367][2367]) mkdir_umask=$umask;;
  302 + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
  303 +
  304 + *[0-7])
  305 + mkdir_umask=`expr $umask + 22 \
  306 + - $umask % 100 % 40 + $umask % 20 \
  307 + - $umask % 10 % 4 + $umask % 2
  308 + `;;
  309 + *) mkdir_umask=$umask,go-w;;
  310 + esac
  311 +
  312 + # With -d, create the new directory with the user-specified mode.
  313 + # Otherwise, rely on $mkdir_umask.
  314 + if test -n "$dir_arg"; then
  315 + mkdir_mode=-m$mode
  316 + else
  317 + mkdir_mode=
  318 + fi
  319 +
  320 + posix_mkdir=false
  321 + case $umask in
  322 + *[123567][0-7][0-7])
  323 + # POSIX mkdir -p sets u+wx bits regardless of umask, which
  324 + # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
  325 + ;;
  326 + *)
  327 + # $RANDOM is not portable (e.g. dash); use it when possible to
  328 + # lower collision chance
  329 + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
  330 + trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
  331 +
  332 + # As "mkdir -p" follows symlinks and we work in /tmp possibly; so
  333 + # create the $tmpdir first (and fail if unsuccessful) to make sure
  334 + # that nobody tries to guess the $tmpdir name.
  335 + if (umask $mkdir_umask &&
  336 + $mkdirprog $mkdir_mode "$tmpdir" &&
  337 + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
  338 + then
  339 + if test -z "$dir_arg" || {
  340 + # Check for POSIX incompatibilities with -m.
  341 + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
  342 + # other-writable bit of parent directory when it shouldn't.
  343 + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
  344 + test_tmpdir="$tmpdir/a"
  345 + ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
  346 + case $ls_ld_tmpdir in
  347 + d????-?r-*) different_mode=700;;
  348 + d????-?--*) different_mode=755;;
  349 + *) false;;
  350 + esac &&
  351 + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
  352 + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
  353 + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
  354 + }
  355 + }
  356 + then posix_mkdir=:
  357 + fi
  358 + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
  359 + else
  360 + # Remove any dirs left behind by ancient mkdir implementations.
  361 + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
  362 + fi
  363 + trap '' 0;;
  364 + esac;;
379 365 esac
380 366  
381 367 if
382 368 $posix_mkdir && (
383   - umask $mkdir_umask &&
384   - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
  369 + umask $mkdir_umask &&
  370 + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
385 371 )
386 372 then :
387 373 else
... ... @@ -391,53 +377,51 @@ do
391 377 # directory the slow way, step by step, checking for races as we go.
392 378  
393 379 case $dstdir in
394   - /*) prefix='/';;
395   - [-=\(\)!]*) prefix='./';;
396   - *) prefix='';;
  380 + /*) prefix='/';;
  381 + [-=\(\)!]*) prefix='./';;
  382 + *) prefix='';;
397 383 esac
398 384  
399   - eval "$initialize_posix_glob"
400   -
401 385 oIFS=$IFS
402 386 IFS=/
403   - $posix_glob set -f
  387 + set -f
404 388 set fnord $dstdir
405 389 shift
406   - $posix_glob set +f
  390 + set +f
407 391 IFS=$oIFS
408 392  
409 393 prefixes=
410 394  
411 395 for d
412 396 do
413   - test X"$d" = X && continue
414   -
415   - prefix=$prefix$d
416   - if test -d "$prefix"; then
417   - prefixes=
418   - else
419   - if $posix_mkdir; then
420   - (umask=$mkdir_umask &&
421   - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
422   - # Don't fail if two instances are running concurrently.
423   - test -d "$prefix" || exit 1
424   - else
425   - case $prefix in
426   - *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
427   - *) qprefix=$prefix;;
428   - esac
429   - prefixes="$prefixes '$qprefix'"
430   - fi
431   - fi
432   - prefix=$prefix/
  397 + test X"$d" = X && continue
  398 +
  399 + prefix=$prefix$d
  400 + if test -d "$prefix"; then
  401 + prefixes=
  402 + else
  403 + if $posix_mkdir; then
  404 + (umask=$mkdir_umask &&
  405 + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
  406 + # Don't fail if two instances are running concurrently.
  407 + test -d "$prefix" || exit 1
  408 + else
  409 + case $prefix in
  410 + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
  411 + *) qprefix=$prefix;;
  412 + esac
  413 + prefixes="$prefixes '$qprefix'"
  414 + fi
  415 + fi
  416 + prefix=$prefix/
433 417 done
434 418  
435 419 if test -n "$prefixes"; then
436   - # Don't fail if two instances are running concurrently.
437   - (umask $mkdir_umask &&
438   - eval "\$doit_exec \$mkdirprog $prefixes") ||
439   - test -d "$dstdir" || exit 1
440   - obsolete_mkdir_used=true
  420 + # Don't fail if two instances are running concurrently.
  421 + (umask $mkdir_umask &&
  422 + eval "\$doit_exec \$mkdirprog $prefixes") ||
  423 + test -d "$dstdir" || exit 1
  424 + obsolete_mkdir_used=true
441 425 fi
442 426 fi
443 427 fi
... ... @@ -472,15 +456,12 @@ do
472 456  
473 457 # If -C, don't bother to copy if it wouldn't change the file.
474 458 if $copy_on_change &&
475   - old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
476   - new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
477   -
478   - eval "$initialize_posix_glob" &&
479   - $posix_glob set -f &&
  459 + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
  460 + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
  461 + set -f &&
480 462 set X $old && old=:$2:$4:$5:$6 &&
481 463 set X $new && new=:$2:$4:$5:$6 &&
482   - $posix_glob set +f &&
483   -
  464 + set +f &&
484 465 test "$old" = "$new" &&
485 466 $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
486 467 then
... ... @@ -493,24 +474,24 @@ do
493 474 # to itself, or perhaps because mv is so ancient that it does not
494 475 # support -f.
495 476 {
496   - # Now remove or move aside any old file at destination location.
497   - # We try this two ways since rm can't unlink itself on some
498   - # systems and the destination file might be busy for other
499   - # reasons. In this case, the final cleanup might fail but the new
500   - # file should still install successfully.
501   - {
502   - test ! -f "$dst" ||
503   - $doit $rmcmd -f "$dst" 2>/dev/null ||
504   - { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
505   - { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
506   - } ||
507   - { echo "$0: cannot unlink or rename $dst" >&2
508   - (exit 1); exit 1
509   - }
510   - } &&
511   -
512   - # Now rename the file to the real destination.
513   - $doit $mvcmd "$dsttmp" "$dst"
  477 + # Now remove or move aside any old file at destination location.
  478 + # We try this two ways since rm can't unlink itself on some
  479 + # systems and the destination file might be busy for other
  480 + # reasons. In this case, the final cleanup might fail but the new
  481 + # file should still install successfully.
  482 + {
  483 + test ! -f "$dst" ||
  484 + $doit $rmcmd -f "$dst" 2>/dev/null ||
  485 + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
  486 + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
  487 + } ||
  488 + { echo "$0: cannot unlink or rename $dst" >&2
  489 + (exit 1); exit 1
  490 + }
  491 + } &&
  492 +
  493 + # Now rename the file to the real destination.
  494 + $doit $mvcmd "$dsttmp" "$dst"
514 495 }
515 496 fi || exit 1
516 497  
... ...
mkinstalldirs
... ... @@ -81,9 +81,9 @@ case $dirmode in
81 81 echo "mkdir -p -- $*"
82 82 exec mkdir -p -- "$@"
83 83 else
84   - # On NextStep and OpenStep, the `mkdir' command does not
  84 + # On NextStep and OpenStep, the 'mkdir' command does not
85 85 # recognize any option. It will interpret all options as
86   - # directories to create, and then abort because `.' already
  86 + # directories to create, and then abort because '.' already
87 87 # exists.
88 88 test -d ./-p && rmdir ./-p
89 89 test -d ./--version && rmdir ./--version
... ...