@@ -189,6 +189,16 @@ validate_opt () {
189
189
done
190
190
}
191
191
192
+ absolutify () {
193
+ FILE_PATH=" ${1} "
194
+ FILE_PATH_DIRNAME=" $( dirname ${FILE_PATH} ) "
195
+ FILE_PATH_BASENAME=" $( basename ${FILE_PATH} ) "
196
+ FILE_ABS_PATH=" $( cd ${FILE_PATH_DIRNAME} && pwd) "
197
+ FILE_PATH=" ${FILE_ABS_PATH} /${FILE_PATH_BASENAME} "
198
+ # This is the return value
199
+ ABSOLUTIFIED=" ${FILE_PATH} "
200
+ }
201
+
192
202
CFG_SRC_DIR=" $( cd $( dirname $0 ) && pwd) /"
193
203
CFG_SELF=" $0 "
194
204
CFG_ARGS=" $@ "
@@ -212,6 +222,7 @@ BOOL_OPTIONS=""
212
222
VAL_OPTIONS=" "
213
223
214
224
flag uninstall " only uninstall from the installation prefix"
225
+ opt verify 1 " verify that the installed binaries run correctly"
215
226
valopt prefix " /usr/local" " set installation prefix"
216
227
# NB This isn't quite the same definition as in `configure`.
217
228
# just using 'lib' instead of CFG_LIBDIR_RELATIVE
@@ -230,28 +241,50 @@ validate_opt
230
241
231
242
# OK, let's get installing ...
232
243
244
+ # Sanity check: can we run the binaries?
245
+ if [ -z " ${CFG_DISABLE_VERIFY} " ]
246
+ then
247
+ # Don't do this if uninstalling. Failure here won't help in any way.
248
+ if [ -z " ${CFG_UNINSTALL} " ]
249
+ then
250
+ msg " verifying platform can run binaries"
251
+ " ${CFG_SRC_DIR} /bin/rustc" --version > /dev/null
252
+ if [ $? -ne 0 ]
253
+ then
254
+ err " can't execute rustc binary on this platform"
255
+ fi
256
+ fi
257
+ fi
258
+
233
259
# Sanity check: can we can write to the destination?
260
+ msg " verifying destination is writable"
234
261
umask 022 && mkdir -p " ${CFG_LIBDIR} "
235
- need_ok " can't write to destination. consider ' sudo' ."
236
- touch " ${CFG_LIBDIR} /rust-install-probe" 2 > /dev/null
262
+ need_ok " can't write to destination. consider \` sudo\` ."
263
+ touch " ${CFG_LIBDIR} /rust-install-probe" > /dev/null
237
264
if [ $? -ne 0 ]
238
265
then
239
- err " can't write to destination. consider ' sudo' ."
266
+ err " can't write to destination. consider \` sudo\` ."
240
267
fi
241
- rm " ${CFG_LIBDIR} /rust-install-probe"
268
+ rm -f " ${CFG_LIBDIR} /rust-install-probe"
242
269
need_ok " failed to remove install probe"
243
270
244
271
# Sanity check: don't install to the directory containing the installer.
245
272
# That would surely cause chaos.
273
+ msg " verifying destination is not the same as source"
246
274
INSTALLER_DIR=" $( cd $( dirname $0 ) && pwd) "
247
275
PREFIX_DIR=" $( cd ${CFG_PREFIX} && pwd) "
248
276
if [ " ${INSTALLER_DIR} " = " ${PREFIX_DIR} " ]
249
277
then
250
278
err " can't install to same directory as installer"
251
279
fi
252
280
281
+ # Using an absolute path to libdir in a few places so that the status
282
+ # messages are consistently using absolute paths.
283
+ absolutify " ${CFG_LIBDIR} "
284
+ ABS_LIBDIR=" ${ABSOLUTIFIED} "
285
+
253
286
# The file name of the manifest we're going to create during install
254
- INSTALLED_MANIFEST=" ${CFG_LIBDIR } /rustlib/manifest"
287
+ INSTALLED_MANIFEST=" ${ABS_LIBDIR } /rustlib/manifest"
255
288
256
289
# First, uninstall from the installation prefix.
257
290
# Errors are warnings - try to rm everything in the manifest even if some fail.
263
296
msg " removing $p "
264
297
if [ -f " $p " ]
265
298
then
266
- rm " $p "
299
+ rm -f " $p "
267
300
if [ $? -ne 0 ]
268
301
then
269
302
warn " failed to remove $p "
@@ -273,8 +306,16 @@ then
273
306
fi
274
307
done < " ${INSTALLED_MANIFEST} "
275
308
309
+ # If we fail to remove rustlib below, then the installed manifest will
310
+ # still be full; the installed manifest needs to be empty before install.
311
+ msg " removing ${INSTALLED_MANIFEST} "
312
+ rm -f " ${INSTALLED_MANIFEST} "
313
+ # For the above reason, this is a hard error
314
+ need_ok " failed to remove installed manifest"
315
+
276
316
# Remove 'rustlib' directory
277
- rm -r " ${CFG_LIBDIR} /rustlib"
317
+ msg " removing ${ABS_LIBDIR} /rustlib"
318
+ rm -Rf " ${ABS_LIBDIR} /rustlib"
278
319
if [ $? -ne 0 ]
279
320
then
280
321
warn " failed to remove rustlib"
298
339
299
340
# Create the installed manifest, which we will fill in with absolute file paths
300
341
mkdir -p " ${CFG_LIBDIR} /rustlib"
342
+ need_ok " failed to create rustlib"
301
343
touch " ${INSTALLED_MANIFEST} "
344
+ need_ok " failed to create installed manifest"
302
345
303
346
# Now install, iterate through the new manifest and copy files
304
347
while read p; do
@@ -324,10 +367,8 @@ while read p; do
324
367
325
368
# Make the path absolute so we can uninstall it later without
326
369
# starting from the installation cwd
327
- FILE_INSTALL_PATH_DIRNAME=" $( dirname ${FILE_INSTALL_PATH} ) "
328
- FILE_INSTALL_PATH_BASENAME=" $( basename ${FILE_INSTALL_PATH} ) "
329
- FILE_INSTALL_ABS_PATH=" $( cd ${FILE_INSTALL_PATH_DIRNAME} && pwd) "
330
- FILE_INSTALL_PATH=" ${FILE_INSTALL_ABS_PATH} /${FILE_INSTALL_PATH_BASENAME} "
370
+ absolutify " ${FILE_INSTALL_PATH} "
371
+ FILE_INSTALL_PATH=" ${ABSOLUTIFIED} "
331
372
332
373
# Install the file
333
374
msg " ${FILE_INSTALL_PATH} "
@@ -346,6 +387,22 @@ while read p; do
346
387
# The manifest lists all files to install
347
388
done < " ${CFG_SRC_DIR} /lib/rustlib/manifest.in"
348
389
390
+ # Sanity check: can we run the installed binaries?
391
+ if [ -z " ${CFG_DISABLE_VERIFY} " ]
392
+ then
393
+ msg " verifying installed binaries are executable"
394
+ " ${CFG_PREFIX} /bin/rustc" --version > /dev/null
395
+ if [ $? -ne 0 ]
396
+ then
397
+ ERR=" can't execute installed rustc binary. "
398
+ ERR=" ${ERR} installation may be broken. "
399
+ ERR=" ${ERR} if this is expected then rerun install.sh with \` --disable-verify\` "
400
+ ERR=" ${ERR} or \` make install\` with \` --disable-verify-install\` "
401
+ err " ${ERR} "
402
+ fi
403
+ fi
404
+
405
+
349
406
echo
350
407
echo " Rust is ready to roll."
351
408
echo
0 commit comments