mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-17 23:05:21 +00:00
Estimated hours taken: 3 Change the Mmake rules for `mmake install' so that they install the compiler-generated header files for MLDS grades. compiler/modules.m: Generate a new rule for `lib<module>.install_hdrs' in the `.dep' files. If --high-level-code is enabled, this rule installs the header files, otherwise it does nothing. scripts/Mmake.rules: Make `lib<module>.install' depend on `lib<module>.install_hdrs'. library/Mmakefile: - Override the default definition of `mercury.hs', so that the header file names include the `mercury.' prefix that the MLDS back-end uses for header files in the standard library. - Simplify the code by using the automatically generated rule for `liblibrary.install_ints' rather than hand-coding it, and by using `install_lib_dirs' and `install_grade_dirs' (which are defined by scripts/Mmake.rules) rather than hand-coding a rule for `install_dirs'. Mmakefile: scripts/Mmake.rules: scripts/mercury_cleanup_install: In the rules for `mmake install_grades', make sure to move the `.h' and `.dep' files out of the way too, like we do for the `.c', `.o', etc. files, since the contents of the `.h' and `.dep' files now depend on the grade.
101 lines
3.6 KiB
Bash
Executable File
101 lines
3.6 KiB
Bash
Executable File
#! /bin/sh
|
|
#---------------------------------------------------------------------------#
|
|
# Copyright (C) 1999 Monash University.
|
|
# Copyright (C) 2000 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 <wharvey@cs.monash.edu.au>
|
|
#
|
|
# 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
|
|
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 <<END
|
|
|
|
Clean-up failed in the following directories:
|
|
|
|
$cleanup_failed_dirs
|
|
|
|
Either fix these directories by hand, or start over from scratch.
|
|
|
|
END
|
|
exit 1
|
|
fi
|
|
|
|
exit 0
|
|
|