ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/ac-tools/install-sh
Revision: 1465
Committed: Fri Jul 9 23:08:25 2010 UTC (14 years, 9 months ago) by chuckv
File size: 13663 byte(s)
Log Message:
Creating busticated version of OpenMD

File Contents

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