#! /bin/sh #---------------------------------------------------------------------------# # Copyright (C) 1999 Monash University. # Copyright (C) 2000-2002 The University of Melbourne. # This file may only be copied under the terms of the GNU General # Public License - see the file COPYING in the Mercury distribution. #---------------------------------------------------------------------------# # # mercury_cleanup_install # # Author: Warwick Harvey # # Checks for failed/aborted installation attempts, and tries to clean up # after them, since simply re-starting the install may do the wrong thing. # # The main problem with restarting an install is when the install is # interrupted during the building of alternative grades of the library, # runtime, etc. When the alternative grades are being built, the versions # of the compiled files needed for the compiler itself (as opposed to # installed libraries) are moved into a `tmp_dir' subdirectory, with the # alternative versions being built in the old location. This means that if # the process is interrupted and then re-started, the build process will # attempt to re-build the compiler using some files with the wrong grade. # # This script checks for the presence of subdirectories named `tmp_dir', # and if it finds them, assumes that an install process has failed and # needs to be cleaned up. Cleaning up the failed install consists simply # of moving all the files in each `tmp_dir' back to where they came # from, overwriting any alternative grade versions that may be there, # and deleting the temporary directories. # # If there is an error while doing the clean-up, a more aggressive approach # is used. An "mmake clean" is run on the directory in question, and then # the `tmp_dir' is deleted completely. Note that for some directories (e.g. # `library' and `browser'), this deletes some C files, which require a # working version of Mercury to rebuild. However, if the installation got # as far as building the different grades of the library, then the compiler # (plus its default grade) has already been installed. The build scripts # are smart enough to find and use this installed version even if it's not # in the user's path, so the "mmake clean" is safe even if there is no # existing Mercury installation (e.g. if the user is building it from # release sources). cleanup_failed_dirs= for tmp in `find . -name tmp_dir -print` ; do dir=`dirname $tmp` echo "Cleaning up from apparent failed install in \`$dir'..." if ( cd $dir && ( if [ -d Mercury/dirs ] ; then dirs_subdir=Mercury/dirs/ else dirs_subdir= fi # For every saved `.dir' directory, delete any existing one so # it can be moved back (one can't just clobber directories). ( cd tmp_dir && for dir in *.dir ; do if [ "$dir" != "*.dir" ] ; then rm -rf ../$dirs_subdir$dir fi done ) [ -d Mercury/dirs ] && mv tmp_dir/*.dir $dirs_subdir [ -d Mercury/cs ] && mv -f tmp_dir/*.c Mercury/cs [ -d Mercury/os ] && mv -f tmp_dir/*.o tmp_dir/*.pic_o Mercury/os [ -d Mercury/deps ] && mv -f tmp_dir/*.dep Mercury/deps [ -d Mercury/c_dates ] && mv -f tmp_dir/*.c_date Mercury/c_dates [ -d Mercury/mihs ] && mv -f tmp_dir/*.mih Mercury/mihs [ -d Mercury/useds ] && mv -f tmp_dir/*.used Mercury/useds mv -f tmp_dir/* . rmdir tmp_dir ) ) ; then echo "Done." else echo "Failed. Trying a more aggressive approach..." if ( cd $dir && mmake clean && rm -rf tmp_dir ) ; then echo "Succeeded." else echo "Failed again. :-(" cleanup_failed_dirs="$cleanup_failed_dirs $dir" fi fi done if [ -n "$cleanup_failed_dirs" ] ; then cat <