Revision 3132 install-sh

View differences:

install-sh
1 1
#!/bin/sh
2 2
#
3 3
# install - install a program, script, or datafile
4
# This comes from X11R5 (mit/util/scripts/install.sh).
5 4
#
6
# Copyright 1991 by the Massachusetts Institute of Technology
5
# This originates from X11R5 (mit/util/scripts/install.sh), which was
6
# later released in X11R6 (xc/config/util/install.sh) with the
7
# following copyright and license.
7 8
#
8
# Permission to use, copy, modify, distribute, and sell this software and its
9
# documentation for any purpose is hereby granted without fee, provided that
10
# the above copyright notice appear in all copies and that both that
11
# copyright notice and this permission notice appear in supporting
12
# documentation, and that the name of M.I.T. not be used in advertising or
13
# publicity pertaining to distribution of the software without specific,
14
# written prior permission.  M.I.T. makes no representations about the
15
# suitability of this software for any purpose.  It is provided "as is"
16
# without express or implied warranty.
9
# Copyright (C) 1994 X Consortium
17 10
#
11
# Permission is hereby granted, free of charge, to any person obtaining a copy
12
# of this software and associated documentation files (the "Software"), to
13
# deal in the Software without restriction, including without limitation the
14
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
15
# sell copies of the Software, and to permit persons to whom the Software is
16
# furnished to do so, subject to the following conditions:
17
#
18
# The above copyright notice and this permission notice shall be included in
19
# all copies or substantial portions of the Software.
20
#
21
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
24
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
25
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
26
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
#
28
# Except as contained in this notice, the name of the X Consortium shall not
29
# be used in advertising or otherwise to promote the sale, use or other deal-
30
# ings in this Software without prior written authorization from the X Consor-
31
# tium.
32
#
33
#
34
# FSF changes to this file are in the public domain.
35
#
18 36
# Calling this script install-sh is preferred over install.sh, to prevent
19 37
# `make' implicit rules from creating a file called install from it
20 38
# when there is no Makefile.
......
56 74

  
57 75
while [ x"$1" != x ]; do
58 76
    case $1 in
59
	-c) instcmd="$cpprog"
77
	-c) instcmd=$cpprog
60 78
	    shift
61 79
	    continue;;
62 80

  
......
79 97
	    shift
80 98
	    continue;;
81 99

  
82
	-s) stripcmd="$stripprog"
100
	-s) stripcmd=$stripprog
83 101
	    shift
84 102
	    continue;;
85 103

  
......
106 124

  
107 125
if [ x"$src" = x ]
108 126
then
109
	echo "install:	no input file specified"
127
	echo "$0: no input file specified" >&2
110 128
	exit 1
111 129
else
112
	true
130
	:
113 131
fi
114 132

  
115 133
if [ x"$dir_arg" != x ]; then
116 134
	dst=$src
117 135
	src=""
118
	
119
	if [ -d $dst ]; then
136

  
137
	if [ -d "$dst" ]; then
120 138
		instcmd=:
121 139
		chmodcmd=""
122 140
	else
123
		instcmd=mkdir
141
		instcmd=$mkdirprog
124 142
	fi
125 143
else
126 144

  
127 145
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
128
# might cause directories to be created, which would be especially bad 
146
# might cause directories to be created, which would be especially bad
129 147
# if $src (and thus $dsttmp) contains '*'.
130 148

  
131
	if [ -f $src -o -d $src ]
149
	if [ -f "$src" ] || [ -d "$src" ]
132 150
	then
133
		true
151
		:
134 152
	else
135
		echo "install:  $src does not exist"
153
		echo "$0: $src does not exist" >&2
136 154
		exit 1
137 155
	fi
138
	
156

  
139 157
	if [ x"$dst" = x ]
140 158
	then
141
		echo "install:	no destination specified"
159
		echo "$0: no destination specified" >&2
142 160
		exit 1
143 161
	else
144
		true
162
		:
145 163
	fi
146 164

  
147 165
# If destination is a directory, append the input filename; if your system
148 166
# does not like double slashes in filenames, you may need to add some logic
149 167

  
150
	if [ -d $dst ]
168
	if [ -d "$dst" ]
151 169
	then
152
		dst="$dst"/`basename $src`
170
		dst=$dst/`basename "$src"`
153 171
	else
154
		true
172
		:
155 173
	fi
156 174
fi
157 175

  
158 176
## this sed command emulates the dirname command
159
dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
177
dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
160 178

  
161 179
# Make sure that the destination directory exists.
162 180
#  this part is taken from Noah Friedman's mkinstalldirs script
163 181

  
164 182
# Skip lots of stat calls in the usual case.
165 183
if [ ! -d "$dstdir" ]; then
166
defaultIFS=' 	
167
'
168
IFS="${IFS-${defaultIFS}}"
184
defaultIFS='
185
	'
