/[gcl]/gcl/binutils/install-sh
ViewVC logotype

Diff of /gcl/binutils/install-sh

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

revision 1.1.1.1 by camm, Fri Aug 9 05:34:22 2002 UTC revision 1.2 by camm, Fri Sep 9 23:32:06 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=2004-12-17.09
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  # Copyright 1991 by the Massachusetts Institute of Technology  # 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  # Permission to use, copy, modify, distribute, and sell this software and its  # Except as contained in this notice, the name of the X Consortium shall not
30  # documentation for any purpose is hereby granted without fee, provided that  # be used in advertising or otherwise to promote the sale, use or other deal-
31  # the above copyright notice appear in all copies and that both that  # ings in this Software without prior written authorization from the X Consor-
32  # copyright notice and this permission notice appear in supporting  # tium.
33  # documentation, and that the name of M.I.T. not be used in advertising or  #
34  # publicity pertaining to distribution of the software without specific,  #
35  # written prior permission.  M.I.T. makes no representations about the  # FSF changes to this file are in the public domain.
 # 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    
 transformbasename=""  
 transform_arg=""  
 instcmd="$mvprog"  
61  chmodcmd="$chmodprog 0755"  chmodcmd="$chmodprog 0755"
62  chowncmd=""  chowncmd=
63  chgrpcmd=""  chgrpcmd=
64  stripcmd=""  stripcmd=
65  rmcmd="$rmprog -f"  rmcmd="$rmprog -f"
66  mvcmd="$mvprog"  mvcmd="$mvprog"
67  src=""  src=
68  dst=""  dst=
69  dir_arg=""  dir_arg=
70    dstarg=
71  while [ x"$1" != x ]; do  no_target_directory=
72      case $1 in  
73          -c) instcmd="$cpprog"  usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
74              shift     or: $0 [OPTION]... SRCFILES... DIRECTORY
75              continue;;     or: $0 [OPTION]... -t DIRECTORY SRCFILES...
76       or: $0 [OPTION]... -d DIRECTORIES...
77          -d) dir_arg=true  
78              shift  In the 1st form, copy SRCFILE to DSTFILE.
79              continue;;  In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
80    In the 4th, create DIRECTORIES.
81          -m) chmodcmd="$chmodprog $2"  
82              shift  Options:
83              shift  -c         (ignored)
84              continue;;  -d         create directories instead of installing files.
85    -g GROUP   $chgrpprog installed files to GROUP.
86          -o) chowncmd="$chownprog $2"  -m MODE    $chmodprog installed files to MODE.
87              shift  -o USER    $chownprog installed files to USER.
88              shift  -s         $stripprog installed files.
89              continue;;  -t DIRECTORY  install into DIRECTORY.
90    -T         report an error if DSTFILE is a directory.
91          -g) chgrpcmd="$chgrpprog $2"  --help     display this help and exit.
92              shift  --version  display version info and exit.
93              shift  
94              continue;;  Environment variables override the default commands:
95      CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
96          -s) stripcmd="$stripprog"  "
97              shift  
98              continue;;  while test -n "$1"; do
99      case $1 in
100          -t=*) transformarg=`echo $1 | sed 's/-t=//'`      -c) shift
101              shift          continue;;
102              continue;;  
103        -d) dir_arg=true
104          -b=*) transformbasename=`echo $1 | sed 's/-b=//'`          shift
105              shift          continue;;
106              continue;;  
107        -g) chgrpcmd="$chgrpprog $2"
108          *)  if [ x"$src" = x ]          shift
109              then          shift
110                  src=$1          continue;;
111              else  
112                  # this colon is to work around a 386BSD /bin/sh bug      --help) echo "$usage"; exit 0;;
113                  :  
114                  dst=$1      -m) chmodcmd="$chmodprog $2"
115              fi          shift
116              shift          shift
117              continue;;          continue;;
118      esac  
119  done      -o) chowncmd="$chownprog $2"
120            shift
121  if [ x"$src" = x ]          shift
122  then          continue;;
123          echo "install:  no input file specified"  
124          exit 1      -s) stripcmd=$stripprog
125  else          shift
126          true          continue;;
 fi  
   
 if [ x"$dir_arg" != x ]; then  
         dst=$src  
         src=""  
           
         if [ -d $dst ]; then  
                 instcmd=:  
                 chmodcmd=""  
         else  
                 instcmd=mkdir  
         fi  
 else  
   
 # Waiting for this to be detected by the "$instcmd $src $dsttmp" command  
 # might cause directories to be created, which would be especially bad  
 # if $src (and thus $dsttmp) contains '*'.  
   
         if [ -f $src -o -d $src ]  
         then  
                 true  
         else  
                 echo "install:  $src does not exist"  
                 exit 1  
         fi  
           
         if [ x"$dst" = x ]  
         then  
                 echo "install:  no destination specified"  
                 exit 1  
         else  
                 true  
         fi  
   
 # If destination is a directory, append the input filename; if your system  
 # does not like double slashes in filenames, you may need to add some logic  
   
         if [ -d $dst ]  
         then  
                 dst="$dst"/`basename $src`  
         else  
                 true  
         fi  
 fi  
   
 ## this sed command emulates the dirname command  
 dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`  
   
 # Make sure that the destination directory exists.  
 #  this part is taken from Noah Friedman's mkinstalldirs script  
127    
128  # Skip lots of stat calls in the usual case.      -t) dstarg=$2
129  if [ ! -d "$dstdir" ]; then          shift
130  defaultIFS='              shift
131  '          continue;;
 IFS="${IFS-${defaultIFS}}"  
   
 oIFS="${IFS}"  
 # Some sh's can't handle IFS=/ for some reason.  
 IFS='%'  
 set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`  
 IFS="${oIFS}"  
   
 pathcomp=''  
