Mercurial > hg > octave-nkf > gnulib-hg
annotate config/install-sh @ 5370:bb7980b5d340
autoupdate
author | Karl Berry <karl@freefriends.org> |
---|---|
date | Wed, 27 Oct 2004 12:01:54 +0000 |
parents | ebd743b5b6dd |
children | 82919f0f1591 |
rev | line source |
---|---|
3742 | 1 #!/bin/sh |
2 # install - install a program, script, or datafile | |
4322 | 3 |
5370 | 4 scriptversion=2004-10-22.00 |
4322 | 5 |
6 # This originates from X11R5 (mit/util/scripts/install.sh), which was | |
7 # later released in X11R6 (xc/config/util/install.sh) with the | |
8 # following copyright and license. | |
3742 | 9 # |
4322 | 10 # Copyright (C) 1994 X Consortium |
11 # | |
12 # Permission is hereby granted, free of charge, to any person obtaining a copy | |
13 # of this software and associated documentation files (the "Software"), to | |
14 # deal in the Software without restriction, including without limitation the | |
15 # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | |
16 # sell copies of the Software, and to permit persons to whom the Software is | |
17 # furnished to do so, subject to the following conditions: | |
3742 | 18 # |
4322 | 19 # The above copyright notice and this permission notice shall be included in |
20 # all copies or substantial portions of the Software. | |
21 # | |
22 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
23 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
24 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
25 # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN | |
26 # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- | |
27 # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
28 # | |
29 # Except as contained in this notice, the name of the X Consortium shall not | |
30 # be used in advertising or otherwise to promote the sale, use or other deal- | |
31 # ings in this Software without prior written authorization from the X Consor- | |
32 # tium. | |
33 # | |
34 # | |
35 # FSF changes to this file are in the public domain. | |
3742 | 36 # |
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 | |
39 # when there is no Makefile. | |
40 # | |
41 # This script is compatible with the BSD install script, but was written | |
42 # from scratch. It can only install one file at a time, a restriction | |
43 # shared with many OS's install programs. | |
44 | |
45 # set DOITPROG to echo to test this script | |
46 | |
47 # Don't use :- since 4.3BSD and earlier shells don't like it. | |
48 doit="${DOITPROG-}" | |
49 | |
50 # put in absolute paths if you don't have them in your path; or use env. vars. | |
51 | |
52 mvprog="${MVPROG-mv}" | |
53 cpprog="${CPPROG-cp}" | |
54 chmodprog="${CHMODPROG-chmod}" | |
55 chownprog="${CHOWNPROG-chown}" | |
56 chgrpprog="${CHGRPPROG-chgrp}" | |
57 stripprog="${STRIPPROG-strip}" | |
58 rmprog="${RMPROG-rm}" | |
59 mkdirprog="${MKDIRPROG-mkdir}" | |
60 | |
61 chmodcmd="$chmodprog 0755" | |
4322 | 62 chowncmd= |
63 chgrpcmd= | |
64 stripcmd= | |
3742 | 65 rmcmd="$rmprog -f" |
66 mvcmd="$mvprog" | |
4322 | 67 src= |
68 dst= | |
69 dir_arg= | |
5100 | 70 dstarg= |
71 no_target_directory= | |
3742 | 72 |
5100 | 73 usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE |
4903 | 74 or: $0 [OPTION]... SRCFILES... DIRECTORY |
5100 | 75 or: $0 [OPTION]... -t DIRECTORY SRCFILES... |
76 or: $0 [OPTION]... -d DIRECTORIES... | |
4322 | 77 |
5100 | 78 In the 1st form, copy SRCFILE to DSTFILE. |
79 In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. | |
80 In the 4th, create DIRECTORIES. | |
3742 | 81 |
4322 | 82 Options: |
5100 | 83 -c (ignored) |
4322 | 84 -d create directories instead of installing files. |
5100 | 85 -g GROUP $chgrpprog installed files to GROUP. |
86 -m MODE $chmodprog installed files to MODE. | |
87 -o USER $chownprog installed files to USER. | |
88 -s $stripprog installed files. | |
89 -t DIRECTORY install into DIRECTORY. | |
90 -T report an error if DSTFILE is a directory. | |
4322 | 91 --help display this help and exit. |
92 --version display version info and exit. | |
3742 | 93 |
4322 | 94 Environment variables override the default commands: |
95 CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG | |
96 " | |
3742 | 97 |
4322 | 98 while test -n "$1"; do |
99 case $1 in | |
5100 | 100 -c) shift |
4536
3358eb550c86
Leave whitespace alone when importing, undoing that part of yesterday's
Paul Eggert <eggert@cs.ucla.edu>
parents:
4533
diff
changeset
|
101 continue;; |
3742 | 102 |
4322 | 103 -d) dir_arg=true |
4536
3358eb550c86
Leave whitespace alone when importing, undoing that part of yesterday's
Paul Eggert <eggert@cs.ucla.edu>
parents:
4533
diff
changeset
|
104 shift |
3358eb550c86
Leave whitespace alone when importing, undoing that part of yesterday's
Paul Eggert <eggert@cs.ucla.edu>
parents:
4533
diff
changeset
|
105 continue;; |
4322 | 106 |
107 -g) chgrpcmd="$chgrpprog $2" | |
4536
3358eb550c86
Leave whitespace alone when importing, undoing that part of yesterday's
Paul Eggert <eggert@cs.ucla.edu>
parents:
4533
diff
changeset
|
108 shift |
3358eb550c86
Leave whitespace alone when importing, undoing that part of yesterday's
Paul Eggert <eggert@cs.ucla.edu>
parents:
4533
diff
changeset
|
109 shift |
3358eb550c86
Leave whitespace alone when importing, undoing that part of yesterday's
Paul Eggert <eggert@cs.ucla.edu>
parents:
4533
diff
changeset
|
110 continue;; |
3742 | 111 |
4322 | 112 --help) echo "$usage"; exit 0;; |
3742 | 113 |
4322 | 114 -m) chmodcmd="$chmodprog $2" |
4536
3358eb550c86
Leave whitespace alone when importing, undoing that part of yesterday's
Paul Eggert <eggert@cs.ucla.edu>
parents:
4533
diff
changeset
|
115 shift |
3358eb550c86
Leave whitespace alone when importing, undoing that part of yesterday's
Paul Eggert <eggert@cs.ucla.edu>
parents:
4533
diff
changeset
|
116 shift |
3358eb550c86
Leave whitespace alone when importing, undoing that part of yesterday's
Paul Eggert <eggert@cs.ucla.edu>
parents:
4533
diff
changeset
|
117 continue;; |
4322 | 118 |
119 -o) chowncmd="$chownprog $2" | |
4536
3358eb550c86
Leave whitespace alone when importing, undoing that part of yesterday's
Paul Eggert <eggert@cs.ucla.edu>
parents:
4533
diff
changeset
|
120 shift |
3358eb550c86
Leave whitespace alone when importing, undoing that part of yesterday's
Paul Eggert <eggert@cs.ucla.edu>
parents:
4533
diff
changeset
|
121 shift |
3358eb550c86
Leave whitespace alone when importing, undoing that part of yesterday's
Paul Eggert <eggert@cs.ucla.edu>
parents:
4533
diff
changeset
|
122 continue;; |
3742 | 123 |
4322 | 124 -s) stripcmd=$stripprog |
4536
3358eb550c86
Leave whitespace alone when importing, undoing that part of yesterday's
Paul Eggert <eggert@cs.ucla.edu>
parents:
4533
diff
changeset
|
125 shift |
3358eb550c86
Leave whitespace alone when importing, undoing that part of yesterday's
Paul Eggert <eggert@cs.ucla.edu>
parents:
4533
diff
changeset
|
126 continue;; |
4322 | 127 |
5100 | 128 -t) dstarg=$2 |
129 shift | |
130 shift | |
131 continue;; | |
132 | |
133 -T) no_target_directory=true | |
134 shift | |
135 continue;; | |
4322 | 136 |
137 --version) echo "$0 $scriptversion"; exit 0;; | |
3742 | 138 |
4903 | 139 *) # When -d is used, all remaining arguments are directories to create. |
5100 | 140 # When -t is used, the destination is already specified. |
141 test -n "$dir_arg$dstarg" && break | |
4903 | 142 # Otherwise, the last argument is the destination. Remove it from $@. |
143 for arg | |
144 do | |
145 if test -n "$dstarg"; then | |
4904 | 146 # $@ is not empty: it contains at least $arg. |
4903 | 147 set fnord "$@" "$dstarg" |
4904 | 148 shift # fnord |
4903 | 149 fi |
4904 | 150 shift # arg |
4903 | 151 dstarg=$arg |
152 done | |
153 break;; | |
4322 | 154 esac |
3742 | 155 done |
156 | |
4903 | 157 if test -z "$1"; then |
158 if test -z "$dir_arg"; then | |
159 echo "$0: no input file specified." >&2 | |
4322 | 160 exit 1 |
161 fi | |
4903 | 162 # It's OK to call `install-sh -d' without argument. |
163 # This can happen when creating conditional directories. | |
164 exit 0 | |
3742 | 165 fi |
166 | |
4903 | 167 for src |
168 do | |
169 # Protect names starting with `-'. | |
170 case $src in | |
171 -*) src=./$src ;; | |
172 esac | |
3742 | 173 |
4903 | 174 if test -n "$dir_arg"; then |
175 dst=$src | |
176 src= | |
3742 | 177 |
4903 | 178 if test -d "$dst"; then |
5100 | 179 mkdircmd=: |
4903 | 180 chmodcmd= |
181 else | |
5100 | 182 mkdircmd=$mkdirprog |
4903 | 183 fi |
184 else | |
5100 | 185 # Waiting for this to be detected by the "$cpprog $src $dsttmp" command |
4903 | 186 # might cause directories to be created, which would be especially bad |
187 # if $src (and thus $dsttmp) contains '*'. | |
188 if test ! -f "$src" && test ! -d "$src"; then | |
189 echo "$0: $src does not exist." >&2 | |
190 exit 1 | |
191 fi | |
3742 | 192 |
4903 | 193 if test -z "$dstarg"; then |
194 echo "$0: no destination specified." >&2 | |
195 exit 1 | |
196 fi | |
3742 | 197 |
4903 | 198 dst=$dstarg |
199 # Protect names starting with `-'. | |
200 case $dst in | |
201 -*) dst=./$dst ;; | |
202 esac | |
203 | |
204 # If destination is a directory, append the input filename; won't work | |
205 # if double slashes aren't ignored. | |
206 if test -d "$dst"; then | |
5100 | 207 if test -n "$no_target_directory"; then |
208 echo "$0: $dstarg: Is a directory" >&2 | |
209 exit 1 | |
210 fi | |
4903 | 211 dst=$dst/`basename "$src"` |
212 fi | |
4322 | 213 fi |
3742 | 214 |
4903 | 215 # This sed command emulates the dirname command. |
5370 | 216 dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` |
4903 | 217 |
218 # Make sure that the destination directory exists. | |
4322 | 219 |
4903 | 220 # Skip lots of stat calls in the usual case. |
221 if test ! -d "$dstdir"; then | |
222 defaultIFS=' | |
4905 | 223 ' |
4903 | 224 IFS="${IFS-$defaultIFS}" |
225 | |
226 oIFS=$IFS | |
227 # Some sh's can't handle IFS=/ for some reason. | |
228 IFS='%' | |
5370 | 229 set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` |
230 shift | |
4903 | 231 IFS=$oIFS |
232 | |
233 pathcomp= | |
3742 | 234 |
4903 | 235 while test $# -ne 0 ; do |
236 pathcomp=$pathcomp$1 | |
237 shift | |
4952 | 238 if test ! -d "$pathcomp"; then |
5100 | 239 $mkdirprog "$pathcomp" |
4952 | 240 # mkdir can fail with a `File exist' error in case several |
241 # install-sh are creating the directory concurrently. This | |
242 # is OK. | |
5100 | 243 test -d "$pathcomp" || exit |
4952 | 244 fi |
4903 | 245 pathcomp=$pathcomp/ |
246 done | |
247 fi | |
3742 | 248 |
4903 | 249 if test -n "$dir_arg"; then |
5100 | 250 $doit $mkdircmd "$dst" \ |
4903 | 251 && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ |
252 && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ | |
253 && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ | |
254 && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } | |
255 | |
256 else | |
5100 | 257 dstfile=`basename "$dst"` |
4903 | 258 |
259 # Make a couple of temp file names in the proper directory. | |
260 dsttmp=$dstdir/_inst.$$_ | |
261 rmtmp=$dstdir/_rm.$$_ | |
262 | |
263 # Trap to clean up those temp files at exit. | |
5233 | 264 trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 |
4903 | 265 trap '(exit $?); exit' 1 2 13 15 |
266 | |
5100 | 267 # Copy the file name to the temp name. |
268 $doit $cpprog "$src" "$dsttmp" && | |
3742 | 269 |
4903 | 270 # and set any options; do chmod last to preserve setuid bits. |
271 # | |
272 # If any of these fail, we abort the whole thing. If we want to | |
273 # ignore errors from any of these, just make sure not to ignore | |
5100 | 274 # errors from the above "$doit $cpprog $src $dsttmp" command. |
4903 | 275 # |
276 { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ | |
277 && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ | |
278 && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ | |
279 && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && | |
3742 | 280 |
4998 | 281 # Now rename the file to the real destination. |
282 { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ | |
283 || { | |
284 # The rename failed, perhaps because mv can't rename something else | |
285 # to itself, or perhaps because mv is so ancient that it does not | |
286 # support -f. | |
4903 | 287 |
4998 | 288 # Now remove or move aside any old file at destination location. |
289 # We try this two ways since rm can't unlink itself on some | |
290 # systems and the destination file might be busy for other | |
291 # reasons. In this case, the final cleanup might fail but the new | |
292 # file should still install successfully. | |
293 { | |
294 if test -f "$dstdir/$dstfile"; then | |
295 $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ | |
296 || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ | |
297 || { | |
298 echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 | |
299 (exit 1); exit | |
300 } | |
301 else | |
302 : | |
303 fi | |
304 } && | |
305 | |
306 # Now rename the file to the real destination. | |
307 $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" | |
308 } | |
309 } | |
4903 | 310 fi || { (exit 1); exit; } |
311 done | |
3742 | 312 |
313 # The final little trick to "correctly" pass the exit status to the exit trap. | |
4322 | 314 { |
315 (exit 0); exit | |
316 } | |
3742 | 317 |
4322 | 318 # Local variables: |
319 # eval: (add-hook 'write-file-hooks 'time-stamp) | |
320 # time-stamp-start: "scriptversion=" | |
321 # time-stamp-format: "%:y-%02m-%02d.%02H" | |
322 # time-stamp-end: "$" | |
323 # End: |