/[bison]/bison/config/install-sh
ViewVC logotype

Diff of /bison/config/install-sh

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

revision 1.6 by eggert, Sat May 24 00:25:55 2003 UTC revision 1.7 by akim, Wed Jun 25 13:45:57 2003 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  #  
4    scriptversion=2003-06-13.21
5    
6  # This originates from X11R5 (mit/util/scripts/install.sh), which was  # This originates from X11R5 (mit/util/scripts/install.sh), which was
7  # later released in X11R6 (xc/config/util/install.sh) with the  # later released in X11R6 (xc/config/util/install.sh) with the
8  # following copyright and license.  # following copyright and license.
# Line 41  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 59  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 "$0: no input file specified" >&2    exit 1
         exit 1  
 else  
         :  
152  fi  fi
153    
154  if [ x"$dir_arg" != x ]; then  if test -n "$dir_arg"; then
155          dst=$src    dst=$src
156          src=""    src=
157    
158          if [ -d "$dst" ]; then    if test -d "$dst"; then
159                  instcmd=:      instcmd=:
160                  chmodcmd=""      chmodcmd=
161          else    else
162                  instcmd=$mkdirprog      instcmd=$mkdirprog
163          fi    fi
164  else  else
165      # Waiting for this to be detected by the "$instcmd $src $dsttmp" command
166  # Waiting for this to be detected by the "$instcmd $src $dsttmp" command    # might cause directories to be created, which would be especially bad
167  # might cause directories to be created, which would be especially bad    # if $src (and thus $dsttmp) contains '*'.
168  # if $src (and thus $dsttmp) contains '*'.    if test ! -f "$src" && test ! -d "$src"; then
169        echo "$0: $src does not exist." >&2
170          if [ -f "$src" ] || [ -d "$src" ]      exit 1
171          then    fi
172                  :  
173          else    if test -z "$dst"; then
174                  echo "$0: $src does not exist" >&2      echo "$0: no destination specified." >&2
175                  exit 1      exit 1
176          fi    fi
177    
178          if [ x"$dst" = x ]    # If destination is a directory, append the input filename; won't work
179          then    # if double slashes aren't ignored.
180                  echo "$0: no destination specified" >&2    if test -d "$dst"; then
181                  exit 1      dst=$dst/`basename "$src"`
182          else    fi
                 :  
         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  
                 :  
         fi  
183  fi  fi
184    
185  ## this sed command emulates the dirname command  ## this sed command emulates the dirname command
186  dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`  dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
187    
188  # Make sure that the destination directory exists.  # Make sure that the destination directory exists.
189  #  this part is taken from Noah Friedman's mkinstalldirs script  # (this part is taken from Noah Friedman's mkinstalldirs script.)
190    
191  # Skip lots of stat calls in the usual case.  # Skip lots of stat calls in the usual case.
192  if [ ! -d "$dstdir" ]; then  if test ! -d "$dstdir"; then
193  defaultIFS='    defaultIFS='
194          '          '
195  IFS="${IFS-$defaultIFS}"    IFS="${IFS-$defaultIFS}"
196    
197  oIFS=$IFS    oIFS=$IFS
198  # Some sh's can't handle IFS=/ for some reason.    # Some sh's can't handle IFS=/ for some reason.
199  IFS='%'    IFS='%'
200  set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`    set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
201  IFS=$oIFS    IFS=$oIFS
202    
203  pathcomp=''    pathcomp=
204    
205  while [ $# -ne 0 ] ; do    while test $# -ne 0 ; do
206          pathcomp=$pathcomp$1      pathcomp=$pathcomp$1
207          shift      shift
208        test -d "$pathcomp" || $mkdirprog "$pathcomp"
209          if [ ! -d "$pathcomp" ] ;      pathcomp=$pathcomp/
210          then    done
                 $mkdirprog "$pathcomp"  
         else  
                 :  
         fi  
   
         pathcomp=$pathcomp/  
 done  
211  fi  fi
212    
213  if [ x"$dir_arg" != x ]  if test -n "$dir_arg"; then
214  then    $doit $instcmd "$dst" \
215          $doit $instcmd "$dst" &&      && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
216        && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
217          if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi &&      && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
218          if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi &&      && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
         if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi &&  
         if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; 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  
                 :  
         fi  
   
 # Make a couple of temp file names in the proper directory.  
219    
220          dsttmp=$dstdir/#inst.$$#  else
221          rmtmp=$dstdir/#rm.$$#    # If we're going to rename the final executable, determine the name now.
222      if test -z "$transformarg"; then
223  # Trap to clean up temp files at exit.      dstfile=`basename "$dst"`
224      else
225          trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0      dstfile=`basename "$dst" $transformbasename \
226          trap '(exit $?); exit' 1 2 13 15               | sed $transformarg`$transformbasename
227      fi
228  # Move or copy the file name to the temp name  
229      # don't allow the sed command to completely eliminate the filename.
230          $doit $instcmd "$src" "$dsttmp" &&    test -z "$dstfile" && dstfile=`basename "$dst"`
231    
232  # and set any options; do chmod last to preserve setuid bits    # Make a couple of temp file names in the proper directory.
233      dsttmp=$dstdir/_inst.$$_
234  # If any of these fail, we abort the whole thing.  If we want to    rmtmp=$dstdir/_rm.$$_
235  # ignore errors from any of these, just make sure not to ignore  
236  # errors from the above "$doit $instcmd $src $dsttmp" command.    # Trap to clean up those temp files at exit.
237      trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
238          if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi &&    trap '(exit $?); exit' 1 2 13 15
239          if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi &&  
240          if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi &&    # Move or copy the file name to the temp name
241          if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi &&    $doit $instcmd "$src" "$dsttmp" &&
242    
243  # Now remove or move aside any old file at destination location.  We try this    # and set any options; do chmod last to preserve setuid bits.
244  # two ways since rm can't unlink itself on some systems and the destination    #
245  # file might be busy for other reasons.  In this case, the final cleanup    # If any of these fail, we abort the whole thing.  If we want to
246  # might fail but the new file should still install successfully.    # ignore errors from any of these, just make sure not to ignore
247      # errors from the above "$doit $instcmd $src $dsttmp" command.
248  {    #
249          if [ -f "$dstdir/$dstfile" ]    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
250          then      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
251                  $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null ||      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
252                  $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null ||      && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
253                  {  
254                    echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2    # Now remove or move aside any old file at destination location.  We
255                    (exit 1); exit    # try this two ways since rm can't unlink itself on some systems and
256                  }    # the destination file might be busy for other reasons.  In this case,
257          else    # the final cleanup might fail but the new file should still install
258                  :    # successfully.
259          fi    {
260  } &&      if test -f "$dstdir/$dstfile"; then
261          $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
262  # Now rename the file to the real destination.        || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
263          || {
264          $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"            echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
265              (exit 1); exit
266          }
267        else
268          :
269        fi
270      } &&
271    
272      # Now rename the file to the real destination.
273      $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
274  fi &&  fi &&
275    
276  # The final little trick to "correctly" pass the exit status to the exit trap.  # The final little trick to "correctly" pass the exit status to the exit trap.
   
277  {  {
278          (exit 0); exit    (exit 0); exit
279  }  }
280    
281    # Local variables:
282    # eval: (add-hook 'write-file-hooks 'time-stamp)
283    # time-stamp-start: "scriptversion="
284    # time-stamp-format: "%:y-%02m-%02d.%02H"
285    # time-stamp-end: "$"
286    # End:

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.7

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