source: trunk/debathena/scripts/install-sh @ 22720

Revision 22720, 12.9 KB checked in by ghudson, 17 years ago (diff)
Create an autoconfiscation transform step for Athena source trees before the orig archive is created. * debathena/scripts/mkinstalldirs, debathena/scripts/install-sh: Copies from automake 1.10 so that we aren't dependent on a specific version of automake. * debathena/scripts/aclocal.m4: The Athena aclocal.m4, resurrected from the attic. * debathena/scripts/daconfiscate: New script to copy in boilerplate and generate configure for Athena source directories. * debathena/scripts/dasource: Invoke daconfiscate for athena packages. Also, avoid creating conflicting orig archives by (1) leaving alone an existing orig archive and (2) searching the apt repositories for an orig archive before generating one.
  • Property svn:executable set to *
Line 
1#!/bin/sh
2# install - install a program, script, or datafile
3
4scriptversion=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#
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# from scratch.
43
44nl='
45'
46IFS=" ""        $nl"
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.
51doit="${DOITPROG-}"
52if test -z "$doit"; then
53  doit_exec=exec
54else
55  doit_exec=$doit
56fi
57
58# Put in absolute file names if you don't have them in your path;
59# or use environment vars.
60
61mvprog="${MVPROG-mv}"
62cpprog="${CPPROG-cp}"
63chmodprog="${CHMODPROG-chmod}"
64chownprog="${CHOWNPROG-chown}"
65chgrpprog="${CHGRPPROG-chgrp}"
66stripprog="${STRIPPROG-strip}"
67rmprog="${RMPROG-rm}"
68mkdirprog="${MKDIRPROG-mkdir}"
69
70posix_glob=
71posix_mkdir=
72
73# Desired mode of installed file.
74mode=0755
75
76chmodcmd=$chmodprog
77chowncmd=
78chgrpcmd=
79stripcmd=
80rmcmd="$rmprog -f"
81mvcmd="$mvprog"
82src=
83dst=
84dir_arg=
85dstarg=
86no_target_directory=
87
88usage="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
93In the 1st form, copy SRCFILE to DSTFILE.
94In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
95In the 4th, create DIRECTORIES.
96
97Options:
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
109Environment variables override the default commands:
110  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
111"
112
113while test $# -ne 0; do
114  case $1 in
115    -c) shift
116        continue;;
117
118    -d) dir_arg=true
119        shift
120        continue;;
121
122    -g) chgrpcmd="$chgrpprog $2"
123        shift
124        shift
125        continue;;
126
127    --help) echo "$usage"; exit $?;;
128
129    -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
168done
169
170if 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
184fi
185
186if 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
194fi
195
196if test -z "$dir_arg"; then
197  trap '(exit $?); exit' 1 2 13 15
198
199  # 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
206    *[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
221fi
222
223for src
224do
225  # Protect names starting with `-'.
226  case $src in
227    -*) src=./$src ;;
228  esac
229
230  if test -n "$dir_arg"; then
231    dst=$src
232    dstdir=$dst
233    test -d "$dstdir"
234    dstdir_status=$?
235  else
236
237    # 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
245    if test -z "$dstarg"; then
246      echo "$0: no destination specified." >&2
247      exit 1
248    fi
249
250    dst=$dstarg
251    # Protect names starting with `-'.
252    case $dst in
253      -*) dst=./$dst ;;
254    esac
255
256    # 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
294      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        else
325          mkdir_mode=
326        fi
327
328        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
338            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
368    if
369      $posix_mkdir && (
370        umask $mkdir_umask &&
371        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
372      )
373    then :
374    else
375
376      # 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
380      case $dstdir in
381        /*) prefix=/ ;;
382        -*) prefix=./ ;;
383        *)  prefix= ;;
384      esac
385
386      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
395      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        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      done
428
429      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
439  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
446    # Make a couple of temp file names in the proper directory.
447    dsttmp=$dstdir/_inst.$$_
448    rmtmp=$dstdir/_rm.$$_
449
450    # Trap to clean up those temp files at exit.
451    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
452
453    # Copy the file name to the temp name.
454    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
455
456    # 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
467    # 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
474           # 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
493           # Now rename the file to the real destination.
494           $doit $mvcmd "$dsttmp" "$dst"
495         }
496    } || exit 1
497
498    trap '' 0
499  fi
500done
501
502# 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:
Note: See TracBrowser for help on using the repository browser.