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