Files
mercury/tools/mtest
2020-03-25 11:56:31 +11:00

61 lines
2.3 KiB
Bash
Executable File

#!/bin/sh
# vim: ts=4 sw=4 ft=sh expandtab
#
# Test whether a single Mercury source file compiles cleanly.
# If not, show the error messages through a pager.
#
# It can be invoked in two ways. The first is simply "mtest file.m",
# which tests whether file.m compiles cleanly. The second, which is handy
# if you anticipate having to invoke mtest on the same file many times
# in a row but don't want to keep typing its name, is to set the
# environment variable MFILE to file.m, and then just invoke "mtest".
#
case "$#" in
0)
if test "${MFILE}" = ""
then
echo "mtest: the environment variable MFILE must be set"
echo "when invoked without arguments."
exit 1
fi
;;
1)
MFILE="$1"
export MFILE
;;
*)
echo "usage: mtest [filename.m]"
exit 1
;;
esac
MODULE=`m_file_module ${MFILE}`
if test $? != 0
then
# Since the exit status indicates that m_file_module failed,
# its output will be its error message, not the module name.
echo "${MODULE}"
else
# Run the mmake with -j6, unless the user specifies a different level
# of parallelism through the environment variable MTEST_JFACTOR.
#
# Put the output through less, unless the user specifies a different pager
# via the standard PAGER environment variable.
#
# Note that it is important we push the output of mmake, as well as
# the .err file, through the pager. If e.g. an error in another module
# prevents mmake from successfully generating all the .int* files
# that ${MODULE} requires, then what will be in ${MODULE}.err will
# NOT reflect the errors attributable to its current contents. Instead,
# it will reflect the errors attributable to what its content was
# *the last time mmc actually tried to compile it*, which in this case
# would be from *before* the invocation of mtest. This shell script
# has no simple means to distinguish between (a) errors reported by
# mmc when compiling ${MODULE} from (b) errors reported by mmc
# *before* it starts compiling ${MODULE}, but the output from mmake
# should allow the user to make that distinction.
( mmake -k -j${MTEST_JFACTOR:-6} "${MODULE}.c_date" ; \
cat "${MODULE}.err" ) 2>&1 | ${PAGER:-less}
fi