186
IFS="${IFS-$defaultIFS}"
169 187

  
170
oIFS="${IFS}"
188
oIFS=$IFS
171 189
# Some sh's can't handle IFS=/ for some reason.
172 190
IFS='%'
173
set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
174
IFS="${oIFS}"
191
set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
192
IFS=$oIFS
175 193

  
176 194
pathcomp=''
177 195

  
178 196
while [ $# -ne 0 ] ; do
179
	pathcomp="${pathcomp}${1}"
197
	pathcomp=$pathcomp$1
180 198
	shift
181 199

  
182
	if [ ! -d "${pathcomp}" ] ;
200
	if [ ! -d "$pathcomp" ] ;
183 201
        then
184
		$mkdirprog "${pathcomp}"
202
		$mkdirprog "$pathcomp"
185 203
	else
186
		true
204
		:
187 205
	fi
188 206

  
189
	pathcomp="${pathcomp}/"
207
	pathcomp=$pathcomp/
190 208
done
191 209
fi
192 210

  
193 211
if [ x"$dir_arg" != x ]
194 212
then
195
	$doit $instcmd $dst &&
213
	$doit $instcmd "$dst" &&
196 214

  
197
	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
198
	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
199
	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
200
	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
215
	if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi &&
216
	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi &&
217
	if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi &&
218
	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi
201 219
else
202 220

  
203 221
# If we're going to rename the final executable, determine the name now.
204 222

  
205
	if [ x"$transformarg" = x ] 
223
	if [ x"$transformarg" = x ]
206 224
	then
207
		dstfile=`basename $dst`
225
		dstfile=`basename "$dst"`
208 226
	else
209
		dstfile=`basename $dst $transformbasename | 
227
		dstfile=`basename "$dst" $transformbasename |
210 228
			sed $transformarg`$transformbasename
211 229
	fi
212 230

  
213 231
# don't allow the sed command to completely eliminate the filename
214 232

  
215
	if [ x"$dstfile" = x ] 
233
	if [ x"$dstfile" = x ]
216 234
	then
217
		dstfile=`basename $dst`
235
		dstfile=`basename "$dst"`
218 236
	else
219
		true
237
		:
220 238
	fi
221 239

  
222
# Make a temp file name in the proper directory.
240
# Make a couple of temp file names in the proper directory.
223 241

  
224
	dsttmp=$dstdir/#inst.$$#
242
	dsttmp=$dstdir/_inst.$$_
243
	rmtmp=$dstdir/_rm.$$_
225 244

  
245
# Trap to clean up temp files at exit.
246

  
247
	trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
248
	trap '(exit $?); exit' 1 2 13 15
249

  
226 250
# Move or copy the file name to the temp name
227 251

  
228
	$doit $instcmd $src $dsttmp &&
252
	$doit $instcmd "$src" "$dsttmp" &&
229 253

  
230
	trap "rm -f ${dsttmp}" 0 &&
231

  
232 254
# and set any options; do chmod last to preserve setuid bits
233 255

  
234 256
# If any of these fail, we abort the whole thing.  If we want to
235 257
# ignore errors from any of these, just make sure not to ignore
236 258
# errors from the above "$doit $instcmd $src $dsttmp" command.
237 259

  
238
	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
239
	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
240
	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
241
	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
260
	if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi &&
261
	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi &&
262
	if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi &&
263
	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi &&
242 264

  
265
# Now remove or move aside any old file at destination location.  We try this
266
# two ways since rm can't unlink itself on some systems and the destination
267
# file might be busy for other reasons.  In this case, the final cleanup
268
# might fail but the new file should still install successfully.
269

  
270
{
271
	if [ -f "$dstdir/$dstfile" ]
272
	then
273
		$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null ||
274
		$doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null ||
275
		{
276
		  echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
277
		  (exit 1); exit
278
		}
279
	else
280
		:
281
	fi
282
} &&
283

  
243 284
# Now rename the file to the real destination.
244 285

  
245
	$doit $rmcmd -f $dstdir/$dstfile &&
246
	$doit $mvcmd $dsttmp $dstdir/$dstfile 
286
	$doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
247 287

  
248 288
fi &&
249 289

  
290
# The final little trick to "correctly" pass the exit status to the exit trap.
250 291

  
251
exit 0
292
{
293
	(exit 0); exit
294
}

Also available in: Unified diff