ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/hopm/trunk/install-sh
Revision: 8850
Committed: Sat Feb 9 18:34:12 2019 UTC (6 years, 6 months ago) by michael
File size: 15368 byte(s)
Log Message:
- Recreate 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 8850 scriptversion=2018-03-11.20; # 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 8850 # If destination is a directory, append the input filename.
275 michael 5059 if test -d "$dst"; then
276 michael 5352 if test "$is_target_a_directory" = never; then
277     echo "$0: $dst_arg: Is a directory" >&2
278     exit 1
279 michael 5059 fi
280     dstdir=$dst
281 michael 8850 dstbase=`basename "$src"`
282     case $dst in
283     */) dst=$dst$dstbase;;
284     *) dst=$dst/$dstbase;;
285     esac
286 michael 5059 dstdir_status=0
287     else
288 michael 5352 dstdir=`dirname "$dst"`
289 michael 5059 test -d "$dstdir"
290     dstdir_status=$?
291     fi
292     fi
293 michael 5052
294 michael 8850 case $dstdir in
295     */) dstdirslash=$dstdir;;
296     *) dstdirslash=$dstdir/;;
297     esac
298    
299 michael 5059 obsolete_mkdir_used=false
300    
301     if test $dstdir_status != 0; then
302     case $posix_mkdir in
303     '')
304 michael 5352 # Create intermediate dirs using mode 755 as modified by the umask.
305     # This is like FreeBSD 'install' as of 1997-10-28.
306     umask=`umask`
307     case $stripcmd.$umask in
308     # Optimize common cases.
309     *[2367][2367]) mkdir_umask=$umask;;
310     .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
311 michael 5059
312 michael 5352 *[0-7])
313     mkdir_umask=`expr $umask + 22 \
314     - $umask % 100 % 40 + $umask % 20 \
315     - $umask % 10 % 4 + $umask % 2
316     `;;
317     *) mkdir_umask=$umask,go-w;;
318     esac
319 michael 5059
320 michael 5352 # With -d, create the new directory with the user-specified mode.
321     # Otherwise, rely on $mkdir_umask.
322     if test -n "$dir_arg"; then
323     mkdir_mode=-m$mode
324     else
325     mkdir_mode=
326     fi
327 michael 5052
328 michael 5352 posix_mkdir=false
329     case $umask in
330     *[123567][0-7][0-7])
331     # POSIX mkdir -p sets u+wx bits regardless of umask, which
332     # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
333     ;;
334     *)
335 michael 8850 # Note that $RANDOM variable is not portable (e.g. dash); Use it
336     # here however when possible just to lower collision chance.
337 michael 5352 tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
338 michael 5052
339 michael 8850 trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
340    
341     # Because "mkdir -p" follows existing symlinks and we likely work
342     # directly in world-writeable /tmp, make sure that the '$tmpdir'
343     # directory is successfully created first before we actually test
344     # 'mkdir -p' feature.
345 michael 5352 if (umask $mkdir_umask &&
346 michael 8850 $mkdirprog $mkdir_mode "$tmpdir" &&
347     exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
348 michael 5352 then
349     if test -z "$dir_arg" || {
350     # Check for POSIX incompatibilities with -m.
351     # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
352     # other-writable bit of parent directory when it shouldn't.
353     # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
354 michael 8850 test_tmpdir="$tmpdir/a"
355     ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
356 michael 5352 case $ls_ld_tmpdir in
357     d????-?r-*) different_mode=700;;
358     d????-?--*) different_mode=755;;
359     *) false;;
360     esac &&
361 michael 8850 $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
362     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
363 michael 5352 test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
364     }
365     }
366     then posix_mkdir=:
367     fi
368 michael 8850 rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
369 michael 5352 else
370     # Remove any dirs left behind by ancient mkdir implementations.
371 michael 8850 rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
372 michael 5352 fi
373     trap '' 0;;
374     esac;;
375 michael 5059 esac
376 michael 5052
377 michael 5059 if
378     $posix_mkdir && (
379 michael 5352 umask $mkdir_umask &&
380     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
381 michael 5059 )
382     then :
383     else
384 michael 5052
385 michael 5059 # The umask is ridiculous, or mkdir does not conform to POSIX,
386     # or it failed possibly due to a race condition. Create the
387     # directory the slow way, step by step, checking for races as we go.
388 michael 5052
389 michael 5059 case $dstdir in
390 michael 5352 /*) prefix='/';;
391     [-=\(\)!]*) prefix='./';;
392     *) prefix='';;
393 michael 5059 esac
394 michael 5052
395 michael 5059 oIFS=$IFS
396     IFS=/
397 michael 5352 set -f
398 michael 5059 set fnord $dstdir
399     shift
400 michael 5352 set +f
401 michael 5059 IFS=$oIFS
402    
403     prefixes=
404    
405     for d
406     do
407 michael 5352 test X"$d" = X && continue
408 michael 5059
409 michael 5352 prefix=$prefix$d
410     if test -d "$prefix"; then
411     prefixes=
412     else
413     if $posix_mkdir; then
414     (umask=$mkdir_umask &&
415     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
416     # Don't fail if two instances are running concurrently.
417     test -d "$prefix" || exit 1
418     else
419     case $prefix in
420     *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
421     *) qprefix=$prefix;;
422     esac
423     prefixes="$prefixes '$qprefix'"
424     fi
425     fi
426     prefix=$prefix/
427 michael 5059 done
428 michael 5052
429 michael 5059 if test -n "$prefixes"; then
430 michael 5352 # Don't fail if two instances are running concurrently.
431     (umask $mkdir_umask &&
432     eval "\$doit_exec \$mkdirprog $prefixes") ||
433     test -d "$dstdir" || exit 1
434     obsolete_mkdir_used=true
435 michael 5059 fi
436     fi
437     fi
438 michael 5052
439 michael 5059 if test -n "$dir_arg"; then
440     { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
441     { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
442     { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
443     test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
444     else
445 michael 5052
446 michael 5059 # Make a couple of temp file names in the proper directory.
447 michael 8850 dsttmp=${dstdirslash}_inst.$$_
448     rmtmp=${dstdirslash}_rm.$$_
449 michael 5052
450 michael 5059 # Trap to clean up those temp files at exit.
451     trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
452 michael 5052
453 michael 5059 # Copy the file name to the temp name.
454     (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
455 michael 5052
456 michael 5059 # and set any options; do chmod last to preserve setuid bits.
457     #
458     # If any of these fail, we abort the whole thing. If we want to
459     # ignore errors from any of these, just make sure not to ignore
460     # errors from the above "$doit $cpprog $src $dsttmp" command.
461     #
462     { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
463     { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
464     { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
465     { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
466 michael 5052
467 michael 5059 # If -C, don't bother to copy if it wouldn't change the file.
468     if $copy_on_change &&
469 michael 5352 old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
470     new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
471     set -f &&
472 michael 5059 set X $old && old=:$2:$4:$5:$6 &&
473     set X $new && new=:$2:$4:$5:$6 &&
474 michael 5352 set +f &&
475 michael 5059 test "$old" = "$new" &&
476     $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
477     then
478     rm -f "$dsttmp"
479     else
480     # Rename the file to the real destination.
481     $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
482 michael 5052
483 michael 5059 # The rename failed, perhaps because mv can't rename something else
484     # to itself, or perhaps because mv is so ancient that it does not
485     # support -f.
486     {
487 michael 5352 # Now remove or move aside any old file at destination location.
488     # We try this two ways since rm can't unlink itself on some
489     # systems and the destination file might be busy for other
490     # reasons. In this case, the final cleanup might fail but the new
491     # file should still install successfully.
492     {
493     test ! -f "$dst" ||
494     $doit $rmcmd -f "$dst" 2>/dev/null ||
495     { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
496     { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
497     } ||
498     { echo "$0: cannot unlink or rename $dst" >&2
499     (exit 1); exit 1
500     }
501     } &&
502 michael 5052
503 michael 5352 # Now rename the file to the real destination.
504     $doit $mvcmd "$dsttmp" "$dst"
505 michael 5059 }
506     fi || exit 1
507 michael 5052
508 michael 5059 trap '' 0
509     fi
510     done
511 michael 5052
512 michael 5059 # Local variables:
513 michael 8850 # eval: (add-hook 'before-save-hook 'time-stamp)
514 michael 5059 # time-stamp-start: "scriptversion="
515     # time-stamp-format: "%:y-%02m-%02d.%02H"
516 michael 8551 # time-stamp-time-zone: "UTC0"
517 michael 5059 # time-stamp-end: "; # UTC"
518     # End:

Properties

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