Search
lxdream.org :: lxdream/install-sh
lxdream 0.9.1
released Jun 29
Download Now
filename install-sh
changeset 179:18dacd91aa73
author nkeynes
date Sat Aug 05 00:18:21 2006 +0000 (13 years ago)
permissions -rwxr-xr-x
last change Add error lines to tests with incomplete polys
Split clip tests to separate data file
Add tests for cmd bit 23 ("use list size field")
view annotate diff log raw
     1 #!/bin/sh
     2 #
     3 # install - install a program, script, or datafile
     4 #
     5 # This originates from X11R5 (mit/util/scripts/install.sh), which was
     6 # later released in X11R6 (xc/config/util/install.sh) with the
     7 # following copyright and license.
     8 #
     9 # Copyright (C) 1994 X Consortium
    10 #
    11 # Permission is hereby granted, free of charge, to any person obtaining a copy
    12 # of this software and associated documentation files (the "Software"), to
    13 # deal in the Software without restriction, including without limitation the
    14 # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
    15 # sell copies of the Software, and to permit persons to whom the Software is
    16 # furnished to do so, subject to the following conditions:
    17 #
    18 # The above copyright notice and this permission notice shall be included in
    19 # all copies or substantial portions of the Software.
    20 #
    21 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    22 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    23 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
    24 # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
    25 # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
    26 # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    27 #
    28 # Except as contained in this notice, the name of the X Consortium shall not
    29 # be used in advertising or otherwise to promote the sale, use or other deal-
    30 # ings in this Software without prior written authorization from the X Consor-
    31 # tium.
    32 #
    33 #
    34 # FSF changes to this file are in the public domain.
    35 #
    36 # Calling this script install-sh is preferred over install.sh, to prevent
    37 # `make' implicit rules from creating a file called install from it
    38 # when there is no Makefile.
    39 #
    40 # This script is compatible with the BSD install script, but was written
    41 # from scratch.  It can only install one file at a time, a restriction
    42 # shared with many OS's install programs.
    45 # set DOITPROG to echo to test this script
    47 # Don't use :- since 4.3BSD and earlier shells don't like it.
    48 doit="${DOITPROG-}"
    51 # put in absolute paths if you don't have them in your path; or use env. vars.
    53 mvprog="${MVPROG-mv}"
    54 cpprog="${CPPROG-cp}"
    55 chmodprog="${CHMODPROG-chmod}"
    56 chownprog="${CHOWNPROG-chown}"
    57 chgrpprog="${CHGRPPROG-chgrp}"
    58 stripprog="${STRIPPROG-strip}"
    59 rmprog="${RMPROG-rm}"
    60 mkdirprog="${MKDIRPROG-mkdir}"
    62 transformbasename=""
    63 transform_arg=""
    64 instcmd="$mvprog"
    65 chmodcmd="$chmodprog 0755"
    66 chowncmd=""
    67 chgrpcmd=""
    68 stripcmd=""
    69 rmcmd="$rmprog -f"
    70 mvcmd="$mvprog"
    71 src=""
    72 dst=""
    73 dir_arg=""
    75 while [ x"$1" != x ]; do
    76     case $1 in
    77 	-c) instcmd=$cpprog
    78 	    shift
    79 	    continue;;
    81 	-d) dir_arg=true
    82 	    shift
    83 	    continue;;
    85 	-m) chmodcmd="$chmodprog $2"
    86 	    shift
    87 	    shift
    88 	    continue;;
    90 	-o) chowncmd="$chownprog $2"
    91 	    shift
    92 	    shift
    93 	    continue;;
    95 	-g) chgrpcmd="$chgrpprog $2"
    96 	    shift
    97 	    shift
    98 	    continue;;
   100 	-s) stripcmd=$stripprog
   101 	    shift
   102 	    continue;;
   104 	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
   105 	    shift
   106 	    continue;;
   108 	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
   109 	    shift
   110 	    continue;;
   112 	*)  if [ x"$src" = x ]
   113 	    then
   114 		src=$1
   115 	    else
   116 		# this colon is to work around a 386BSD /bin/sh bug
   117 		:
   118 		dst=$1
   119 	    fi
   120 	    shift
   121 	    continue;;
   122     esac
   123 done
   125 if [ x"$src" = x ]
   126 then
   127 	echo "$0: no input file specified" >&2
   128 	exit 1
   129 else
   130 	:
   131 fi
   133 if [ x"$dir_arg" != x ]; then
   134 	dst=$src
   135 	src=""
   137 	if [ -d "$dst" ]; then
   138 		instcmd=:
   139 		chmodcmd=""
   140 	else
   141 		instcmd=$mkdirprog
   142 	fi
   143 else
   145 # Waiting for this to be detected by the "$instcmd $src $dsttmp" command
   146 # might cause directories to be created, which would be especially bad
   147 # if $src (and thus $dsttmp) contains '*'.
   149 	if [ -f "$src" ] || [ -d "$src" ]
   150 	then
   151 		:
   152 	else
   153 		echo "$0: $src does not exist" >&2
   154 		exit 1
   155 	fi
   157 	if [ x"$dst" = x ]
   158 	then
   159 		echo "$0: no destination specified" >&2
   160 		exit 1
   161 	else
   162 		:
   163 	fi
   165 # If destination is a directory, append the input filename; if your system
   166 # does not like double slashes in filenames, you may need to add some logic
   168 	if [ -d "$dst" ]
   169 	then
   170 		dst=$dst/`basename "$src"`
   171 	else
   172 		:
   173 	fi
   174 fi
   176 ## this sed command emulates the dirname command
   177 dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
   179 # Make sure that the destination directory exists.
   180 #  this part is taken from Noah Friedman's mkinstalldirs script
   182 # Skip lots of stat calls in the usual case.
   183 if [ ! -d "$dstdir" ]; then
   184 defaultIFS='
   185 	'
   186 IFS="${IFS-$defaultIFS}"
   188 oIFS=$IFS
   189 # Some sh's can't handle IFS=/ for some reason.
   190 IFS='%'
   191 set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
   192 IFS=$oIFS
   194 pathcomp=''
   196 while [ $# -ne 0 ] ; do
   197 	pathcomp=$pathcomp$1
   198 	shift
   200 	if [ ! -d "$pathcomp" ] ;
   201         then
   202 		$mkdirprog "$pathcomp"
   203 	else
   204 		:
   205 	fi
   207 	pathcomp=$pathcomp/
   208 done
   209 fi
   211 if [ x"$dir_arg" != x ]
   212 then
   213 	$doit $instcmd "$dst" &&
   215 	if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi &&
   216 	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi &&
   217 	if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi &&
   218 	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi
   219 else
   221 # If we're going to rename the final executable, determine the name now.
   223 	if [ x"$transformarg" = x ]
   224 	then
   225 		dstfile=`basename "$dst"`
   226 	else
   227 		dstfile=`basename "$dst" $transformbasename |
   228 			sed $transformarg`$transformbasename
   229 	fi
   231 # don't allow the sed command to completely eliminate the filename
   233 	if [ x"$dstfile" = x ]
   234 	then
   235 		dstfile=`basename "$dst"`
   236 	else
   237 		:
   238 	fi
   240 # Make a couple of temp file names in the proper directory.
   242 	dsttmp=$dstdir/_inst.$$_
   243 	rmtmp=$dstdir/_rm.$$_
   245 # Trap to clean up temp files at exit.
   247 	trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
   248 	trap '(exit $?); exit' 1 2 13 15
   250 # Move or copy the file name to the temp name
   252 	$doit $instcmd "$src" "$dsttmp" &&
   254 # and set any options; do chmod last to preserve setuid bits
   256 # If any of these fail, we abort the whole thing.  If we want to
   257 # ignore errors from any of these, just make sure not to ignore
   258 # errors from the above "$doit $instcmd $src $dsttmp" command.
   260 	if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi &&
   261 	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi &&
   262 	if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi &&
   263 	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi &&
   265 # Now remove or move aside any old file at destination location.  We try this
   266 # two ways since rm can't unlink itself on some systems and the destination
   267 # file might be busy for other reasons.  In this case, the final cleanup
   268 # might fail but the new file should still install successfully.
   270 {
   271 	if [ -f "$dstdir/$dstfile" ]
   272 	then
   273 		$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null ||
   274 		$doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null ||
   275 		{
   276 		  echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
   277 		  (exit 1); exit
   278 		}
   279 	else
   280 		:
   281 	fi
   282 } &&
   284 # Now rename the file to the real destination.
   286 	$doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
   288 fi &&
   290 # The final little trick to "correctly" pass the exit status to the exit trap.
   292 {
   293 	(exit 0); exit
   294 }
.