install-sh
changeset 0 74212992fb08
equal deleted inserted replaced
-1:000000000000 0:74212992fb08
       
     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