Files
mercury/tests/string_format/Mmakefile
Zoltan Somogyi c6637a41ca Delete an obsolete workaround ...
... since Solaris died decades ago.

Add comments explaining some parts of this Mmakefile, and make
some other comments more readable.
2026-01-27 15:01:37 +11:00

127 lines
4.4 KiB
Makefile

#-----------------------------------------------------------------------------#
# vim: ts=8 sw=8 noexpandtab ft=make
#-----------------------------------------------------------------------------#
TESTS_DIR = ..
THIS_DIR = string_format
# We execute the tests in this directory one at a time because all the tests
# use the same library, string_format_lib.m. We *could* create a separate
# copy of this library for each test case, updated automatically if a master
# copy is changed, which would allow us to execute the tests in parallel.
# However, there is no point, because the tests in this directory are
# fast enough even with -j1.
MAYBE_J1 = -j1
#-----------------------------------------------------------------------------#
# Any program added here should also be added to the `.cvsignore' file.
STRING_FORMAT_PROGS = \
string_format_c \
string_format_d \
string_format_e \
string_format_f \
string_format_g \
string_format_int64_d \
string_format_int64_o \
string_format_int64_u \
string_format_int64_x \
string_format_o \
string_format_s \
string_format_u \
string_format_uint_o \
string_format_uint_u \
string_format_uint_x \
string_format_uint64_o \
string_format_uint64_u \
string_format_uint64_x \
string_format_x
# The tests don't work in the *.agc grades, because I (petdr) think
# they take too long to finish, and the CPU time limit is breached.
# NOTE The above assertion was added in 2002. CPU speeds have improved
# since then, but since we have also stopped working on, and caring about,
# .agc grades, there is no point in testing whether the assertion
# is still true.
ifneq "$(findstring .agc,$(GRADE))" ""
PROGS =
else
PROGS = $(STRING_FORMAT_PROGS)
endif
TESTS = $(sort $(PROGS))
include ../Mmake.common
# Module-specific options should go in Mercury.options so they can be found
# by `mmc --make'.
include Mercury.options
%.runtest: %.res ;
# This rule is adapted from the rule in ../../Mmake.common. The difference
# is that if the test fails, then, due to the large size of the output files,
# we display only their last 20 lines.
%.out: %
{ [ -f $*.inp ] && cat $*.inp; } | ./$< > $@ 2>&1 || \
{ grep . $@ /dev/null | tail -n 20; exit 1; }
# This rule is adapted from the rule in ../../Mmake.common. The only
# differences are that
#
# - due to the large sizes of the output files, we write only the first
# 50 lines to stdout, and that
#
# - due to the now-deleted IL backends using a different ordering for
# lexical comparisons than the C backend, we sort both the output and
# the expected output before the comparison. (The reason for sorting
# the expected output as well as the actual output is to allow for
# different behaviour in different versions of sort.)
%.res: %.exp %.out
@echo "Comparing $*.sorted_out with $*.sorted_exp*,"
@echo " results in $@"
@-rm -f $@ $*.res[1-5]
@sort $*.out > $*.sorted_out
@sort $*.exp > $*.sorted_exp
@{ diff $(DIFF_OPTS) $*.sorted_exp $*.sorted_out > $*.res1 && \
echo "Matched $*.sorted_exp" && \
cp $*.res1 $@; } || \
{ test -f $*.exp2 && \
sort $*.exp2 > $*.sorted_exp2 &&\
diff $(DIFF_OPTS) $*.sorted_exp2 $*.sorted_out > $*.res2 && \
echo "Matched $*.sorted_exp2" && \
cp $*.res2 $@; } || \
{ test -f $*.exp3 && \
sort $*.exp3 > $*.sorted_exp3 && \
diff $(DIFF_OPTS) $*.sorted_exp3 $*.sorted_out > $*.res3 && \
echo "Matched $*.sorted_exp3" && \
cp $*.res3 $@; } || \
{ test -f $*.exp4 && \
sort $*.exp4 > $*.sorted_exp4 && \
diff $(DIFF_OPTS) $*.sorted_exp4 $*.sorted_out > $*.res4 && \
echo "Matched $*.sorted_exp4" && \
cp $*.res4 $@; } || \
{ test -f $*.exp5 && \
sort $*.exp5 > $*.sorted_exp5 && \
diff $(DIFF_OPTS) $*.sorted_exp5 $*.sorted_out > $*.res5 && \
echo "Matched $*.sorted_exp5" && \
cp $*.res5 $@; } || \
{ shortest=`wc -l $*.res[1-5] | grep -v total | sort -n | \
head -1 | awk '{ print $$2; }' `; \
echo "** $*.sorted_out did not match the expected output"; \
echo "** (closest match was $$shortest)"; \
echo "** The diff is located in $@"; \
cp $$shortest $@; \
cat $$shortest | head -n 50; \
exit 1; }
#-----------------------------------------------------------------------------#
realclean_local: clean_sorted_files
clean_local: clean_sorted_files
clean_sorted_files:
rm -f *.sorted_out *.sorted_exp*
#-----------------------------------------------------------------------------#
#-----------------------------------------------------------------------------#