Search
lxdream.org :: lxdream/install-sh
lxdream 0.9.1
released Jun 29
Download Now
filename install-sh
changeset 179:18dacd91aa73
author nkeynes
date Sun Jun 22 04:30:38 2008 +0000 (11 years ago)
permissions -rwxr-xr-x
last change Set log-level to trace automatically if we've asked for a trace on the command line
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 }
.