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