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