Home | History | Annotate | Download | only in build-aux
      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 	else
    122 		instcmd=mkdir
    123 	fi
    124 else
    125 
    126 # Waiting for this to be detected by the "$instcmd $src $dsttmp" command
    127 # might cause directories to be created, which would be especially bad 
    128 # if $src (and thus $dsttmp) contains '*'.
    129 
    130 	if [ -f $src -o -d $src ]
    131 	then
    132 		true
    133 	else
    134 		echo "install:  $src does not exist"
    135 		exit 1
    136 	fi
    137 	
    138 	if [ x"$dst" = x ]
    139 	then
    140 		echo "install:	no destination specified"
    141 		exit 1
    142 	else
    143 		true
    144 	fi
    145 
    146 # If destination is a directory, append the input filename; if your system
    147 # does not like double slashes in filenames, you may need to add some logic
    148 
    149 	if [ -d $dst ]
    150 	then
    151 		dst="$dst"/`basename $src`
    152 	else
    153 		true
    154 	fi
    155 fi
    156 
    157 ## this sed command emulates the dirname command
    158 dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
    159 
    160 # Make sure that the destination directory exists.
    161 #  this part is taken from Noah Friedman's mkinstalldirs script
    162 
    163 # Skip lots of stat calls in the usual case.
    164 if [ ! -d "$dstdir" ]; then
    165 defaultIFS='	
    166 '
    167 IFS="${IFS-${defaultIFS}}"
    168 
    169 oIFS="${IFS}"
    170 # Some sh's can't handle IFS=/ for some reason.
    171 IFS='%'
    172 set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
    173 IFS="${oIFS}"
    174 
    175 pathcomp=''
    176 
    177 while [ $# -ne 0 ] ; do
    178 	pathcomp="${pathcomp}${1}"
    179 	shift
    180 
    181 	if [ ! -d "${pathcomp}" ] ;
    182         then
    183 		$mkdirprog "${pathcomp}"
    184 	else
    185 		true
    186 	fi
    187 
    188 	pathcomp="${pathcomp}/"
    189 done
    190 fi
    191 
    192 if [ x"$dir_arg" != x ]
    193 then
    194 	$doit $instcmd $dst &&
    195 
    196 	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
    197 	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
    198 	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
    199 	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
    200 else
    201 
    202 # If we're going to rename the final executable, determine the name now.
    203 
    204 	if [ x"$transformarg" = x ] 
    205 	then
    206 		dstfile=`basename $dst`
    207 	else
    208 		dstfile=`basename $dst $transformbasename | 
    209 			sed $transformarg`$transformbasename
    210 	fi
    211 
    212 # don't allow the sed command to completely eliminate the filename
    213 
    214 	if [ x"$dstfile" = x ] 
    215 	then
    216 		dstfile=`basename $dst`
    217 	else
    218 		true
    219 	fi
    220 
    221 # Make a temp file name in the proper directory.
    222 
    223 	dsttmp=$dstdir/#inst.$$#
    224 
    225 # Move or copy the file name to the temp name
    226 
    227 	$doit $instcmd $src $dsttmp &&
    228 
    229 	trap "rm -f ${dsttmp}" 0 &&
    230 
    231 # and set any options; do chmod last to preserve setuid bits
    232 
    233 # If any of these fail, we abort the whole thing.  If we want to
    234 # ignore errors from any of these, just make sure not to ignore
    235 # errors from the above "$doit $instcmd $src $dsttmp" command.
    236 
    237 	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
    238 	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
    239 	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
    240 	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
    241 
    242 # Now rename the file to the real destination.
    243 
    244 	$doit $rmcmd -f $dstdir/$dstfile &&
    245 	$doit $mvcmd $dsttmp $dstdir/$dstfile 
    246 
    247 fi &&
    248 
    249 
    250 exit 0
    251