ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/hopm/trunk/install-sh
Revision: 8551
Committed: Sat Sep 22 20:56:15 2018 UTC (7 years, 9 months ago) by michael
File size: 14676 byte(s)
Log Message:
- Re-create autogenerated files

File Contents

# User Rev Content
1 michael 5052 #!/bin/sh
2     # install - install a program, script, or datafile
3 michael 5059
4 michael 8551 scriptversion=2016-01-11.22; # UTC
5 michael 5059
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.
9 michael 5052 #
10 michael 5059 # Copyright (C) 1994 X Consortium
11 michael 5052 #
12 michael 5059 # 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:
18 michael 5052 #
19 michael 5059 # 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.
36     #
37 michael 5052 # Calling this script install-sh is preferred over install.sh, to prevent
38 michael 5059 # 'make' implicit rules from creating a file called install from it
39 michael 5052 # when there is no Makefile.
40     #
41     # This script is compatible with the BSD install script, but was written
42 michael 5059 # from scratch.
43 michael 5052
44 michael 5352 tab=' '
45 michael 5059 nl='
46     '
47 michael 5352 IFS=" $tab$nl"
48 michael 5052
49 michael 5352 # Set DOITPROG to "echo" to test this script.
50 michael 5052
51 michael 5059 doit=${DOITPROG-}
52 michael 5352 doit_exec=${doit:-exec}
53 michael 5052
54 michael 5059 # Put in absolute file names if you don't have them in your path;
55     # or use environment vars.
56 michael 5052
57 michael 5059 chgrpprog=${CHGRPPROG-chgrp}
58     chmodprog=${CHMODPROG-chmod}
59     chownprog=${CHOWNPROG-chown}
60     cmpprog=${CMPPROG-cmp}
61     cpprog=${CPPROG-cp}
62     mkdirprog=${MKDIRPROG-mkdir}
63     mvprog=${MVPROG-mv}
64     rmprog=${RMPROG-rm}
65     stripprog=${STRIPPROG-strip}
66 michael 5052
67 michael 5059 posix_mkdir=
68    
69     # Desired mode of installed file.
70     mode=0755
71    
72     chgrpcmd=
73     chmodcmd=$chmodprog
74     chowncmd=
75     mvcmd=$mvprog
76 michael 5052 rmcmd="$rmprog -f"
77 michael 5059 stripcmd=
78 michael 5052
79 michael 5059 src=
80     dst=
81     dir_arg=
82     dst_arg=
83 michael 5052
84 michael 5059 copy_on_change=false
85 michael 5352 is_target_a_directory=possibly
86 michael 5052
87 michael 5059 usage="\
88     Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
89     or: $0 [OPTION]... SRCFILES... DIRECTORY
90     or: $0 [OPTION]... -t DIRECTORY SRCFILES...
91     or: $0 [OPTION]... -d DIRECTORIES...
92 michael 5052
93 michael 5059 In the 1st form, copy SRCFILE to DSTFILE.
94     In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
95     In the 4th, create DIRECTORIES.
96 michael 5052
97 michael 5059 Options:
98     --help display this help and exit.
99     --version display version info and exit.
100 michael 5052
101 michael 5059 -c (ignored)
102     -C install only if different (preserve the last data modification time)
103     -d create directories instead of installing files.
104     -g GROUP $chgrpprog installed files to GROUP.
105     -m MODE $chmodprog installed files to MODE.
106     -o USER $chownprog installed files to USER.
107     -s $stripprog installed files.
108     -t DIRECTORY install into DIRECTORY.
109     -T report an error if DSTFILE is a directory.
110 michael 5052
111 michael 5059 Environment variables override the default commands:
112     CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
113     RMPROG STRIPPROG
114     "
115 michael 5052
116 michael 5059 while test $# -ne 0; do
117     case $1 in
118     -c) ;;
119 michael 5052
120 michael 5059 -C) copy_on_change=true;;
121    
122     -d) dir_arg=true;;
123    
124     -g) chgrpcmd="$chgrpprog $2"
125 michael 5352 shift;;
126 michael 5059
127     --help) echo "$usage"; exit $?;;
128    
129     -m) mode=$2
130 michael 5352 case $mode in
131     *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
132     echo "$0: invalid mode: $mode" >&2
133     exit 1;;
134     esac
135     shift;;
136 michael 5059
137     -o) chowncmd="$chownprog $2"
138 michael 5352 shift;;
139 michael 5059
140     -s) stripcmd=$stripprog;;
141    
142 michael 5352 -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;;
150 michael 5059
151 michael 5352 -T) is_target_a_directory=never;;
152 michael 5059
153     --version) echo "$0 $scriptversion"; exit $?;;
154    
155 michael 5352 --) shift
156     break;;
157 michael 5059
158 michael 5352 -*) echo "$0: invalid option: $1" >&2
159     exit 1;;
160 michael 5059
161     *) break;;
162     esac
163     shift
164 michael 5052 done
165    
166 michael 5352 # 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    
176 michael 5059 if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
177     # When -d is used, all remaining arguments are directories to create.
178     # When -t is used, the destination is already specified.
179     # Otherwise, the last argument is the destination. Remove it from $@.
180     for arg
181     do
182     if test -n "$dst_arg"; then
183     # $@ is not empty: it contains at least $arg.
184     set fnord "$@" "$dst_arg"
185     shift # fnord
186     fi
187     shift # arg
188     dst_arg=$arg
189     # Protect names problematic for 'test' and other utilities.
190     case $dst_arg in
191     -* | [=\(\)!]) dst_arg=./$dst_arg;;
192     esac
193     done
194 michael 5052 fi
195    
196 michael 5059 if test $# -eq 0; then
197     if test -z "$dir_arg"; then
198     echo "$0: no input file specified." >&2
199     exit 1
200     fi
201     # It's OK to call 'install-sh -d' without argument.
202     # This can happen when creating conditional directories.
203     exit 0
204     fi
205 michael 5052
206 michael 5059 if test -z "$dir_arg"; then
207 michael 5352 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
216 michael 5059 do_exit='(exit $ret); exit $ret'
217     trap "ret=129; $do_exit" 1
218     trap "ret=130; $do_exit" 2
219     trap "ret=141; $do_exit" 13
220     trap "ret=143; $do_exit" 15
221 michael 5052
222 michael 5059 # Set umask so as not to create temps with too-generous modes.
223     # However, 'strip' requires both read and write access to temps.
224     case $mode in
225     # Optimize common cases.
226     *644) cp_umask=133;;
227     *755) cp_umask=22;;
228 michael 5052
229 michael 5059 *[0-7])
230     if test -z "$stripcmd"; then
231 michael 5352 u_plus_rw=
232 michael 5059 else
233 michael 5352 u_plus_rw='% 200'
234 michael 5059 fi
235     cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
236     *)
237     if test -z "$stripcmd"; then
238 michael 5352 u_plus_rw=
239 michael 5059 else
240 michael 5352 u_plus_rw=,u+rw
241 michael 5059 fi
242     cp_umask=$mode$u_plus_rw;;
243     esac
244 michael 5052 fi
245    
246 michael 5059 for src
247     do
248     # Protect names problematic for 'test' and other utilities.
249     case $src in
250     -* | [=\(\)!]) src=./$src;;
251     esac
252 michael 5052
253 michael 5059 if test -n "$dir_arg"; then
254     dst=$src
255     dstdir=$dst
256     test -d "$dstdir"
257     dstdir_status=$?
258     else
259 michael 5052
260 michael 5059 # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
261     # might cause directories to be created, which would be especially bad
262     # if $src (and thus $dsttmp) contains '*'.
263     if test ! -f "$src" && test ! -d "$src"; then
264     echo "$0: $src does not exist." >&2
265     exit 1
266     fi
267 michael 5052
268 michael 5059 if test -z "$dst_arg"; then
269     echo "$0: no destination specified." >&2
270     exit 1
271     fi
272     dst=$dst_arg
273 michael 5052
274 michael 5059 # If destination is a directory, append the input filename; won't work
275     # if double slashes aren't ignored.
276     if test -d "$dst"; then
277 michael 5352 if test "$is_target_a_directory" = never; then
278     echo "$0: $dst_arg: Is a directory" >&2
279     exit 1
280 michael 5059 fi
281     dstdir=$dst
282     dst=$dstdir/`basename "$src"`
283     dstdir_status=0
284     else
285 michael 5352 dstdir=`dirname "$dst"`
286 michael 5059 test -d "$dstdir"
287     dstdir_status=$?
288     fi
289     fi
290 michael 5052
291 michael 5059 obsolete_mkdir_used=false
292    
293     if test $dstdir_status != 0; then
294     case $posix_mkdir in
295     '')
296 michael 5352 # 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 michael 5059
304 michael 5352 *[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 michael 5059
312 michael 5352 # 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 michael 5052
320 michael 5352 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     tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
328     trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
329 michael 5052
330 michael 5352 if (umask $mkdir_umask &&
331     exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
332     then
333     if test -z "$dir_arg" || {
334     # Check for POSIX incompatibilities with -m.
335     # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
336     # other-writable bit of parent directory when it shouldn't.
337     # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
338     ls_ld_tmpdir=`ls -ld "$tmpdir"`
339     case $ls_ld_tmpdir in
340     d????-?r-*) different_mode=700;;
341     d????-?--*) different_mode=755;;
342     *) false;;
343     esac &&
344     $mkdirprog -m$different_mode -p -- "$tmpdir" && {
345     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
346     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
347     }
348     }
349     then posix_mkdir=:
350     fi
351     rmdir "$tmpdir/d" "$tmpdir"
352     else
353     # Remove any dirs left behind by ancient mkdir implementations.
354     rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
355     fi
356     trap '' 0;;
357     esac;;
358 michael 5059 esac
359 michael 5052
360 michael 5059 if
361     $posix_mkdir && (
362 michael 5352 umask $mkdir_umask &&
363     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
364 michael 5059 )
365     then :
366     else
367 michael 5052
368 michael 5059 # The umask is ridiculous, or mkdir does not conform to POSIX,
369     # or it failed possibly due to a race condition. Create the
370     # directory the slow way, step by step, checking for races as we go.
371 michael 5052
372 michael 5059 case $dstdir in
373 michael 5352 /*) prefix='/';;
374     [-=\(\)!]*) prefix='./';;
375     *) prefix='';;
376 michael 5059 esac
377 michael 5052
378 michael 5059 oIFS=$IFS
379     IFS=/
380 michael 5352 set -f
381 michael 5059 set fnord $dstdir
382     shift
383 michael 5352 set +f
384 michael 5059 IFS=$oIFS
385    
386     prefixes=
387    
388     for d
389     do
390 michael 5352 test X"$d" = X && continue
391 michael 5059
392 michael 5352 prefix=$prefix$d
393     if test -d "$prefix"; then
394     prefixes=
395     else
396     if $posix_mkdir; then
397     (umask=$mkdir_umask &&
398     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
399     # Don't fail if two instances are running concurrently.
400     test -d "$prefix" || exit 1
401     else
402     case $prefix in
403     *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
404     *) qprefix=$prefix;;
405     esac
406     prefixes="$prefixes '$qprefix'"
407     fi
408     fi
409     prefix=$prefix/
410 michael 5059 done
411 michael 5052
412 michael 5059 if test -n "$prefixes"; then
413 michael 5352 # Don't fail if two instances are running concurrently.
414     (umask $mkdir_umask &&
415     eval "\$doit_exec \$mkdirprog $prefixes") ||
416     test -d "$dstdir" || exit 1
417     obsolete_mkdir_used=true
418 michael 5059 fi
419     fi
420     fi
421 michael 5052
422 michael 5059 if test -n "$dir_arg"; then
423     { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
424     { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
425     { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
426     test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
427     else
428 michael 5052
429 michael 5059 # Make a couple of temp file names in the proper directory.
430     dsttmp=$dstdir/_inst.$$_
431     rmtmp=$dstdir/_rm.$$_
432 michael 5052
433 michael 5059 # Trap to clean up those temp files at exit.
434     trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
435 michael 5052
436 michael 5059 # Copy the file name to the temp name.
437     (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
438 michael 5052
439 michael 5059 # and set any options; do chmod last to preserve setuid bits.
440     #
441     # If any of these fail, we abort the whole thing. If we want to
442     # ignore errors from any of these, just make sure not to ignore
443     # errors from the above "$doit $cpprog $src $dsttmp" command.
444     #
445     { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
446     { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
447     { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
448     { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
449 michael 5052
450 michael 5059 # If -C, don't bother to copy if it wouldn't change the file.
451     if $copy_on_change &&
452 michael 5352 old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
453     new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
454     set -f &&
455 michael 5059 set X $old && old=:$2:$4:$5:$6 &&
456     set X $new && new=:$2:$4:$5:$6 &&
457 michael 5352 set +f &&
458 michael 5059 test "$old" = "$new" &&
459     $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
460     then
461     rm -f "$dsttmp"
462     else
463     # Rename the file to the real destination.
464     $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
465 michael 5052
466 michael 5059 # The rename failed, perhaps because mv can't rename something else
467     # to itself, or perhaps because mv is so ancient that it does not
468     # support -f.
469     {
470 michael 5352 # Now remove or move aside any old file at destination location.
471     # We try this two ways since rm can't unlink itself on some
472     # systems and the destination file might be busy for other
473     # reasons. In this case, the final cleanup might fail but the new
474     # file should still install successfully.
475     {
476     test ! -f "$dst" ||
477     $doit $rmcmd -f "$dst" 2>/dev/null ||
478     { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
479     { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
480     } ||
481     { echo "$0: cannot unlink or rename $dst" >&2
482     (exit 1); exit 1
483     }
484     } &&
485 michael 5052
486 michael 5352 # Now rename the file to the real destination.
487     $doit $mvcmd "$dsttmp" "$dst"
488 michael 5059 }
489     fi || exit 1
490 michael 5052
491 michael 5059 trap '' 0
492     fi
493     done
494 michael 5052
495 michael 5059 # Local variables:
496     # eval: (add-hook 'write-file-hooks 'time-stamp)
497     # time-stamp-start: "scriptversion="
498     # time-stamp-format: "%:y-%02m-%02d.%02H"
499 michael 8551 # time-stamp-time-zone: "UTC0"
500 michael 5059 # time-stamp-end: "; # UTC"
501     # End:

Properties

Name Value
svn:eol-style native
svn:executable
svn:keywords Id