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