install.sh revision 119610
11541Srgrimes#!/bin/sh 21541Srgrimes# 31541Srgrimes# install - install a program, script, or datafile 41541Srgrimes# This comes from X11R5. 51541Srgrimes# 61541Srgrimes# $XConsortium: install.sh,v 1.2 89/12/18 14:47:22 jim Exp $ 71541Srgrimes# 81541Srgrimes# Copyright 1991 by the Massachusetts Institute of Technology 91541Srgrimes# 101541Srgrimes# Permission to use, copy, modify, distribute, and sell this software and its 111541Srgrimes# documentation for any purpose is hereby granted without fee, provided that 121541Srgrimes# the above copyright notice appear in all copies and that both that 131541Srgrimes# copyright notice and this permission notice appear in supporting 141541Srgrimes# documentation, and that the name of M.I.T. not be used in advertising or 151541Srgrimes# publicity pertaining to distribution of the software without specific, 161541Srgrimes# written prior permission. M.I.T. makes no representations about the 171541Srgrimes# suitability of this software for any purpose. It is provided "as is" 181541Srgrimes# without express or implied warranty. 191541Srgrimes# 201541Srgrimes# This script is compatible with the BSD install script, but was written 211541Srgrimes# from scratch. 221541Srgrimes# 231541Srgrimes 241541Srgrimes# set DOITPROG to echo to test this script 251541Srgrimes 261541Srgrimes# Don't use :- since 4.3BSD and earlier shells don't like it. 271541Srgrimesdoit="${DOITPROG-}" 281541Srgrimes 291541Srgrimes 301541Srgrimes# put in absolute paths if you don't have them in your path; or use env. vars. 311541Srgrimes 321541Srgrimesmvprog="${MVPROG-mv}" 331541Srgrimescpprog="${CPPROG-cp}" 341541Srgrimeschmodprog="${CHMODPROG-chmod}" 351541Srgrimeschownprog="${CHOWNPROG-chown}" 361541Srgrimeschgrpprog="${CHGRPPROG-chgrp}" 371541Srgrimesstripprog="${STRIPPROG-strip}" 381541Srgrimesrmprog="${RMPROG-rm}" 391541Srgrimesmkdirprog="${MKDIRPROG-mkdir}" 401541Srgrimes 411541Srgrimestranformbasename="" 421541Srgrimestransform_arg="" 431541Srgrimesinstcmd="$mvprog" 441541Srgrimeschmodcmd="$chmodprog 0755" 451541Srgrimeschowncmd="" 461541Srgrimeschgrpcmd="" 471541Srgrimesstripcmd="" 481541Srgrimesrmcmd="$rmprog -f" 491541Srgrimesmvcmd="$mvprog" 501541Srgrimessrc="" 511541Srgrimesdst="" 521541Srgrimesdir_arg="" 531541Srgrimes 541541Srgrimeswhile [ x"$1" != x ]; do 551541Srgrimes case $1 in 561541Srgrimes -c) instcmd="$cpprog" 571541Srgrimes shift 581541Srgrimes continue;; 591541Srgrimes 601541Srgrimes -d) dir_arg=true 611541Srgrimes shift 621541Srgrimes continue;; 631541Srgrimes 641541Srgrimes -m) chmodcmd="$chmodprog $2" 651541Srgrimes shift 661541Srgrimes shift 671541Srgrimes continue;; 681541Srgrimes 691541Srgrimes -o) chowncmd="$chownprog $2" 701541Srgrimes shift 711541Srgrimes shift 721541Srgrimes continue;; 731541Srgrimes 741541Srgrimes -g) chgrpcmd="$chgrpprog $2" 751541Srgrimes shift 761541Srgrimes shift 771541Srgrimes continue;; 781541Srgrimes 791541Srgrimes -s) stripcmd="$stripprog" 801541Srgrimes shift 811541Srgrimes continue;; 821541Srgrimes 831541Srgrimes -t=*) transformarg=`echo $1 | sed 's/-t=//'` 841541Srgrimes shift 85 continue;; 86 87 -b=*) transformbasename=`echo $1 | sed 's/-b=//'` 88 shift 89 continue;; 90 91 *) if [ x"$src" = x ] 92 then 93 src=$1 94 else 95 # this colon is to work around a 386BSD /bin/sh bug 96 : 97 dst=$1 98 fi 99 shift 100 continue;; 101 esac 102done 103 104if [ x"$src" = x ] 105then 106 echo "install: no input file specified" 107 exit 1 108else 109 true 110fi 111 112if [ x"$dir_arg" != x ]; then 113 dst=$src 114 src="" 115 116 if [ -d $dst ]; then 117 instcmd=: 118 else 119 instcmd=mkdir 120 fi 121else 122 123# Waiting for this to be detected by the "$instcmd $src $dsttmp" command 124# might cause directories to be created, which would be especially bad 125# if $src (and thus $dsttmp) contains '*'. 126 127 if [ -f $src -o -d $src ] 128 then 129 true 130 else 131 echo "install: $src does not exist" 132 exit 1 133 fi 134 135 if [ x"$dst" = x ] 136 then 137 echo "install: no destination specified" 138 exit 1 139 else 140 true 141 fi 142 143# If destination is a directory, append the input filename; if your system 144# does not like double slashes in filenames, you may need to add some logic 145 146 if [ -d $dst ] 147 then 148 dst="$dst"/`basename $src` 149 else 150 true 151 fi 152fi 153 154## this sed command emulates the dirname command 155dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` 156 157# Make sure that the destination directory exists. 158# this part is taken from Noah Friedman's mkinstalldirs script 159 160# Skip lots of stat calls in the usual case. 161if [ ! -d "$dstdir" ]; then 162defaultIFS=' 163' 164IFS="${IFS-${defaultIFS}}" 165 166oIFS="${IFS}" 167# Some sh's can't handle IFS=/ for some reason. 168IFS='%' 169set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` 170IFS="${oIFS}" 171 172pathcomp='' 173 174while [ $# -ne 0 ] ; do 175 pathcomp="${pathcomp}${1}" 176 shift 177 178 if [ ! -d "${pathcomp}" ] ; 179 then 180 $mkdirprog "${pathcomp}" 181 else 182 true 183 fi 184 185 pathcomp="${pathcomp}/" 186done 187fi 188 189if [ x"$dir_arg" != x ] 190then 191 $doit $instcmd $dst && 192 193 if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && 194 if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && 195 if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && 196 if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi 197else 198 199# If we're going to rename the final executable, determine the name now. 200 201 if [ x"$transformarg" = x ] 202 then 203 dstfile=`basename $dst` 204 else 205 dstfile=`basename $dst $transformbasename | 206 sed $transformarg`$transformbasename 207 fi 208 209# don't allow the sed command to completely eliminate the filename 210 211 if [ x"$dstfile" = x ] 212 then 213 dstfile=`basename $dst` 214 else 215 true 216 fi 217 218# Make a temp file name in the proper directory. 219 220 dsttmp=$dstdir/#inst.$$# 221 222# Move or copy the file name to the temp name 223 224 $doit $instcmd $src $dsttmp && 225 226 trap "rm -f ${dsttmp}" 0 && 227 228# and set any options; do chmod last to preserve setuid bits 229 230# If any of these fail, we abort the whole thing. If we want to 231# ignore errors from any of these, just make sure not to ignore 232# errors from the above "$doit $instcmd $src $dsttmp" command. 233 234 if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && 235 if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && 236 if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && 237 if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && 238 239# Now rename the file to the real destination. 240 241 $doit $rmcmd -f $dstdir/$dstfile && 242 $doit $mvcmd $dsttmp $dstdir/$dstfile 243 244fi && 245 246 247exit 0 248