install-sh revision 38889
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. 30doit="${DOITPROG-}" 31 32 33# put in absolute paths if you don't have them in your path; or use env. vars. 34 35mvprog="${MVPROG-mv}" 36cpprog="${CPPROG-cp}" 37chmodprog="${CHMODPROG-chmod}" 38chownprog="${CHOWNPROG-chown}" 39chgrpprog="${CHGRPPROG-chgrp}" 40stripprog="${STRIPPROG-strip}" 41rmprog="${RMPROG-rm}" 42mkdirprog="${MKDIRPROG-mkdir}" 43 44transformbasename="" 45transform_arg="" 46instcmd="$mvprog" 47chmodcmd="$chmodprog 0755" 48chowncmd="" 49chgrpcmd="" 50stripcmd="" 51rmcmd="$rmprog -f" 52mvcmd="$mvprog" 53src="" 54dst="" 55dir_arg="" 56# CYGNUS LOCAL: exeext variable 57exeext="" 58# END CYGNUS LOCAL 59 60while [ x"$1" != x ]; do 61 case $1 in 62 -c) instcmd="$cpprog" 63 shift 64 continue;; 65 66 -d) dir_arg=true 67 shift 68 continue;; 69 70 -m) chmodcmd="$chmodprog $2" 71 shift 72 shift 73 continue;; 74 75 -o) chowncmd="$chownprog $2" 76 shift 77 shift 78 continue;; 79 80 -g) chgrpcmd="$chgrpprog $2" 81 shift 82 shift 83 continue;; 84 85 -s) stripcmd="$stripprog" 86 shift 87 continue;; 88 89 -t=*) transformarg=`echo $1 | sed 's/-t=//'` 90 shift 91 continue;; 92 93 -b=*) transformbasename=`echo $1 | sed 's/-b=//'` 94 shift 95 continue;; 96 97 # CYGNUS LOCAL: -x option 98 -x=*) exeext=`echo $1 | sed 's/-x=//'` 99 shift 100 continue;; 101 102 -x) exeext=".exe" 103 shift 104 continue;; 105 # END CYGNUS LOCAL 106 107 *) if [ x"$src" = x ] 108 then 109 src=$1 110 else 111 # this colon is to work around a 386BSD /bin/sh bug 112 : 113 dst=$1 114 fi 115 shift 116 continue;; 117 esac 118done 119 120if [ x"$src" = x ] 121then 122 echo "install: no input file specified" 123 exit 1 124else 125 true 126fi 127 128if [ x"$dir_arg" != x ]; then 129 dst=$src 130 src="" 131 132 if [ -d $dst ]; then 133 instcmd=: 134 chmodcmd="" 135 else 136 instcmd=mkdir 137 fi 138else 139 140# CYGNUS LOCAL noer 141# Win32-based gcc automatically appends .exe to produced executables, 142# whether asked for or not. This breaks installs. The following 143# changes the value of $src to $src.exe if $src is missing 144 145 if [ -f $src ] 146 then 147 true 148 elif [ -f $src.exe ] 149 then 150 echo "install: $src does not exist, trying with .exe appended" 151 src="$src".exe 152 fi 153 154# end CYGNUS LOCAL noer 155 156# Waiting for this to be detected by the "$instcmd $src $dsttmp" command 157# might cause directories to be created, which would be especially bad 158# if $src (and thus $dsttmp) contains '*'. 159 160 if [ -f $src -o -d $src ] 161 then 162 true 163 else 164 echo "install: $src does not exist" 165 exit 1 166 fi 167 168 if [ x"$dst" = x ] 169 then 170 echo "install: no destination specified" 171 exit 1 172 else 173 true 174 fi 175 176# If destination is a directory, append the input filename; if your system 177# does not like double slashes in filenames, you may need to add some logic 178 179 if [ -d $dst ] 180 then 181 dst="$dst"/`basename $src` 182 else 183 true 184 fi 185 186 # CYGNUS LOCAL: Use exeext 187 case "`basename $dst`" in 188 *.*) ;; 189 *) dst="$dst$exeext" ;; 190 esac 191 # END CYGNUS LOCAL 192fi 193 194## this sed command emulates the dirname command 195dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` 196 197# Make sure that the destination directory exists. 198# this part is taken from Noah Friedman's mkinstalldirs script 199 200# Skip lots of stat calls in the usual case. 201if [ ! -d "$dstdir" ]; then 202defaultIFS=' 203' 204IFS="${IFS-${defaultIFS}}" 205 206oIFS="${IFS}" 207# Some sh's can't handle IFS=/ for some reason. 208IFS='%' 209set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` 210IFS="${oIFS}" 211 212pathcomp='' 213 214while [ $# -ne 0 ] ; do 215 pathcomp="${pathcomp}${1}" 216 shift 217 218 if [ ! -d "${pathcomp}" ] ; 219 then 220 $mkdirprog "${pathcomp}" 221 else 222 true 223 fi 224 225 pathcomp="${pathcomp}/" 226done 227fi 228 229if [ x"$dir_arg" != x ] 230then 231 $doit $instcmd $dst && 232 233 if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && 234 if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && 235 if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && 236 if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi 237else 238 239# If we're going to rename the final executable, determine the name now. 240 241 if [ x"$transformarg" = x ] 242 then 243 dstfile=`basename $dst` 244 else 245 dstfile=`basename $dst $transformbasename | 246 sed $transformarg`$transformbasename 247 fi 248 249# don't allow the sed command to completely eliminate the filename 250 251 if [ x"$dstfile" = x ] 252 then 253 dstfile=`basename $dst` 254 else 255 true 256 fi 257 258# Make a temp file name in the proper directory. 259 260 dsttmp=$dstdir/#inst.$$# 261 262# Move or copy the file name to the temp name 263 264 $doit $instcmd $src $dsttmp && 265 266 trap "rm -f ${dsttmp}" 0 && 267 268# and set any options; do chmod last to preserve setuid bits 269 270# If any of these fail, we abort the whole thing. If we want to 271# ignore errors from any of these, just make sure not to ignore 272# errors from the above "$doit $instcmd $src $dsttmp" command. 273 274 if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && 275 if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && 276 if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && 277 if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && 278 279# Now rename the file to the real destination. 280 281 $doit $rmcmd -f $dstdir/$dstfile && 282 $doit $mvcmd $dsttmp $dstdir/$dstfile 283 284fi && 285 286 287exit 0 288