/[ascend]/trunk/base/autotools/config/install-sh
ViewVC logotype

Diff of /trunk/base/autotools/config/install-sh

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 135 by johnpye, Wed Dec 21 04:37:33 2005 UTC revision 136 by johnpye, Wed Dec 21 04:52:43 2005 UTC
# Line 1  Line 1 
1  #! /bin/sh  #!/bin/sh
 #  
2  # install - install a program, script, or datafile  # install - install a program, script, or datafile
3  # This comes from X11R5 (mit/util/scripts/install.sh).  
4    scriptversion=2003-09-24.23
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  #  #
 # Copyright 1991 by the Massachusetts Institute of Technology  
34  #  #
35  # Permission to use, copy, modify, distribute, and sell this software and its  # FSF changes to this file are in the public domain.
 # documentation for any purpose is hereby granted without fee, provided that  
 # the above copyright notice appear in all copies and that both that  
 # copyright notice and this permission notice appear in supporting  
 # documentation, and that the name of M.I.T. not be used in advertising or  
 # publicity pertaining to distribution of the software without specific,  
 # written prior permission.  M.I.T. makes no representations about the  
 # suitability of this software for any purpose.  It is provided "as is"  
 # without express or implied warranty.  
36  #  #
37  # Calling this script install-sh is preferred over install.sh, to prevent  # Calling this script install-sh is preferred over install.sh, to prevent
38  # `make' implicit rules from creating a file called install from it  # `make' implicit rules from creating a file called install from it
# Line 23  Line 42 
42  # from scratch.  It can only install one file at a time, a restriction  # from scratch.  It can only install one file at a time, a restriction
43  # shared with many OS's install programs.  # shared with many OS's install programs.
44    
   
45  # set DOITPROG to echo to test this script  # set DOITPROG to echo to test this script
46    
47  # Don't use :- since 4.3BSD and earlier shells don't like it.  # Don't use :- since 4.3BSD and earlier shells don't like it.
48  doit="${DOITPROG-}"  doit="${DOITPROG-}"
49    
   
50  # put in absolute paths if you don't have them in your path; or use env. vars.  # put in absolute paths if you don't have them in your path; or use env. vars.
51    
52  mvprog="${MVPROG-mv}"  mvprog="${MVPROG-mv}"
# Line 41  stripprog="${STRIPPROG-strip}" Line 58  stripprog="${STRIPPROG-strip}"
58  rmprog="${RMPROG-rm}"  rmprog="${RMPROG-rm}"
59  mkdirprog="${MKDIRPROG-mkdir}"  mkdirprog="${MKDIRPROG-mkdir}"
60    
61  transformbasename=""  transformbasename=
62  transform_arg=""  transform_arg=
63  instcmd="$mvprog"  instcmd="$mvprog"
64  chmodcmd="$chmodprog 0755"  chmodcmd="$chmodprog 0755"
65  chowncmd=""  chowncmd=
66  chgrpcmd=""  chgrpcmd=
67  stripcmd=""  stripcmd=
68  rmcmd="$rmprog -f"  rmcmd="$rmprog -f"
69  mvcmd="$mvprog"  mvcmd="$mvprog"
70  src=""  src=
71  dst=""  dst=
72  dir_arg=""  dir_arg=
73    
74  while [ x"$1" != x ]; do  usage="Usage: $0 [OPTION]... SRCFILE DSTFILE
75      case $1 in     or: $0 -d DIR1 DIR2...
76      -c) instcmd="$cpprog"  
77          shift  In the first form, install SRCFILE to DSTFILE, removing SRCFILE by default.
78          continue;;  In the second, create the directory path DIR.
79    
80      -d) dir_arg=true  Options:
81          shift  -b=TRANSFORMBASENAME
82          continue;;  -c         copy source (using $cpprog) instead of moving (using $mvprog).
83    -d         create directories instead of installing files.
84      -m) chmodcmd="$chmodprog $2"  -g GROUP   $chgrp installed files to GROUP.
85          shift  -m MODE    $chmod installed files to MODE.
86          shift  -o USER    $chown installed files to USER.
87          continue;;  -s         strip installed files (using $stripprog).
88    -t=TRANSFORM
89      -o) chowncmd="$chownprog $2"  --help     display this help and exit.
90          shift  --version  display version info and exit.
91          shift  
92          continue;;  Environment variables override the default commands:
93      CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
94      -g) chgrpcmd="$chgrpprog $2"  "
95          shift  
96          shift  while test -n "$1"; do
97          continue;;    case $1 in
98        -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
99      -s) stripcmd="$stripprog"          shift
100          shift          continue;;
101          continue;;  
102        -c) instcmd=$cpprog
103      -t=*) transformarg=`echo $1 | sed 's/-t=//'`          shift
104          shift          continue;;
105          continue;;  
106        -d) dir_arg=true
107      -b=*) transformbasename=`echo $1 | sed 's/-b=//'`          shift
108          shift          continue;;
109          continue;;  
110        -g) chgrpcmd="$chgrpprog $2"
111      *)  if [ x"$src" = x ]          shift
112          then          shift
113          src=$1          continue;;
114          else  
115          # this colon is to work around a 386BSD /bin/sh bug      --help) echo "$usage"; exit 0;;
116          :  
117          dst=$1      -m) chmodcmd="$chmodprog $2"
118          fi          shift
119          shift          shift
120          continue;;          continue;;
121      esac  
122        -o) chowncmd="$chownprog $2"
123            shift
124            shift
125            continue;;
126    
127        -s) stripcmd=$stripprog
128            shift
129            continue;;
130    
131        -t=*) transformarg=`echo $1 | sed 's/-t=//'`
132            shift
133            continue;;
134    
135        --version) echo "$0 $scriptversion"; exit 0;;
136    
137        *)  if test -z "$src"; then
138              src=$1
139            else
140              # this colon is to work around a 386BSD /bin/sh bug
141              :
142              dst=$1
143            fi
144            shift
145            continue;;
146      esac
147  done  done
148    
149  if [ x"$src" = x ]  if test -z "$src"; then
150  then    echo "$0: no input file specified." >&2
151      echo "install:  no input file specified"    exit 1
     exit 1  
 else  
     true  
