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 #!/bin/sh 1 #!/bin/sh
2 # install - install a program, script, or datafile 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 # This originates from X11R5 (mit/util/scripts/install.sh), which was 6 # This originates from X11R5 (mit/util/scripts/install.sh), which was
7 # later released in X11R6 (xc/config/util/install.sh) with the 7 # later released in X11R6 (xc/config/util/install.sh) with the
@@ -35,25 +35,21 @@ scriptversion=2011-01-19.21; # UTC @@ -35,25 +35,21 @@ scriptversion=2011-01-19.21; # UTC
35 # FSF changes to this file are in the public domain. 35 # FSF changes to this file are in the public domain.
36 # 36 #
37 # Calling this script install-sh is preferred over install.sh, to prevent 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 # when there is no Makefile. 39 # when there is no Makefile.
40 # 40 #
41 # This script is compatible with the BSD install script, but was written 41 # This script is compatible with the BSD install script, but was written
42 # from scratch. 42 # from scratch.
43 43
  44 +tab=' '
44 nl=' 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 doit=${DOITPROG-} 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 # Put in absolute file names if you don't have them in your path; 54 # Put in absolute file names if you don't have them in your path;
59 # or use environment vars. 55 # or use environment vars.
@@ -68,17 +64,6 @@ mvprog=${MVPROG-mv} @@ -68,17 +64,6 @@ mvprog=${MVPROG-mv}
68 rmprog=${RMPROG-rm} 64 rmprog=${RMPROG-rm}
69 stripprog=${STRIPPROG-strip} 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 posix_mkdir= 67 posix_mkdir=
83 68
84 # Desired mode of installed file. 69 # Desired mode of installed file.
@@ -97,7 +82,7 @@ dir_arg= @@ -97,7 +82,7 @@ dir_arg=
97 dst_arg= 82 dst_arg=
98 83
99 copy_on_change=false 84 copy_on_change=false
100 -no_target_directory= 85 +is_target_a_directory=possibly
101 86
102 usage="\ 87 usage="\
103 Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE 88 Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
@@ -137,46 +122,57 @@ while test $# -ne 0; do @@ -137,46 +122,57 @@ while test $# -ne 0; do
137 -d) dir_arg=true;; 122 -d) dir_arg=true;;
138 123
139 -g) chgrpcmd="$chgrpprog $2" 124 -g) chgrpcmd="$chgrpprog $2"
140 - shift;; 125 + shift;;
141 126
142 --help) echo "$usage"; exit $?;; 127 --help) echo "$usage"; exit $?;;
143 128
144 -m) mode=$2 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 -o) chowncmd="$chownprog $2" 137 -o) chowncmd="$chownprog $2"
154 - shift;; 138 + shift;;
155 139
156 -s) stripcmd=$stripprog;; 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 --version) echo "$0 $scriptversion"; exit $?;; 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 *) break;; 161 *) break;;
176 esac 162 esac
177 shift 163 shift
178 done 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 if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 176 if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
181 # When -d is used, all remaining arguments are directories to create. 177 # When -d is used, all remaining arguments are directories to create.
182 # When -t is used, the destination is already specified. 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,7 +186,7 @@ if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
190 fi 186 fi
191 shift # arg 187 shift # arg
192 dst_arg=$arg 188 dst_arg=$arg
193 - # Protect names problematic for `test' and other utilities. 189 + # Protect names problematic for 'test' and other utilities.
194 case $dst_arg in 190 case $dst_arg in
195 -* | [=\(\)!]) dst_arg=./$dst_arg;; 191 -* | [=\(\)!]) dst_arg=./$dst_arg;;
196 esac 192 esac
@@ -202,12 +198,21 @@ if test $# -eq 0; then @@ -202,12 +198,21 @@ if test $# -eq 0; then
202 echo "$0: no input file specified." >&2 198 echo "$0: no input file specified." >&2
203 exit 1 199 exit 1
204 fi 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 # This can happen when creating conditional directories. 202 # This can happen when creating conditional directories.
207 exit 0 203 exit 0
208 fi 204 fi
209 205
210 if test -z "$dir_arg"; then 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 do_exit='(exit $ret); exit $ret' 216 do_exit='(exit $ret); exit $ret'
212 trap "ret=129; $do_exit" 1 217 trap "ret=129; $do_exit" 1
213 trap "ret=130; $do_exit" 2 218 trap "ret=130; $do_exit" 2
@@ -223,16 +228,16 @@ if test -z "$dir_arg"; then @@ -223,16 +228,16 @@ if test -z "$dir_arg"; then
223 228
224 *[0-7]) 229 *[0-7])
225 if test -z "$stripcmd"; then 230 if test -z "$stripcmd"; then
226 - u_plus_rw= 231 + u_plus_rw=
227 else 232 else
228 - u_plus_rw='% 200' 233 + u_plus_rw='% 200'
229 fi 234 fi
230 cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 235 cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
231 *) 236 *)
232 if test -z "$stripcmd"; then 237 if test -z "$stripcmd"; then
233 - u_plus_rw= 238 + u_plus_rw=
234 else 239 else
235 - u_plus_rw=,u+rw 240 + u_plus_rw=,u+rw
236 fi 241 fi
237 cp_umask=$mode$u_plus_rw;; 242 cp_umask=$mode$u_plus_rw;;
238 esac 243 esac
@@ -240,7 +245,7 @@ fi @@ -240,7 +245,7 @@ fi
240 245
241 for src 246 for src
242 do 247 do
243 - # Protect names problematic for `test' and other utilities. 248 + # Protect names problematic for 'test' and other utilities.
244 case $src in 249 case $src in
245 -* | [=\(\)!]) src=./$src;; 250 -* | [=\(\)!]) src=./$src;;
246 esac 251 esac
@@ -269,41 +274,15 @@ do @@ -269,41 +274,15 @@ do
269 # If destination is a directory, append the input filename; won't work 274 # If destination is a directory, append the input filename; won't work
270 # if double slashes aren't ignored. 275 # if double slashes aren't ignored.
271 if test -d "$dst"; then 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 fi 280 fi
276 dstdir=$dst 281 dstdir=$dst
277 dst=$dstdir/`basename "$src"` 282 dst=$dstdir/`basename "$src"`
278 dstdir_status=0 283 dstdir_status=0
279 else 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 test -d "$dstdir" 286 test -d "$dstdir"
308 dstdir_status=$? 287 dstdir_status=$?
309 fi 288 fi
@@ -314,74 +293,81 @@ do @@ -314,74 +293,81 @@ do
314 if test $dstdir_status != 0; then 293 if test $dstdir_status != 0; then
315 case $posix_mkdir in 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 esac 365 esac
380 366
381 if 367 if
382 $posix_mkdir && ( 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 then : 372 then :
387 else 373 else
@@ -391,53 +377,51 @@ do @@ -391,53 +377,51 @@ do
391 # directory the slow way, step by step, checking for races as we go. 377 # directory the slow way, step by step, checking for races as we go.
392 378
393 case $dstdir in 379 case $dstdir in
394 - /*) prefix='/';;  
395 - [-=\(\)!]*) prefix='./';;  
396 - *) prefix='';; 380 + /*) prefix='/';;
  381 + [-=\(\)!]*) prefix='./';;
  382 + *) prefix='';;
397 esac 383 esac
398 384
399 - eval "$initialize_posix_glob"  
400 -  
401 oIFS=$IFS 385 oIFS=$IFS
402 IFS=/ 386 IFS=/
403 - $posix_glob set -f 387 + set -f
404 set fnord $dstdir 388 set fnord $dstdir
405 shift 389 shift
406 - $posix_glob set +f 390 + set +f
407 IFS=$oIFS 391 IFS=$oIFS
408 392
409 prefixes= 393 prefixes=
410 394
411 for d 395 for d
412 do 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 done 417 done
434 418
435 if test -n "$prefixes"; then 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 fi 425 fi
442 fi 426 fi
443 fi 427 fi
@@ -472,15 +456,12 @@ do @@ -472,15 +456,12 @@ do
472 456
473 # If -C, don't bother to copy if it wouldn't change the file. 457 # If -C, don't bother to copy if it wouldn't change the file.
474 if $copy_on_change && 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 set X $old && old=:$2:$4:$5:$6 && 462 set X $old && old=:$2:$4:$5:$6 &&
481 set X $new && new=:$2:$4:$5:$6 && 463 set X $new && new=:$2:$4:$5:$6 &&
482 - $posix_glob set +f &&  
483 - 464 + set +f &&
484 test "$old" = "$new" && 465 test "$old" = "$new" &&
485 $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 466 $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
486 then 467 then
@@ -493,24 +474,24 @@ do @@ -493,24 +474,24 @@ do
493 # to itself, or perhaps because mv is so ancient that it does not 474 # to itself, or perhaps because mv is so ancient that it does not
494 # support -f. 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 fi || exit 1 496 fi || exit 1
516 497
mkinstalldirs
@@ -81,9 +81,9 @@ case $dirmode in @@ -81,9 +81,9 @@ case $dirmode in
81 echo "mkdir -p -- $*" 81 echo "mkdir -p -- $*"
82 exec mkdir -p -- "$@" 82 exec mkdir -p -- "$@"
83 else 83 else
84 - # On NextStep and OpenStep, the `mkdir' command does not 84 + # On NextStep and OpenStep, the 'mkdir' command does not
85 # recognize any option. It will interpret all options as 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 # exists. 87 # exists.
88 test -d ./-p && rmdir ./-p 88 test -d ./-p && rmdir ./-p
89 test -d ./--version && rmdir ./--version 89 test -d ./--version && rmdir ./--version