aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/build-aux/install-sh
diff options
context:
space:
mode:
Diffstat (limited to 'build-aux/install-sh')
-rwxr-xr-xbuild-aux/install-sh228
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
4scriptversion=2006-10-14.15 4scriptversion=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.
51doit="${DOITPROG-}" 51doit=${DOITPROG-}
52if test -z "$doit"; then 52if test -z "$doit"; then
53 doit_exec=exec 53 doit_exec=exec
54else 54else
@@ -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
61mvprog="${MVPROG-mv}" 61chgrpprog=${CHGRPPROG-chgrp}
62cpprog="${CPPROG-cp}" 62chmodprog=${CHMODPROG-chmod}
63chmodprog="${CHMODPROG-chmod}" 63chownprog=${CHOWNPROG-chown}
64chownprog="${CHOWNPROG-chown}" 64cmpprog=${CMPPROG-cmp}
65chgrpprog="${CHGRPPROG-chgrp}" 65cpprog=${CPPROG-cp}
66stripprog="${STRIPPROG-strip}" 66mkdirprog=${MKDIRPROG-mkdir}
67rmprog="${RMPROG-rm}" 67mvprog=${MVPROG-mv}
68mkdirprog="${MKDIRPROG-mkdir}" 68rmprog=${RMPROG-rm}
69stripprog=${STRIPPROG-strip}
70
71posix_glob='?'
72initialize_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
70posix_glob=
71posix_mkdir= 82posix_mkdir=
72 83
73# Desired mode of installed file. 84# Desired mode of installed file.
74mode=0755 85mode=0755
75 86
87chgrpcmd=
76chmodcmd=$chmodprog 88chmodcmd=$chmodprog
77chowncmd= 89chowncmd=
78chgrpcmd= 90mvcmd=$mvprog
79stripcmd=
80rmcmd="$rmprog -f" 91rmcmd="$rmprog -f"
81mvcmd="$mvprog" 92stripcmd=
93
82src= 94src=
83dst= 95dst=
84dir_arg= 96dir_arg=
85dstarg= 97dst_arg=
98
99copy_on_change=false
86no_target_directory= 100no_target_directory=
87 101
88usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE 102usage="\
103Usage: $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.
95In the 4th, create DIRECTORIES. 110In the 4th, create DIRECTORIES.
96 111
97Options: 112Options:
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
109Environment variables override the default commands: 126Environment 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
113while test $# -ne 0; do 131while 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
168done 174done
169 175
170if test $# -ne 0 && test -z "$dir_arg$dstarg"; then 176if 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
184fi 190fi
185 191
@@ -224,7 +230,7 @@ for src
224do 230do
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