152  fi  fi
153    
154  if [ x"$dir_arg" != x ]; then  # Protect names starting with `-'.
155      dst=$src  case $src in
156      src=""    -*) src=./$src ;;
157        esac
158      if [ -d $dst ]; then  
159          instcmd=:  if test -n "$dir_arg"; then
160      else    dst=$src
161          instcmd=mkdir    src=
162      fi  
163      if test -d "$dst"; then
164        instcmd=:
165        chmodcmd=
166      else
167        instcmd=$mkdirprog
168      fi
169  else  else
170      # Waiting for this to be detected by the "$instcmd $src $dsttmp" command
171  # Waiting for this to be detected by the "$instcmd $src $dsttmp" command    # might cause directories to be created, which would be especially bad
172  # might cause directories to be created, which would be especially bad    # if $src (and thus $dsttmp) contains '*'.
173  # if $src (and thus $dsttmp) contains '*'.    if test ! -f "$src" && test ! -d "$src"; then
174        echo "$0: $src does not exist." >&2
175      if [ -f $src -o -d $src ]      exit 1
176      then    fi
177          true  
178      else    if test -z "$dst"; then
179          echo "install:  $src does not exist"      echo "$0: no destination specified." >&2
180          exit 1      exit 1
181      fi    fi
182        
183      if [ x"$dst" = x ]    # Protect names starting with `-'.
184      then    case $dst in
185          echo "install:  no destination specified"      -*) dst=./$dst ;;
186          exit 1    esac
187      else  
188          true    # If destination is a directory, append the input filename; won't work
189      fi    # if double slashes aren't ignored.
190      if test -d "$dst"; then
191  # If destination is a directory, append the input filename; if your system      dst=$dst/`basename "$src"`
192  # does not like double slashes in filenames, you may need to add some logic    fi
   
     if [ -d $dst ]  
     then  
         dst="$dst"/`basename $src`  
     else  
         true  
     fi  