132    
133  while [ $# -ne 0 ] ; do      -T) no_target_directory=true
         pathcomp="${pathcomp}${1}"  
134          shift          shift
135            continue;;
136    
137          if [ ! -d "${pathcomp}" ] ;      --version) echo "$0 $scriptversion"; exit 0;;
         then  
                 $mkdirprog "${pathcomp}"  
         else  
                 true  
         fi  
138    
139          pathcomp="${pathcomp}/"      *)  # When -d is used, all remaining arguments are directories to create.
140            # When -t is used, the destination is already specified.
141            test -n "$dir_arg$dstarg" && break
142            # Otherwise, the last argument is the destination.  Remove it from $@.
143            for arg
144            do
145              if test -n "$dstarg"; then
146                # $@ is not empty: it contains at least $arg.
147                set fnord "$@" "$dstarg"
148                shift # fnord
149              fi
150              shift # arg
151              dstarg=$arg
152            done
153            break;;
154      esac
155  done  done
 fi  
   
 if [ x"$dir_arg" != x ]  
 then  
         $doit $instcmd $dst &&  
   
         if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&  
         if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&  
         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  
156    
157          $doit $instcmd $src $dsttmp &&  if test -z "$1"; then
158      if test -z "$dir_arg"; then
159          trap "rm -f ${dsttmp}" 0 &&      echo "$0: no input file specified." >&2
160        exit 1
161  # and set any options; do chmod last to preserve setuid bits    fi
162      # It's OK to call `install-sh -d' without argument.
163  # If any of these fail, we abort the whole thing.  If we want to    # This can happen when creating conditional directories.
164  # ignore errors from any of these, just make sure not to ignore    exit 0
165  # errors from the above "$doit $instcmd $src $dsttmp" command.  fi
   
         if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&  
         if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&  
         if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&  
         if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&  
   
 # Now rename the file to the real destination.  
   
         $doit $rmcmd -f $dstdir/$dstfile &&  
         $doit $mvcmd $dsttmp $dstdir/$dstfile  
