install-sh revision 126274
1230557Sjimharris#!/bin/sh
2230557Sjimharris#
3230557Sjimharris# install - install a program, script, or datafile
4230557Sjimharris# This comes from X11R5 (mit/util/scripts/install.sh).
5230557Sjimharris#
6230557Sjimharris# Copyright 1991 by the Massachusetts Institute of Technology
7230557Sjimharris#
8230557Sjimharris# Permission to use, copy, modify, distribute, and sell this software and its
9230557Sjimharris# documentation for any purpose is hereby granted without fee, provided that
10230557Sjimharris# the above copyright notice appear in all copies and that both that
11230557Sjimharris# copyright notice and this permission notice appear in supporting
12230557Sjimharris# documentation, and that the name of M.I.T. not be used in advertising or
13230557Sjimharris# publicity pertaining to distribution of the software without specific,
14230557Sjimharris# written prior permission.  M.I.T. makes no representations about the
15230557Sjimharris# suitability of this software for any purpose.  It is provided "as is"
16230557Sjimharris# without express or implied warranty.
17230557Sjimharris#
18230557Sjimharris# Calling this script install-sh is preferred over install.sh, to prevent
19230557Sjimharris# `make' implicit rules from creating a file called install from it
20230557Sjimharris# when there is no Makefile.
21230557Sjimharris#
22230557Sjimharris# This script is compatible with the BSD install script, but was written
23230557Sjimharris# from scratch.  It can only install one file at a time, a restriction
24230557Sjimharris# shared with many OS's install programs.
25230557Sjimharris
26230557Sjimharris
27230557Sjimharris# set DOITPROG to echo to test this script
28230557Sjimharris
29230557Sjimharris# Don't use :- since 4.3BSD and earlier shells don't like it.
30230557Sjimharrisdoit="${DOITPROG-}"
31230557Sjimharris
32230557Sjimharris
33230557Sjimharris# put in absolute paths if you don't have them in your path; or use env. vars.
34230557Sjimharris
35230557Sjimharrismvprog="${MVPROG-mv}"
36230557Sjimharriscpprog="${CPPROG-cp}"
37230557Sjimharrischmodprog="${CHMODPROG-chmod}"
38230557Sjimharrischownprog="${CHOWNPROG-chown}"
39230557Sjimharrischgrpprog="${CHGRPPROG-chgrp}"
40230557Sjimharrisstripprog="${STRIPPROG-strip}"
41230557Sjimharrisrmprog="${RMPROG-rm}"
42230557Sjimharrismkdirprog="${MKDIRPROG-mkdir}"
43230557Sjimharris
44230557Sjimharristransformbasename=""
45230557Sjimharristransform_arg=""
46230557Sjimharrisinstcmd="$mvprog"
47230557Sjimharrischmodcmd="$chmodprog 0755"
48230557Sjimharrischowncmd=""
49230557Sjimharrischgrpcmd=""
50230557Sjimharrisstripcmd=""
51230557Sjimharrisrmcmd="$rmprog -f"
52230557Sjimharrismvcmd="$mvprog"
53230557Sjimharrissrc=""
54230557Sjimharrisdst=""
55230557Sjimharrisdir_arg=""
56230557Sjimharris
57230557Sjimharriswhile [ x"$1" != x ]; do
58230557Sjimharris    case $1 in
59230557Sjimharris	-c) instcmd="$cpprog"
60230557Sjimharris	    shift
61230557Sjimharris	    continue;;
62230557Sjimharris
63230557Sjimharris	-d) dir_arg=true
64230557Sjimharris	    shift
65230557Sjimharris	    continue;;
66230557Sjimharris
67230557Sjimharris	-m) chmodcmd="$chmodprog $2"
68230557Sjimharris	    shift
69230557Sjimharris	    shift
70230557Sjimharris	    continue;;
71230557Sjimharris
72230557Sjimharris	-o) chowncmd="$chownprog $2"
73230557Sjimharris	    shift
74230557Sjimharris	    shift
75230557Sjimharris	    continue;;
76230557Sjimharris
77230557Sjimharris	-g) chgrpcmd="$chgrpprog $2"
78230557Sjimharris	    shift
79230557Sjimharris	    shift
80230557Sjimharris	    continue;;
81230557Sjimharris
82230557Sjimharris	-s) stripcmd="$stripprog"
83230557Sjimharris	    shift
84230557Sjimharris	    continue;;
85230557Sjimharris
86230557Sjimharris	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
87230557Sjimharris	    shift
88230557Sjimharris	    continue;;
89230557Sjimharris
90230557Sjimharris	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
91230557Sjimharris	    shift
92230557Sjimharris	    continue;;
93230557Sjimharris
94230557Sjimharris	*)  if [ x"$src" = x ]
95230557Sjimharris	    then
96230557Sjimharris		src=$1
97230557Sjimharris	    else
98230557Sjimharris		# this colon is to work around a 386BSD /bin/sh bug
99230557Sjimharris		:
100230557Sjimharris		dst=$1
101230557Sjimharris	    fi
102230557Sjimharris	    shift
103230557Sjimharris	    continue;;
104230557Sjimharris    esac
105230557Sjimharrisdone
106230557Sjimharris
107230557Sjimharrisif [ x"$src" = x ]
108230557Sjimharristhen
109230557Sjimharris	echo "install:	no input file specified"
110230557Sjimharris	exit 1
111230557Sjimharriselse
112230557Sjimharris	true
113230557Sjimharrisfi
114230557Sjimharris
115230557Sjimharrisif [ x"$dir_arg" != x ]; then
116230557Sjimharris	dst=$src
117230557Sjimharris	src=""
118230557Sjimharris	
119230557Sjimharris	if [ -d $dst ]; then
120230557Sjimharris		instcmd=:
121230557Sjimharris		chmodcmd=""
122230557Sjimharris	else
123230557Sjimharris		instcmd=mkdir
124230557Sjimharris	fi
125230557Sjimharriselse
126230557Sjimharris
127230557Sjimharris# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
128230557Sjimharris# might cause directories to be created, which would be especially bad
129230557Sjimharris# if $src (and thus $dsttmp) contains '*'.
130230557Sjimharris
131230557Sjimharris	if [ -f $src -o -d $src ]
132230557Sjimharris	then
133230557Sjimharris		true
134230557Sjimharris	else
135230557Sjimharris		echo "install:  $src does not exist"
136230557Sjimharris		exit 1
137230557Sjimharris	fi
138230557Sjimharris	
139230557Sjimharris	if [ x"$dst" = x ]
140230557Sjimharris	then
141230557Sjimharris		echo "install:	no destination specified"
142230557Sjimharris		exit 1
143230557Sjimharris	else
144230557Sjimharris		true
145230557Sjimharris	fi
146230557Sjimharris
147230557Sjimharris# If destination is a directory, append the input filename; if your system
148230557Sjimharris# does not like double slashes in filenames, you may need to add some logic
149230557Sjimharris
150230557Sjimharris	if [ -d $dst ]
151230557Sjimharris	then
152230557Sjimharris		dst="$dst"/`basename $src`
153230557Sjimharris	else
154230557Sjimharris		true
155230557Sjimharris	fi
156230557Sjimharrisfi
157230557Sjimharris
158230557Sjimharris## this sed command emulates the dirname command
159230557Sjimharrisdstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
160230557Sjimharris
161230557Sjimharris# Make sure that the destination directory exists.
162230557Sjimharris#  this part is taken from Noah Friedman's mkinstalldirs script
163230557Sjimharris
164230557Sjimharris# Skip lots of stat calls in the usual case.
165230557Sjimharrisif [ ! -d "$dstdir" ]; then
166230557SjimharrisdefaultIFS='	
167230557Sjimharris'
168230557SjimharrisIFS="${IFS-${defaultIFS}}"
169230557Sjimharris
170230557SjimharrisoIFS="${IFS}"
171230557Sjimharris# Some sh's can't handle IFS=/ for some reason.
172230557SjimharrisIFS='%'
173230557Sjimharrisset - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
174230557SjimharrisIFS="${oIFS}"
175230557Sjimharris
176230557Sjimharrispathcomp=''
177230557Sjimharris
178230557Sjimharriswhile [ $# -ne 0 ] ; do
179230557Sjimharris	pathcomp="${pathcomp}${1}"
180230557Sjimharris	shift
181230557Sjimharris
182230557Sjimharris	if [ ! -d "${pathcomp}" ] ;
183230557Sjimharris	then
184230557Sjimharris		$mkdirprog "${pathcomp}"
185230557Sjimharris	else
186230557Sjimharris		true
187230557Sjimharris	fi
188230557Sjimharris
189230557Sjimharris	pathcomp="${pathcomp}/"
190230557Sjimharrisdone
191230557Sjimharrisfi
192230557Sjimharris
193230557Sjimharrisif [ x"$dir_arg" != x ]
194230557Sjimharristhen
195230557Sjimharris	$doit $instcmd $dst &&
196230557Sjimharris
197230557Sjimharris	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
198230557Sjimharris	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
199230557Sjimharris	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
200230557Sjimharris	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
201230557Sjimharriselse
202230557Sjimharris
203230557Sjimharris# If we're going to rename the final executable, determine the name now.
204230557Sjimharris
205230557Sjimharris	if [ x"$transformarg" = x ]
206230557Sjimharris	then
207230557Sjimharris		dstfile=`basename $dst`
208230557Sjimharris	else
209230557Sjimharris		dstfile=`basename $dst $transformbasename |
210230557Sjimharris			sed $transformarg`$transformbasename
211230557Sjimharris	fi
212230557Sjimharris
213230557Sjimharris# don't allow the sed command to completely eliminate the filename
214230557Sjimharris
215230557Sjimharris	if [ x"$dstfile" = x ]
216230557Sjimharris	then
217230557Sjimharris		dstfile=`basename $dst`
218230557Sjimharris	else
219230557Sjimharris		true
220230557Sjimharris	fi
221230557Sjimharris
222230557Sjimharris# Make a temp file name in the proper directory.
223230557Sjimharris
224230557Sjimharris	dsttmp=$dstdir/#inst.$$#
225230557Sjimharris
226230557Sjimharris# Move or copy the file name to the temp name
227230557Sjimharris
228230557Sjimharris	$doit $instcmd $src $dsttmp &&
229230557Sjimharris
230230557Sjimharris	trap "rm -f ${dsttmp}" 0 &&
231230557Sjimharris
232230557Sjimharris# and set any options; do chmod last to preserve setuid bits
233230557Sjimharris
234230557Sjimharris# If any of these fail, we abort the whole thing.  If we want to
235230557Sjimharris# ignore errors from any of these, just make sure not to ignore
236230557Sjimharris# errors from the above "$doit $instcmd $src $dsttmp" command.
237230557Sjimharris
238230557Sjimharris	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
239230557Sjimharris	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
240230557Sjimharris	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
241230557Sjimharris	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
242230557Sjimharris
243230557Sjimharris# Now rename the file to the real destination.
244230557Sjimharris
245230557Sjimharris	$doit $rmcmd -f $dstdir/$dstfile &&
246230557Sjimharris	$doit $mvcmd $dsttmp $dstdir/$dstfile
247230557Sjimharris
248230557Sjimharrisfi &&
249230557Sjimharris
250230557Sjimharris
251230557Sjimharrisexit 0
252230557Sjimharris