193  fi  fi
194    
195  ## this sed command emulates the dirname command  # This sed command emulates the dirname command.
196  dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`  dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
197    
198  # Make sure that the destination directory exists.  # Make sure that the destination directory exists.
 #  this part is taken from Noah Friedman's mkinstalldirs script  
199    
200  # Skip lots of stat calls in the usual case.  # Skip lots of stat calls in the usual case.
201  if [ ! -d "$dstdir" ]; then  if test ! -d "$dstdir"; then
202  defaultIFS='        defaultIFS='
203  '      '
204  IFS="${IFS-${defaultIFS}}"    IFS="${IFS-$defaultIFS}"
205    
206  oIFS="${IFS}"    oIFS=$IFS
207  # Some sh's can't handle IFS=/ for some reason.    # Some sh's can't handle IFS=/ for some reason.
208  IFS='%'    IFS='%'
209  set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`    set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
210  IFS="${oIFS}"    IFS=$oIFS
211    
212  pathcomp=''    pathcomp=
213    
214  while [ $# -ne 0 ] ; do    while test $# -ne 0 ; do
215      pathcomp="${pathcomp}${1}"      pathcomp=$pathcomp$1
216      shift      shift
217        test -d "$pathcomp" || $mkdirprog "$pathcomp"
218      if [ ! -d "${pathcomp}" ] ;      pathcomp=$pathcomp/
219          then    done
         $mkdirprog "${pathcomp}"  
     else  
         true  
     fi  
   
     pathcomp="${pathcomp}/"  
 done  
220  fi  fi
221    
222  if [ x"$dir_arg" != x ]  if test -n "$dir_arg"; then
223  then    $doit $instcmd "$dst" \
224      $doit $instcmd $dst &&      && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
225        && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
226      if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&      && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
227      if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&      && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
     if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&  
     if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi  
 else  
   
 # If we're going to rename the final executable, determine the name now.  
   
     if [ x"$transformarg" = x ]  
     then  
         dstfile=`basename $dst`  
     else  
         dstfile=`basename $dst $transformbasename |  
             sed $transformarg`$transformbasename  
     fi  
   
 # don't allow the sed command to completely eliminate the filename  
   
     if [ x"$dstfile" = x ]  
     then  
         dstfile=`basename $dst`  
     else  
         true  
     fi  
   
 # Make a temp file name in the proper directory.  
   
     dsttmp=$dstdir/#inst.$$#  
   
 # Move or copy the file name to the temp name  
   
     $doit $instcmd $src $dsttmp &&  
228    
229      trap "rm -f ${dsttmp}" 0 &&  else
230      # If we're going to rename the final executable, determine the name now.
231  # and set any options; do chmod last to preserve setuid bits    if test -z "$transformarg"; then
232        dstfile=`basename "$dst"`
233  # If any of these fail, we abort the whole thing.  If we want to    else
234  # ignore errors from any of these, just make sure not to ignore      dstfile=`basename "$dst" $transformbasename \
235  # errors from the above "$doit $instcmd $src $dsttmp" command.               | sed $transformarg`$transformbasename
236      fi
237      if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&  
238      if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&    # don't allow the sed command to completely eliminate the filename.
239      if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&    test -z "$dstfile" && dstfile=`basename "$dst"`
240      if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&  
241      # Make a couple of temp file names in the proper directory.
242  # Now rename the file to the real destination.    dsttmp=$dstdir/_inst.$$_
243      rmtmp=$dstdir/_rm.$$_
244      $doit $rmcmd -f $dstdir/$dstfile &&  
245      $doit $mvcmd $dsttmp $dstdir/$dstfile    # Trap to clean up those temp files at exit.
246      trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
247      trap '(exit $?); exit' 1 2 13 15
248    
249      # Move or copy the file name to the temp name
250      $doit $instcmd "$src" "$dsttmp" &&
251    
252      # and set any options; do chmod last to preserve setuid bits.
253      #
254      # If any of these fail, we abort the whole thing.  If we want to
255      # ignore errors from any of these, just make sure not to ignore
256      # errors from the above "$doit $instcmd $src $dsttmp" command.
257      #
258      { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
259        && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
260        && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
261        && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
262    
263      # Now remove or move aside any old file at destination location.  We
264      # try this two ways since rm can't unlink itself on some systems and
265      # the destination file might be busy for other reasons.  In this case,
266      # the final cleanup might fail but the new file should still install
267      # successfully.
268      {
269        if test -f "$dstdir/$dstfile"; then
270          $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
271          || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
272          || {
273          echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
274          (exit 1); exit
275          }
276        else
277          :
278        fi
279      } &&
280    
281      # Now rename the file to the real destination.
282      $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
283  fi &&  fi &&
284    
285    # The final little trick to "correctly" pass the exit status to the exit trap.
286  exit 0  {
287      (exit 0); exit
288    }
289    
290    # Local variables:
291    # eval: (add-hook 'write-file-hooks 'time-stamp)
292    # time-stamp-start: "scriptversion="
293    # time-stamp-format: "%:y-%02m-%02d.%02H"
294    # time-stamp-end: "$"
295    # End:

Legend:
Removed from v.135  
changed lines
  Added in v.136

john.pye@anu.edu.au
ViewVC Help
Powered by ViewVC 1.1.22