mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-14 05:12:33 +00:00
Estimated hours taken: 0.5 Fix a problem where the test cases were sometimes failing if old /tmp/mmake* directories were left lying around. scripts/ml.in: scripts/mmake.in: When creating the temporary directory, if mkdir fails (e.g. because that directory already exists), then try again with a different directory name. Only report an error if it fails 20 times in a row.
264 lines
6.3 KiB
Bash
264 lines
6.3 KiB
Bash
#! /bin/sh
|
|
# @configure_input@
|
|
#---------------------------------------------------------------------------#
|
|
# Copyright (C) 1995-1999 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.
|
|
#---------------------------------------------------------------------------#
|
|
#
|
|
# mmake - Mercury Make.
|
|
#
|
|
# Type mmake -h for help.
|
|
#
|
|
#-----------------------------------------------------------------------------#
|
|
|
|
# IMPORTANT: the manpage is produced automatically from this help
|
|
# message, so if you change the help message, don't forget to check
|
|
# that the manpage still looks OK.
|
|
Help="\
|
|
Name: mmake -- Mercury Make
|
|
Usage: mmake [<mmake options>] [-- <make options>] <target>...
|
|
Options:
|
|
--use-subdirs:
|
|
Build intermediate files in a \`Mercury' subdirectory,
|
|
rather than in the current directory.
|
|
(If the current directory already contains a \`Mercury'
|
|
subdirectory, then this option is the default.)
|
|
-s, --save-makefile:
|
|
Save the generated makefile to \`Mmake.makefile'.
|
|
This is useful for tracking down syntax errors in
|
|
your Mmake file.
|
|
-v, --verbose:
|
|
Print verbose progress messages.
|
|
-w-, --no-warn-undefined-vars:
|
|
Normally Mmake will warn about variables which are used
|
|
but not defined. This option disables that warning.
|
|
(The warning is never enabled when doing \`mmake clean'
|
|
or \`mmake depend' or the like, to avoid spurious
|
|
warnings when the dependencies have not yet been made.)
|
|
-h, --help:
|
|
Print this usage message.
|
|
Targets:
|
|
<module>.depend:
|
|
Make the files \`<module>.dep' and \`<module>.dv'. This
|
|
step is required in preparation for the targets below.
|
|
<module>:
|
|
Compile and link a Mercury program with main module
|
|
\`<module>.m' to produce an executable.
|
|
<module>.nu:
|
|
Compile and link a Mercury program with NU-Prolog
|
|
rather than with the Mercury compiler.
|
|
<module>.sicstus:
|
|
Compile and link a Mercury program with SICStus Prolog
|
|
rather than with the Mercury compiler.
|
|
<module>.nu.debug:
|
|
<module>.sicstus.debug:
|
|
Debugging versions of the above.
|
|
clean:
|
|
Remove intermediate files.
|
|
realclean:
|
|
Remove all automatically-generated files: intermediate files,
|
|
dependency files, and executables.
|
|
"
|
|
|
|
MMAKE_MAKE=${MMAKE_MAKE=@GNU_MAKE@}
|
|
MMAKE_DIR=${MMAKE_DIR=@LIBDIR@/mmake}
|
|
MMAKE_VARS=${MMAKE_VARS=$MMAKE_DIR/Mmake.vars}
|
|
MMAKE_RULES=${MMAKE_RULES=$MMAKE_DIR/Mmake.rules}
|
|
MERCURY_INT_DIR=${MERCURY_INT_DIR=@LIBDIR@/ints}
|
|
MERCURY_DEFAULT_GRADE=${MERCURY_DEFAULT_GRADE=@DEFAULT_GRADE@}
|
|
MKTEMP=@MKTEMP@
|
|
TMPDIR=${TMPDIR=/tmp}
|
|
|
|
MMAKE=$0
|
|
verbose=false
|
|
save_makefile=false
|
|
if [ -d Mercury ]; then
|
|
use_subdirs=${MMAKE_USE_SUBDIRS=yes}
|
|
else
|
|
use_subdirs=${MMAKE_USE_SUBDIRS=no}
|
|
fi
|
|
warn_undefined_vars=true
|
|
|
|
while [ $# -gt 0 ]; do
|
|
case "$1" in
|
|
-h|--help)
|
|
echo "$Help"
|
|
exit 0
|
|
;;
|
|
--use-subdirs)
|
|
use_subdirs=yes
|
|
shift
|
|
;;
|
|
--no-use-subdirs)
|
|
use_subdirs=no
|
|
shift
|
|
;;
|
|
-s|--save-makefile)
|
|
save_makefile=true
|
|
MMAKE="$MMAKE $1"
|
|
shift
|
|
;;
|
|
-s-|--no-save-makefile)
|
|
save_makefile=false
|
|
MMAKE="$MMAKE $1"
|
|
shift
|
|
;;
|
|
-v|--verbose)
|
|
verbose=true
|
|
MMAKE="$MMAKE $1"
|
|
shift
|
|
;;
|
|
-v-|--no-verbose)
|
|
verbose=false
|
|
MMAKE="$MMAKE $1"
|
|
shift
|
|
;;
|
|
-w|--warn-undefined-vars)
|
|
warn_undefined_vars=true
|
|
shift
|
|
;;
|
|
-w-|--no-warn-undefined-vars)
|
|
warn_undefined_vars=false
|
|
shift
|
|
;;
|
|
--)
|
|
MMAKE="$MMAKE $1"
|
|
shift
|
|
break
|
|
;;
|
|
*)
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ -f Mmakefile ]; then
|
|
mmake="Mmakefile"
|
|
else
|
|
if [ -f Mmake ]; then
|
|
mmake="Mmake"
|
|
else
|
|
mmake=""
|
|
fi
|
|
fi
|
|
|
|
case $use_subdirs in
|
|
no)
|
|
dvs="`echo *.dv`"
|
|
if [ "$dvs" = "*.dv" ]; then
|
|
dvs=""
|
|
fi
|
|
deps="`echo *.dep`"
|
|
if [ "$deps" = "*.dep" ]; then
|
|
deps=""
|
|
fi
|
|
ds="`echo *.d`"
|
|
if [ "$ds" = "*.d" ]; then
|
|
ds=""
|
|
fi
|
|
;;
|
|
yes)
|
|
dvs="`echo Mercury/deps/*.dv`"
|
|
if [ "$dvs" = "Mercury/deps/*.dv" ]; then
|
|
dvs=""
|
|
fi
|
|
deps="`echo Mercury/deps/*.dep`"
|
|
if [ "$deps" = "Mercury/deps/*.dep" ]; then
|
|
deps=""
|
|
fi
|
|
ds="`echo Mercury/ds/*.d`"
|
|
if [ "$ds" = "Mercury/ds/*.d" ]; then
|
|
ds=""
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
MMAKE_USE_SUBDIRS=$use_subdirs
|
|
|
|
if $save_makefile; then
|
|
tmp=Mmake.makefile
|
|
else
|
|
case "$MKTEMP" in
|
|
"") old_umask=`umask`
|
|
umask 022
|
|
try=0
|
|
until
|
|
mmake_tmpdir=$TMPDIR/mmake$$-$try
|
|
tmp=$mmake_tmpdir/mmake
|
|
trap 'rmdir $mmake_tmpdir >/dev/null 2>&1; exit 1' \
|
|
1 2 3 13 15
|
|
mkdir $mmake_tmpdir
|
|
do
|
|
try=`expr $try + 1`
|
|
# give up after 20 tries
|
|
case $try in 20)
|
|
echo "mmake: unable to create directory" \
|
|
"for temporary makefile" 1>&2
|
|
exit 1
|
|
esac
|
|
done
|
|
trap 'status=$?; rm -rf $mmake_tmpdir; exit $status' \
|
|
0 1 2 3 13 15
|
|
umask $old_umask
|
|
;;
|
|
*)
|
|
# mktemp should give its own error message.
|
|
tmp=`$MKTEMP $TMPDIR/mmake.XXXXXX` || exit 1
|
|
trap 'status=$?; rm -f $tmp; exit $status' 0 1 2 3 13 15
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
MMAKE_MAKE_CMD="${MMAKE_MAKE} -f $tmp -r"
|
|
|
|
# Enable checking for undefined variables -- but not when making the
|
|
# dependencies, or when cleaning up, because in either of those two
|
|
# cases the dependencies might not have been made yet, so there may be
|
|
# lots of undefined variables.
|
|
case "$@" in
|
|
dep*|*' dep'*|*.dep*|*clean*)
|
|
MMAKE_MAKE_OPTS=""
|
|
;;
|
|
*)
|
|
case $warn_undefined_vars in
|
|
true) MMAKE_MAKE_OPTS="--warn-undefined-variables" ;;
|
|
false) MMAKE_MAKE_OPTS="" ;;
|
|
esac
|
|
;;
|
|
esac
|
|
|
|
# For backwards compatibility/bootstrapping:
|
|
# If no `.dv' files exist, use the `.dep' files instead.
|
|
if [ "$dvs" = "" ] ; then
|
|
dvs=$deps
|
|
deps=
|
|
fi
|
|
|
|
if $verbose; then
|
|
echo MMAKE=$MMAKE
|
|
echo export MMAKE
|
|
echo MMAKE_MAKE_CMD=$MMAKE_MAKE_CMD
|
|
echo export MMAKE_MAKE_CMD
|
|
echo MMAKE_USE_SUBDIRS=$MMAKE_USE_SUBDIRS
|
|
echo export MMAKE_USE_SUBDIRS
|
|
echo MERCURY_INT_DIR=$MERCURY_INT_DIR
|
|
echo export MERCURY_INT_DIR
|
|
echo MERCURY_DEFAULT_GRADE=$MERCURY_DEFAULT_GRADE
|
|
echo export MERCURY_DEFAULT_GRADE
|
|
echo cat ${MMAKE_VARS} $dvs $ds $mmake $deps ${MMAKE_RULES} ">>" $tmp
|
|
echo ${MMAKE_MAKE} ${MMAKE_MAKE_OPTS} -f $tmp -r "$@"
|
|
fi
|
|
export MMAKE
|
|
export MMAKE_MAKE_CMD
|
|
export MMAKE_USE_SUBDIRS
|
|
export MERCURY_INT_DIR
|
|
export MERCURY_DEFAULT_GRADE
|
|
cat ${MMAKE_VARS} $dvs $ds $mmake $deps ${MMAKE_RULES} > $tmp
|
|
case $# in
|
|
# Note that we can't use `exec' here, because if we did that,
|
|
# that `trap' code which removes $tmp would never get executed.
|
|
0) ${MMAKE_MAKE} ${MMAKE_MAKE_OPTS} -f $tmp -r ;;
|
|
*) ${MMAKE_MAKE} ${MMAKE_MAKE_OPTS} -f $tmp -r "$@" ;;
|
|
esac
|