diff options
Diffstat (limited to 'build-aux/install-sh')
| -rwxr-xr-x | build-aux/install-sh | 228 |
1 files changed, 120 insertions, 108 deletions
diff --git a/build-aux/install-sh b/build-aux/install-sh index 4fbbae7..a5897de 100755 --- a/build-aux/install-sh +++ b/build-aux/install-sh | |||
| @@ -1,7 +1,7 @@ | |||
| 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=2006-10-14.15 | 4 | scriptversion=2006-12-25.00 |
| 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 |
| @@ -48,7 +48,7 @@ IFS=" "" $nl" | |||
| 48 | # set DOITPROG to echo to test this script | 48 | # set DOITPROG to echo to test this script |
| 49 | 49 | ||
| 50 | # Don't use :- since 4.3BSD and earlier shells don't like it. | 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 | 52 | if test -z "$doit"; then |
| 53 | doit_exec=exec | 53 | doit_exec=exec |
| 54 | else | 54 | else |
| @@ -58,34 +58,49 @@ fi | |||
| 58 | # Put in absolute file names if you don't have them in your path; | 58 | # Put in absolute file names if you don't have them in your path; |
| 59 | # or use environment vars. | 59 | # or use environment vars. |
| 60 | 60 | ||
| 61 | mvprog="${MVPROG-mv}" | 61 | chgrpprog=${CHGRPPROG-chgrp} |
| 62 | cpprog="${CPPROG-cp}" | 62 | chmodprog=${CHMODPROG-chmod} |
| 63 | chmodprog="${CHMODPROG-chmod}" | 63 | chownprog=${CHOWNPROG-chown} |
| 64 | chownprog="${CHOWNPROG-chown}" | 64 | cmpprog=${CMPPROG-cmp} |
| 65 | chgrpprog="${CHGRPPROG-chgrp}" | 65 | cpprog=${CPPROG-cp} |
| 66 | stripprog="${STRIPPROG-strip}" | 66 | mkdirprog=${MKDIRPROG-mkdir} |
| 67 | rmprog="${RMPROG-rm}" | 67 | mvprog=${MVPROG-mv} |
| 68 | mkdirprog="${MKDIRPROG-mkdir}" | 68 | rmprog=${RMPROG-rm} |
| 69 | stripprog=${STRIPPROG-strip} | ||
| 70 | |||
| 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 | ' | ||
| 69 | 81 | ||
| 70 | posix_glob= | ||
| 71 | posix_mkdir= | 82 | posix_mkdir= |
| 72 | 83 | ||
| 73 | # Desired mode of installed file. | 84 | # Desired mode of installed file. |
| 74 | mode=0755 | 85 | mode=0755 |
| 75 | 86 | ||
| 87 | chgrpcmd= | ||
| 76 | chmodcmd=$chmodprog | 88 | chmodcmd=$chmodprog |
| 77 | chowncmd= | 89 | chowncmd= |
| 78 | chgrpcmd= | 90 | mvcmd=$mvprog |
| 79 | stripcmd= | ||
| 80 | rmcmd="$rmprog -f" | 91 | rmcmd="$rmprog -f" |
| 81 | mvcmd="$mvprog" | 92 | stripcmd= |
| 93 | |||
| 82 | src= | 94 | src= |
| 83 | dst= | 95 | dst= |
| 84 | dir_arg= | 96 | dir_arg= |
| 85 | dstarg= | 97 | dst_arg= |
| 98 | |||
| 99 | copy_on_change=false | ||
| 86 | no_target_directory= | 100 | no_target_directory= |
| 87 | 101 | ||
| 88 | usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE | 102 | usage="\ |
| 103 | Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE | ||
| 89 | or: $0 [OPTION]... SRCFILES... DIRECTORY | 104 | or: $0 [OPTION]... SRCFILES... DIRECTORY |
| 90 | or: $0 [OPTION]... -t DIRECTORY SRCFILES... | 105 | or: $0 [OPTION]... -t DIRECTORY SRCFILES... |
| 91 | or: $0 [OPTION]... -d DIRECTORIES... | 106 | or: $0 [OPTION]... -d DIRECTORIES... |
| @@ -95,65 +110,55 @@ In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. | |||
| 95 | In the 4th, create DIRECTORIES. | 110 | In the 4th, create DIRECTORIES. |
| 96 | 111 | ||
| 97 | Options: | 112 | Options: |
| 98 | -c (ignored) | 113 | --help display this help and exit. |
| 99 | -d create directories instead of installing files. | 114 | --version display version info and exit. |
| 100 | -g GROUP $chgrpprog installed files to GROUP. | 115 | |
| 101 | -m MODE $chmodprog installed files to MODE. | 116 | -c (ignored) |
| 102 | -o USER $chownprog installed files to USER. | 117 | -C install only if different (preserve the last data modification time) |
| 103 | -s $stripprog installed files. | 118 | -d create directories instead of installing files. |
| 104 | -t DIRECTORY install into DIRECTORY. | 119 | -g GROUP $chgrpprog installed files to GROUP. |
| 105 | -T report an error if DSTFILE is a directory. | 120 | -m MODE $chmodprog installed files to MODE. |
| 106 | --help display this help and exit. | 121 | -o USER $chownprog installed files to USER. |
| 107 | --version display version info and exit. | 122 | -s $stripprog installed files. |
| 123 | -t DIRECTORY install into DIRECTORY. | ||
| 124 | -T report an error if DSTFILE is a directory. | ||
| 108 | 125 | ||
| 109 | Environment variables override the default commands: | 126 | Environment variables override the default commands: |
| 110 | CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG | 127 | CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG |
| 128 | RMPROG STRIPPROG | ||
| 111 | " | 129 | " |
| 112 | 130 | ||
| 113 | while test $# -ne 0; do | 131 | while test $# -ne 0; do |
| 114 | case $1 in | 132 | case $1 in |
| 115 | -c) shift | 133 | -c) ;; |
| 116 | continue;; | 134 | |
| 135 | -C) copy_on_change=true;; | ||
| 117 | 136 | ||
| 118 | -d) dir_arg=true | 137 | -d) dir_arg=true;; |
| 119 | shift | ||
| 120 | continue;; | ||
| 121 | 138 | ||
| 122 | -g) chgrpcmd="$chgrpprog $2" | 139 | -g) chgrpcmd="$chgrpprog $2" |
| 123 | shift | 140 | shift;; |
| 124 | shift | ||
| 125 | continue;; | ||
| 126 | 141 | ||
| 127 | --help) echo "$usage"; exit $?;; | 142 | --help) echo "$usage"; exit $?;; |
| 128 | 143 | ||
| 129 | -m) mode=$2 | 144 | -m) mode=$2 |
| 130 | shift | ||
| 131 | shift | ||
| 132 | case $mode in | 145 | case $mode in |
| 133 | *' '* | *' '* | *' | 146 | *' '* | *' '* | *' |
| 134 | '* | *'*'* | *'?'* | *'['*) | 147 | '* | *'*'* | *'?'* | *'['*) |
| 135 | echo "$0: invalid mode: $mode" >&2 | 148 | echo "$0: invalid mode: $mode" >&2 |
| 136 | exit 1;; | 149 | exit 1;; |
| 137 | esac | 150 | esac |
| 138 | continue;; | 151 | shift;; |
| 139 | 152 | ||
| 140 | -o) chowncmd="$chownprog $2" | 153 | -o) chowncmd="$chownprog $2" |
| 141 | shift | 154 | shift;; |
| 142 | shift | ||
| 143 | continue;; | ||
| 144 | 155 | ||
| 145 | -s) stripcmd=$stripprog | 156 | -s) stripcmd=$stripprog;; |
| 146 | shift | ||
| 147 | continue;; | ||
| 148 | 157 | ||
| 149 | -t) dstarg=$2 | 158 | -t) dst_arg=$2 |
| 150 | shift | 159 | shift;; |
| 151 | shift | ||
| 152 | continue;; | ||
| 153 | 160 | ||
| 154 | -T) no_target_directory=true | 161 | -T) no_target_directory=true;; |
| 155 | shift | ||
| 156 | continue;; | ||
| 157 | 162 | ||
| 158 | --version) echo "$0 $scriptversion"; exit $?;; | 163 | --version) echo "$0 $scriptversion"; exit $?;; |
| 159 | 164 | ||
| @@ -165,21 +170,22 @@ while test $# -ne 0; do | |||
| 165 | 170 | ||
| 166 | *) break;; | 171 | *) break;; |
| 167 | esac | 172 | esac |
| 173 | shift | ||
| 168 | done | 174 | done |
| 169 | 175 | ||
| 170 | if test $# -ne 0 && test -z "$dir_arg$dstarg"; then | 176 | if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then |
| 171 | # When -d is used, all remaining arguments are directories to create. | 177 | # When -d is used, all remaining arguments are directories to create. |
| 172 | # When -t is used, the destination is already specified. | 178 | # When -t is used, the destination is already specified. |
| 173 | # Otherwise, the last argument is the destination. Remove it from $@. | 179 | # Otherwise, the last argument is the destination. Remove it from $@. |
| 174 | for arg | 180 | for arg |
| 175 | do | 181 | do |
| 176 | if test -n "$dstarg"; then | 182 | if test -n "$dst_arg"; then |
| 177 | # $@ is not empty: it contains at least $arg. | 183 | # $@ is not empty: it contains at least $arg. |
| 178 | set fnord "$@" "$dstarg" | 184 | set fnord "$@" "$dst_arg" |
| 179 | shift # fnord | 185 | shift # fnord |
| 180 | fi | 186 | fi |
| 181 | shift # arg | 187 | shift # arg |
| 182 | dstarg=$arg | 188 | dst_arg=$arg |
| 183 | done | 189 | done |
| 184 | fi | 190 | fi |
| 185 | 191 | ||
| @@ -224,7 +230,7 @@ for src | |||
| 224 | do | 230 | do |
| 225 | # Protect names starting with `-'. | 231 | # Protect names starting with `-'. |
| 226 | case $src in | 232 | case $src in |
| 227 | -*) src=./$src ;; | 233 | -*) src=./$src;; |
| 228 | esac | 234 | esac |
| 229 | 235 | ||
| 230 | if test -n "$dir_arg"; then | 236 | if test -n "$dir_arg"; then |
| @@ -242,22 +248,22 @@ do | |||
| 242 | exit 1 | 248 | exit 1 |
| 243 | fi | 249 | fi |
| 244 | 250 | ||
| 245 | if test -z "$dstarg"; then | 251 | if test -z "$dst_arg"; then |
| 246 | echo "$0: no destination specified." >&2 | 252 | echo "$0: no destination specified." >&2 |
| 247 | exit 1 | 253 | exit 1 |
| 248 | fi | 254 | fi |
| 249 | 255 | ||
| 250 | dst=$dstarg | 256 | dst=$dst_arg |
| 251 | # Protect names starting with `-'. | 257 | # Protect names starting with `-'. |
| 252 | case $dst in | 258 | case $dst in |
| 253 | -*) dst=./$dst ;; | 259 | -*) dst=./$dst;; |
| 254 | esac | 260 | esac |
| 255 | 261 | ||
| 256 | # If destination is a directory, append the input filename; won't work | 262 | # If destination is a directory, append the input filename; won't work |
| 257 | # if double slashes aren't ignored. | 263 | # if double slashes aren't ignored. |
| 258 | if test -d "$dst"; then | 264 | if test -d "$dst"; then |
| 259 | if test -n "$no_target_directory"; then | 265 | if test -n "$no_target_directory"; then |
| 260 | echo "$0: $dstarg: Is a directory" >&2 | 266 | echo "$0: $dst_arg: Is a directory" >&2 |
| 261 | exit 1 | 267 | exit 1 |
| 262 | fi | 268 | fi |
| 263 | dstdir=$dst | 269 | dstdir=$dst |
| @@ -378,26 +384,19 @@ do | |||
| 378 | # directory the slow way, step by step, checking for races as we go. | 384 | # directory the slow way, step by step, checking for races as we go. |
| 379 | 385 | ||
| 380 | case $dstdir in | 386 | case $dstdir in |
| 381 | /*) prefix=/ ;; | 387 | /*) prefix='/';; |
| 382 | -*) prefix=./ ;; | 388 | -*) prefix='./';; |
| 383 | *) prefix= ;; | 389 | *) prefix='';; |
| 384 | esac | 390 | esac |
| 385 | 391 | ||
| 386 | case $posix_glob in | 392 | eval "$initialize_posix_glob" |
| 387 | '') | ||
| 388 | if (set -f) 2>/dev/null; then | ||
| 389 | posix_glob=true | ||
| 390 | else | ||
| 391 | posix_glob=false | ||
| 392 | fi ;; | ||
| 393 | esac | ||
| 394 | 393 | ||
| 395 | oIFS=$IFS | 394 | oIFS=$IFS |
| 396 | IFS=/ | 395 | IFS=/ |
| 397 | $posix_glob && set -f | 396 | $posix_glob set -f |
| 398 | set fnord $dstdir | 397 | set fnord $dstdir |
| 399 | shift | 398 | shift |
| 400 | $posix_glob && set +f | 399 | $posix_glob set +f |
| 401 | IFS=$oIFS | 400 | IFS=$oIFS |
| 402 | 401 | ||
| 403 | prefixes= | 402 | prefixes= |
| @@ -459,41 +458,54 @@ do | |||
| 459 | # ignore errors from any of these, just make sure not to ignore | 458 | # ignore errors from any of these, just make sure not to ignore |
| 460 | # errors from the above "$doit $cpprog $src $dsttmp" command. | 459 | # errors from the above "$doit $cpprog $src $dsttmp" command. |
| 461 | # | 460 | # |
| 462 | { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ | 461 | { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && |
| 463 | && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ | 462 | { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && |
| 464 | && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ | 463 | { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && |
| 465 | && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && | 464 | { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && |
| 466 | 465 | ||
| 467 | # Now rename the file to the real destination. | 466 | # If -C, don't bother to copy if it wouldn't change the file. |
| 468 | { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \ | 467 | if $copy_on_change && |
| 469 | || { | 468 | old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && |
| 470 | # The rename failed, perhaps because mv can't rename something else | 469 | new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && |
| 471 | # to itself, or perhaps because mv is so ancient that it does not | 470 | |
| 472 | # support -f. | 471 | eval "$initialize_posix_glob" && |
| 473 | 472 | $posix_glob set -f && | |
| 474 | # Now remove or move aside any old file at destination location. | 473 | set X $old && old=:$2:$4:$5:$6 && |
| 475 | # We try this two ways since rm can't unlink itself on some | 474 | set X $new && new=:$2:$4:$5:$6 && |
| 476 | # systems and the destination file might be busy for other | 475 | $posix_glob set +f && |
| 477 | # reasons. In this case, the final cleanup might fail but the new | 476 | |
| 478 | # file should still install successfully. | 477 | test "$old" = "$new" && |
| 479 | { | 478 | $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 |
| 480 | if test -f "$dst"; then | 479 | then |
| 481 | $doit $rmcmd -f "$dst" 2>/dev/null \ | 480 | rm -f "$dsttmp" |
| 482 | || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \ | 481 | else |
| 483 | && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\ | 482 | # Rename the file to the real destination. |
| 484 | || { | 483 | $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || |
| 485 | echo "$0: cannot unlink or rename $dst" >&2 | 484 | |
| 486 | (exit 1); exit 1 | 485 | # The rename failed, perhaps because mv can't rename something else |
| 487 | } | 486 | # to itself, or perhaps because mv is so ancient that it does not |
| 488 | else | 487 | # support -f. |
| 489 | : | 488 | { |
| 490 | fi | 489 | # Now remove or move aside any old file at destination location. |
| 491 | } && | 490 | # We try this two ways since rm can't unlink itself on some |
| 492 | 491 | # systems and the destination file might be busy for other | |
| 493 | # Now rename the file to the real destination. | 492 | # reasons. In this case, the final cleanup might fail but the new |
| 494 | $doit $mvcmd "$dsttmp" "$dst" | 493 | # file should still install successfully. |
| 495 | } | 494 | { |
| 496 | } || exit 1 | 495 | test ! -f "$dst" || |
| 496 | $doit $rmcmd -f "$dst" 2>/dev/null || | ||
| 497 | { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && | ||
| 498 | { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } | ||
| 499 | } || | ||
| 500 | { echo "$0: cannot unlink or rename $dst" >&2 | ||
| 501 | (exit 1); exit 1 | ||
| 502 | } | ||
| 503 | } && | ||
| 504 | |||
| 505 | # Now rename the file to the real destination. | ||
| 506 | $doit $mvcmd "$dsttmp" "$dst" | ||
| 507 | } | ||
| 508 | fi || exit 1 | ||
| 497 | 509 | ||
| 498 | trap '' 0 | 510 | trap '' 0 |
| 499 | fi | 511 | fi |