166    
167  fi &&  for src
168    do
169      # Protect names starting with `-'.
170      case $src in
171        -*) src=./$src ;;
172      esac
173    
174      if test -n "$dir_arg"; then
175        dst=$src
176        src=
177    
178        if test -d "$dst"; then
179          mkdircmd=:
180          chmodcmd=
181        else
182          mkdircmd=$mkdirprog
183        fi
184      else
185        # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
186        # might cause directories to be created, which would be especially bad
187        # if $src (and thus $dsttmp) contains '*'.
188        if test ! -f "$src" && test ! -d "$src"; then
189          echo "$0: $src does not exist." >&2
190          exit 1
191        fi
192    
193        if test -z "$dstarg"; then
194          echo "$0: no destination specified." >&2
195          exit 1
196        fi
197    
198        dst=$dstarg
199        # Protect names starting with `-'.
200        case $dst in
201          -*) dst=./$dst ;;
202        esac
203    
204        # If destination is a directory, append the input filename; won't work
205        # if double slashes aren't ignored.
206        if test -d "$dst"; then
207          if test -n "$no_target_directory"; then
208            echo "$0: $dstarg: Is a directory" >&2
209            exit 1
210          fi
211          dst=$dst/`basename "$src"`
212        fi
213      fi
214    
215      # This sed command emulates the dirname command.
216      dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
217    
218      # Make sure that the destination directory exists.
219    
220      # Skip lots of stat calls in the usual case.
221      if test ! -d "$dstdir"; then
222        defaultIFS='
223             '
224        IFS="${IFS-$defaultIFS}"
225    
226        oIFS=$IFS
227        # Some sh's can't handle IFS=/ for some reason.
228        IFS='%'
229        set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
230        shift
231        IFS=$oIFS
232    
233        pathcomp=
234    
235        while test $# -ne 0 ; do
236          pathcomp=$pathcomp$1
237          shift
238          if test ! -d "$pathcomp"; then
239            $mkdirprog "$pathcomp"
240            # mkdir can fail with a `File exist' error in case several
241            # install-sh are creating the directory concurrently.  This
242            # is OK.
243            test -d "$pathcomp" || exit
244          fi
245          pathcomp=$pathcomp/
246        done
247      fi
248    
249      if test -n "$dir_arg"; then
250        $doit $mkdircmd "$dst" \
251          && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
252          && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
253          && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
254          && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
255    
256      else
257        dstfile=`basename "$dst"`
258    
259        # Make a couple of temp file names in the proper directory.
260        dsttmp=$dstdir/_inst.$$_
261        rmtmp=$dstdir/_rm.$$_
262    
263        # Trap to clean up those temp files at exit.
264        trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
265        trap '(exit $?); exit' 1 2 13 15
266    
267        # Copy the file name to the temp name.
268        $doit $cpprog "$src" "$dsttmp" &&
269    
270        # and set any options; do chmod last to preserve setuid bits.
271        #
272        # If any of these fail, we abort the whole thing.  If we want to
273        # ignore errors from any of these, just make sure not to ignore
274        # errors from the above "$doit $cpprog $src $dsttmp" command.
275        #
276        { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
277          && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
278          && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
279          && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
280    
281        # Now rename the file to the real destination.
282        { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
283          || {
284               # The rename failed, perhaps because mv can't rename something else
285               # to itself, or perhaps because mv is so ancient that it does not
286               # support -f.
287    
288               # Now remove or move aside any old file at destination location.
289               # We try this two ways since rm can't unlink itself on some
290               # systems and the destination file might be busy for other
291               # reasons.  In this case, the final cleanup might fail but the new
292               # file should still install successfully.
293               {
294                 if test -f "$dstdir/$dstfile"; then
295                   $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
296                   || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
297                   || {
298                     echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
299                     (exit 1); exit 1
300                   }
301                 else
302                   :
303                 fi
304               } &&
305    
306               # Now rename the file to the real destination.
307               $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
308             }
309        }
310      fi || { (exit 1); exit 1; }
311    done
312    
313  exit 0  # The final little trick to "correctly" pass the exit status to the exit trap.
314    {
315      (exit 0); exit 0
316    }
317    
318    # Local variables:
319    # eval: (add-hook 'write-file-hooks 'time-stamp)
320    # time-stamp-start: "scriptversion="
321    # time-stamp-format: "%:y-%02m-%02d.%02H"
322    # time-stamp-end: "$"
323    # End:

Legend:
Removed from v.1.1.1.1  
changed lines
  Added in v.1.2

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26