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