Home | History | Annotate | Line # | Download | only in buildaux
      1 #!/bin/sh
      2 #
      3 # $NetBSD: install-sh,v 1.1 2009/05/26 04:27:29 lukem Exp $
      4 # This script now also installs multiple files, but might choke on installing
      5 # multiple files with spaces in the file names.
      6 #
      7 # install - install a program, script, or datafile
      8 # This comes from X11R5 (mit/util/scripts/install.sh).
      9 #
     10 # Copyright 1991 by the Massachusetts Institute of Technology
     11 #
     12 # Permission to use, copy, modify, distribute, and sell this software and its
     13 # documentation for any purpose is hereby granted without fee, provided that
     14 # the above copyright notice appear in all copies and that both that
     15 # copyright notice and this permission notice appear in supporting
     16 # documentation, and that the name of M.I.T. not be used in advertising or
     17 # publicity pertaining to distribution of the software without specific,
     18 # written prior permission.  M.I.T. makes no representations about the
     19 # suitability of this software for any purpose.  It is provided "as is"
     20 # without express or implied warranty.
     21 #
     22 # Calling this script install-sh is preferred over install.sh, to prevent
     23 # `make' implicit rules from creating a file called install from it
     24 # when there is no Makefile.
     25 #
     26 # This script is compatible with the BSD install script, but was written
     27 # from scratch.
     28 
     29 # set DOITPROG to echo to test this script
     30 
     31 # Don't use :- since 4.3BSD and earlier shells don't like it.
     32 doit="${DOITPROG-}"
     33 
     34 
     35 # put in absolute paths if you don't have them in your path; or use env. vars.
     36 
     37 awkprog="${AWKPROG-awk}"
     38 mvprog="${MVPROG-mv}"
     39 cpprog="${CPPROG-cp}"
     40 chmodprog="${CHMODPROG-chmod}"
     41 chownprog="${CHOWNPROG-chown}"
     42 chgrpprog="${CHGRPPROG-chgrp}"
     43 stripprog="${STRIPPROG-strip}"
     44 rmprog="${RMPROG-rm}"
     45 mkdirprog="${MKDIRPROG-mkdir}"
     46 
     47 instcmd="$mvprog"
     48 pathcompchmodcmd="$chmodprog 755"
     49 chmodcmd="$chmodprog 755"
     50 chowncmd=""
     51 chgrpcmd=""
     52 stripcmd=""
     53 stripflags=""
     54 rmcmd="$rmprog -f"
     55 mvcmd="$mvprog"
     56 src=""
     57 msrc=""
     58 dst=""
     59 dir_arg=""
     60 suffix=""
     61 suffixfmt=""
     62 
     63 while [ x"$1" != x ]; do
     64     case $1 in
     65 	-b) suffix=".old"
     66 	    shift
     67 	    continue;;
     68 
     69 	-B) suffixfmt="$2"
     70 	    shift
     71 	    shift
     72 	    continue;;
     73 
     74 	-c) instcmd="$cpprog"
     75 	    shift
     76 	    continue;;
     77 
     78 	-d) dir_arg=true
     79 	    shift
     80 	    continue;;
     81 
     82 	-m) chmodcmd="$chmodprog $2"
     83 	    shift
     84 	    shift
     85 	    continue;;
     86 
     87 	-o) chowncmd="$chownprog $2"
     88 	    shift
     89 	    shift
     90 	    continue;;
     91 
     92 	-g) chgrpcmd="$chgrpprog $2"
     93 	    shift
     94 	    shift
     95 	    continue;;
     96 
     97 	-s) stripcmd="$stripprog"
     98 	    shift
     99 	    continue;;
    100 
    101 	-S) stripcmd="$stripprog"
    102 	    stripflags="-S $2 $stripflags"
    103 	    shift
    104 	    shift
    105 	    continue;;
    106 
    107 	*)  if [ x"$msrc" = x ]
    108 	    then
    109 		msrc="$dst"
    110 	    else
    111 		msrc="$msrc $dst"
    112 	    fi
    113 	    src="$dst"
    114 	    dst="$1"
    115 	    shift
    116 	    continue;;
    117     esac
    118 done
    119 
    120 if [ x"$dir_arg" = x ]
    121 then
    122 	dstisfile=""
    123 	if [ ! -d "$dst" ]
    124 	then
    125 		if [ x"$msrc" = x"$src" ]
    126 		then
    127 			dstisfile=true
    128 		else
    129 			echo "install: destination is not a directory"
    130 			exit 1
    131 		fi
    132 	fi
    133 else
    134 	msrc="$msrc $dst"
    135 fi
    136 
    137 if [ x"$msrc" = x ]
    138 then
    139 	echo "install: no destination specified"
    140 	exit 1
    141 fi      
    142 
    143 for srcarg in $msrc; do
    144 
    145 if [ x"$dir_arg" != x ]; then
    146 
    147 	dstarg="$srcarg"
    148 else
    149 	dstarg="$dst"
    150 
    151 # Waiting for this to be detected by the "$instcmd $srcarg $dsttmp" command
    152 # might cause directories to be created, which would be especially bad 
    153 # if $src (and thus $dsttmp) contains '*'.
    154 
    155 	if [ -f "$srcarg" ]
    156 	then
    157 		doinst="$instcmd"
    158 	elif [ -d "$srcarg" ]
    159 	then
    160 		echo "install: $srcarg: not a regular file"
    161 		exit 1
    162 	elif [ "$srcarg" = "/dev/null" ]
    163 	then
    164 		doinst="$cpprog"
    165 	else
    166 		echo "install:  $srcarg does not exist"
    167 		exit 1
    168 	fi
    169 	
    170 # If destination is a directory, append the input filename; if your system
    171 # does not like double slashes in filenames, you may need to add some logic
    172 
    173 	if [ -d "$dstarg" ]
    174 	then
    175 		dstarg="$dstarg"/`basename "$srcarg"`
    176 	fi
    177 fi
    178 
    179 ## this sed command emulates the dirname command
    180 dstdir=`echo "$dstarg" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
    181 
    182 # Make sure that the destination directory exists.
    183 #  this part is taken from Noah Friedman's mkinstalldirs script
    184 
    185 # Skip lots of stat calls in the usual case.
    186 if [ ! -d "$dstdir" ]; then
    187 defaultIFS='	
    188 '
    189 IFS="${IFS-${defaultIFS}}"
    190 
    191 oIFS="${IFS}"
    192 # Some sh's can't handle IFS=/ for some reason.
    193 IFS='%'
    194 set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
    195 IFS="${oIFS}"
    196 
    197 pathcomp=''
    198 
    199 while [ $# -ne 0 ] ; do
    200 	pathcomp="${pathcomp}${1}"
    201 	shift
    202 
    203 	if [ ! -d "${pathcomp}" ] ;
    204         then
    205 		$doit $mkdirprog "${pathcomp}"
    206         	if [ x"$chowncmd" != x ]; then $doit $chowncmd "${pathcomp}"; else true ; fi &&
    207         	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "${pathcomp}"; else true ; fi &&
    208         	if [ x"$pathcompchmodcmd" != x ]; then $doit $pathcompchmodcmd "${pathcomp}"; else true ; fi
    209 
    210 	else
    211 		true
    212 	fi
    213 
    214 	pathcomp="${pathcomp}/"
    215 done
    216 fi
    217 
    218 	if [ x"$dir_arg" != x ]
    219 	then
    220 		if [ -d "$dstarg" ]; then
    221 			true
    222 		else
    223 			$doit $mkdirprog "$dstarg" &&
    224 
    225 			if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dstarg"; else true ; fi &&
    226 			if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dstarg"; else true ; fi &&
    227 			if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dstarg"; else true ; fi
    228 		fi
    229 	else
    230 
    231 		if [ x"$dstisfile" = x ]
    232 		then
    233 			file=$srcarg
    234 		else
    235 			file=$dst
    236 		fi
    237 
    238 		dstfile=`basename "$file"`
    239 		dstfinal="$dstdir/$dstfile"
    240 
    241 # Make a temp file name in the proper directory.
    242 
    243 		dsttmp=$dstdir/#inst.$$#
    244 
    245 # Make a backup file name in the proper directory.
    246 		case x$suffixfmt in
    247 		*%*)	suffix=`echo x |
    248 			$awkprog -v bname="$dstfinal" -v fmt="$suffixfmt" '
    249 			{ cnt = 0;
    250 			  do {
    251 				sfx = sprintf(fmt, cnt++);
    252 				name = bname sfx;
    253 			  } while (system("test -f " name) == 0);
    254 			  print sfx; }' -`;;
    255 		x)	;;
    256 		*)	suffix="$suffixfmt";;
    257 		esac
    258 		dstbackup="$dstfinal$suffix"
    259 
    260 # Move or copy the file name to the temp name
    261 
    262 		$doit $doinst $srcarg "$dsttmp" &&
    263 
    264 		trap "rm -f ${dsttmp}" 0 &&
    265 
    266 # and set any options; do chmod last to preserve setuid bits
    267 
    268 # If any of these fail, we abort the whole thing.  If we want to
    269 # ignore errors from any of these, just make sure not to ignore
    270 # errors from the above "$doit $instcmd $src $dsttmp" command.
    271 
    272 		if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else true;fi &&
    273 		if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else true;fi &&
    274 		if [ x"$stripcmd" != x ]; then $doit $stripcmd $stripflags "$dsttmp"; else true;fi &&
    275 		if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else true;fi &&
    276 
    277 # Now rename the file to the real destination.
    278 
    279 		if [ x"$suffix" != x ] && [ -f "$dstfinal" ]
    280 		then
    281 			$doit $mvcmd "$dstfinal" "$dstbackup"
    282 		else
    283 			$doit $rmcmd -f "$dstfinal"
    284 		fi &&
    285 		$doit $mvcmd "$dsttmp" "$dstfinal"
    286 	fi
    287 
    288 done &&
    289 
    290 
    291 exit 0
    292