/[pcre]/code/trunk/install-sh
ViewVC logotype

Contents of /code/trunk/install-sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 98 - (hide annotations) (download)
Mon Mar 5 15:55:02 2007 UTC (7 years, 8 months ago) by ph10
File size: 13184 byte(s)
This is a second preliminary update, after having done a test build and also a 
check of the maintenance programs. The version is now 7.1-RC1. In autogen.sh, 
autoheader is now before automake, and Tech.Notes (being now in the "maintain" 
directory) are no longer distributed.

1 nigel 41 #!/bin/sh
2     # install - install a program, script, or datafile
3 ph10 98
4     scriptversion=2006-10-14.15
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.
9 nigel 41 #
10 ph10 98 # Copyright (C) 1994 X Consortium
11 nigel 41 #
12 ph10 98 # 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 nigel 41 #
19 ph10 98 # 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 nigel 41 # 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 ph10 98 # from scratch.
43 nigel 41
44 ph10 98 nl='
45     '
46     IFS=" "" $nl"
47 nigel 41
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     doit="${DOITPROG-}"
52 ph10 98 if test -z "$doit"; then
53     doit_exec=exec
54     else
55     doit_exec=$doit
56     fi
57 nigel 41
58 ph10 98 # Put in absolute file names if you don't have them in your path;
59     # or use environment vars.
60 nigel 41
61     mvprog="${MVPROG-mv}"
62     cpprog="${CPPROG-cp}"
63     chmodprog="${CHMODPROG-chmod}"
64     chownprog="${CHOWNPROG-chown}"
65     chgrpprog="${CHGRPPROG-chgrp}"
66     stripprog="${STRIPPROG-strip}"
67     rmprog="${RMPROG-rm}"
68     mkdirprog="${MKDIRPROG-mkdir}"
69    
70 ph10 98 posix_glob=
71     posix_mkdir=
72    
73     # Desired mode of installed file.
74     mode=0755
75    
76     chmodcmd=$chmodprog
77     chowncmd=
78     chgrpcmd=
79     stripcmd=
80 nigel 41 rmcmd="$rmprog -f"
81     mvcmd="$mvprog"
82 ph10 98 src=
83     dst=
84     dir_arg=
85     dstarg=
86     no_target_directory=
87 nigel 41
88 ph10 98 usage="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 nigel 41
93 ph10 98 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 nigel 41
97 ph10 98 Options:
98     -c (ignored)
99     -d create directories instead of installing files.
100     -g GROUP $chgrpprog installed files to GROUP.
101     -m MODE $chmodprog installed files to MODE.
102     -o USER $chownprog installed files to USER.
103     -s $stripprog installed files.
104     -t DIRECTORY install into DIRECTORY.
105     -T report an error if DSTFILE is a directory.
106     --help display this help and exit.
107     --version display version info and exit.
108 nigel 41
109 ph10 98 Environment variables override the default commands:
110     CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
111     "
112 nigel 41
113 ph10 98 while test $# -ne 0; do
114     case $1 in
115     -c) shift
116     continue;;
117 nigel 41
118 ph10 98 -d) dir_arg=true
119     shift
120     continue;;
121 nigel 41
122 ph10 98 -g) chgrpcmd="$chgrpprog $2"
123     shift
124     shift
125     continue;;
126 nigel 41
127 ph10 98 --help) echo "$usage"; exit $?;;
128 nigel 41
129 ph10 98 -m) mode=$2
130     shift
131     shift
132     case $mode in
133     *' '* | *' '* | *'
134     '* | *'*'* | *'?'* | *'['*)
135     echo "$0: invalid mode: $mode" >&2
136     exit 1;;
137     esac
138     continue;;
139    
140     -o) chowncmd="$chownprog $2"
141     shift
142     shift
143     continue;;
144    
145     -s) stripcmd=$stripprog
146     shift
147     continue;;
148    
149     -t) dstarg=$2
150     shift
151     shift
152     continue;;
153    
154     -T) no_target_directory=true
155     shift
156     continue;;
157    
158     --version) echo "$0 $scriptversion"; exit $?;;
159    
160     --) shift
161     break;;
162    
163     -*) echo "$0: invalid option: $1" >&2
164     exit 1;;
165    
166     *) break;;
167     esac
168 nigel 41 done
169    
170 ph10 98 if test $# -ne 0 && test -z "$dir_arg$dstarg"; then
171     # When -d is used, all remaining arguments are directories to create.
172     # When -t is used, the destination is already specified.
173     # Otherwise, the last argument is the destination. Remove it from $@.
174     for arg
175     do
176     if test -n "$dstarg"; then
177     # $@ is not empty: it contains at least $arg.
178     set fnord "$@" "$dstarg"
179     shift # fnord
180     fi
181     shift # arg
182     dstarg=$arg
183     done
184 nigel 41 fi
185    
186 ph10 98 if test $# -eq 0; then
187     if test -z "$dir_arg"; then
188     echo "$0: no input file specified." >&2
189     exit 1
190     fi
191     # It's OK to call `install-sh -d' without argument.
192     # This can happen when creating conditional directories.
193     exit 0
194     fi
195 nigel 41
196 ph10 98 if test -z "$dir_arg"; then
197     trap '(exit $?); exit' 1 2 13 15
198 nigel 41
199 ph10 98 # Set umask so as not to create temps with too-generous modes.
200     # However, 'strip' requires both read and write access to temps.
201     case $mode in
202     # Optimize common cases.
203     *644) cp_umask=133;;
204     *755) cp_umask=22;;
205 nigel 41
206 ph10 98 *[0-7])
207     if test -z "$stripcmd"; then
208     u_plus_rw=
209     else
210     u_plus_rw='% 200'
211     fi
212     cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
213     *)
214     if test -z "$stripcmd"; then
215     u_plus_rw=
216     else
217     u_plus_rw=,u+rw
218     fi
219     cp_umask=$mode$u_plus_rw;;
220     esac
221 nigel 41 fi
222    
223 ph10 98 for src
224     do
225     # Protect names starting with `-'.
226     case $src in
227     -*) src=./$src ;;
228     esac
229 nigel 41
230 ph10 98 if test -n "$dir_arg"; then
231     dst=$src
232     dstdir=$dst
233     test -d "$dstdir"
234     dstdir_status=$?
235     else
236 nigel 41
237 ph10 98 # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
238     # might cause directories to be created, which would be especially bad
239     # if $src (and thus $dsttmp) contains '*'.
240     if test ! -f "$src" && test ! -d "$src"; then
241     echo "$0: $src does not exist." >&2
242     exit 1
243     fi
244 nigel 41
245 ph10 98 if test -z "$dstarg"; then
246     echo "$0: no destination specified." >&2
247     exit 1
248     fi
249 nigel 41
250 ph10 98 dst=$dstarg
251     # Protect names starting with `-'.
252     case $dst in
253     -*) dst=./$dst ;;
254     esac
255 nigel 41
256 ph10 98 # If destination is a directory, append the input filename; won't work
257     # if double slashes aren't ignored.
258     if test -d "$dst"; then
259     if test -n "$no_target_directory"; then
260     echo "$0: $dstarg: Is a directory" >&2
261     exit 1
262     fi
263     dstdir=$dst
264     dst=$dstdir/`basename "$src"`
265     dstdir_status=0
266     else
267     # Prefer dirname, but fall back on a substitute if dirname fails.
268     dstdir=`
269     (dirname "$dst") 2>/dev/null ||
270     expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
271     X"$dst" : 'X\(//\)[^/]' \| \
272     X"$dst" : 'X\(//\)$' \| \
273     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
274     echo X"$dst" |
275     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
276     s//\1/
277     q
278     }
279     /^X\(\/\/\)[^/].*/{
280     s//\1/
281     q
282     }
283     /^X\(\/\/\)$/{
284     s//\1/
285     q
286     }
287     /^X\(\/\).*/{
288     s//\1/
289     q
290     }
291     s/.*/./; q'
292     `
293 nigel 41
294 ph10 98 test -d "$dstdir"
295     dstdir_status=$?
296     fi
297     fi
298    
299     obsolete_mkdir_used=false
300    
301     if test $dstdir_status != 0; then
302     case $posix_mkdir in
303     '')
304     # 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    
312     *[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    
320     # 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 nigel 41 else
325 ph10 98 mkdir_mode=
326 nigel 41 fi
327    
328 ph10 98 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     tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
336     trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
337 nigel 41
338 ph10 98 if (umask $mkdir_umask &&
339     exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
340     then
341     if test -z "$dir_arg" || {
342     # Check for POSIX incompatibilities with -m.
343     # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
344     # other-writeable bit of parent directory when it shouldn't.
345     # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
346     ls_ld_tmpdir=`ls -ld "$tmpdir"`
347     case $ls_ld_tmpdir in
348     d????-?r-*) different_mode=700;;
349     d????-?--*) different_mode=755;;
350     *) false;;
351     esac &&
352     $mkdirprog -m$different_mode -p -- "$tmpdir" && {
353     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
354     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
355     }
356     }
357     then posix_mkdir=:
358     fi
359     rmdir "$tmpdir/d" "$tmpdir"
360     else
361     # Remove any dirs left behind by ancient mkdir implementations.
362     rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
363     fi
364     trap '' 0;;
365     esac;;
366     esac
367 nigel 41
368 ph10 98 if
369     $posix_mkdir && (
370     umask $mkdir_umask &&
371     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
372     )
373     then :
374     else
375 nigel 41
376 ph10 98 # The umask is ridiculous, or mkdir does not conform to POSIX,
377     # or it failed possibly due to a race condition. Create the
378     # directory the slow way, step by step, checking for races as we go.
379 nigel 41
380 ph10 98 case $dstdir in
381     /*) prefix=/ ;;
382     -*) prefix=./ ;;
383     *) prefix= ;;
384     esac
385 nigel 41
386 ph10 98 case $posix_glob in
387     '')
388     if (set -f) 2>/dev/null; then
389     posix_glob=true
390     else
391     posix_glob=false
392     fi ;;
393     esac
394 nigel 41
395 ph10 98 oIFS=$IFS
396     IFS=/
397     $posix_glob && set -f
398     set fnord $dstdir
399     shift
400     $posix_glob && set +f
401     IFS=$oIFS
402    
403     prefixes=
404    
405     for d
406     do
407     test -z "$d" && continue
408    
409     prefix=$prefix$d
410     if test -d "$prefix"; then
411     prefixes=
412 nigel 41 else
413 ph10 98 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 nigel 41 fi
426 ph10 98 prefix=$prefix/
427     done
428 nigel 41
429 ph10 98 if test -n "$prefixes"; then
430     # 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     fi
436     fi
437     fi
438 nigel 41
439 ph10 98 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 nigel 41
446 ph10 98 # Make a couple of temp file names in the proper directory.
447     dsttmp=$dstdir/_inst.$$_
448     rmtmp=$dstdir/_rm.$$_
449 nigel 41
450 ph10 98 # Trap to clean up those temp files at exit.
451     trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
452 nigel 41
453 ph10 98 # Copy the file name to the temp name.
454     (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
455 nigel 41
456 ph10 98 # 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 nigel 41
467 ph10 98 # Now rename the file to the real destination.
468     { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \
469     || {
470     # The rename failed, perhaps because mv can't rename something else
471     # to itself, or perhaps because mv is so ancient that it does not
472     # support -f.
473 nigel 41
474 ph10 98 # Now remove or move aside any old file at destination location.
475     # We try this two ways since rm can't unlink itself on some
476     # systems and the destination file might be busy for other
477     # reasons. In this case, the final cleanup might fail but the new
478     # file should still install successfully.
479     {
480     if test -f "$dst"; then
481     $doit $rmcmd -f "$dst" 2>/dev/null \
482     || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \
483     && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\
484     || {
485     echo "$0: cannot unlink or rename $dst" >&2
486     (exit 1); exit 1
487     }
488     else
489     :
490     fi
491     } &&
492 nigel 41
493 ph10 98 # Now rename the file to the real destination.
494     $doit $mvcmd "$dsttmp" "$dst"
495     }
496     } || exit 1
497 nigel 41
498 ph10 98 trap '' 0
499     fi
500     done
501 nigel 41
502 ph10 98 # Local variables:
503     # eval: (add-hook 'write-file-hooks 'time-stamp)
504     # time-stamp-start: "scriptversion="
505     # time-stamp-format: "%:y-%02m-%02d.%02H"
506     # time-stamp-end: "$"
507     # End:

Properties

Name Value
svn:eol-style native
svn:executable *
svn:keywords "Author Date Id Revision Url"

webmaster@exim.org
ViewVC Help
Powered by ViewVC 1.1.12