#-----------------------------------------------------------------------------#
# vim: ts=8 sw=8 noexpandtab ft=make
#-----------------------------------------------------------------------------#

TESTS_DIR = ..
THIS_DIR = mmc_make
MAYBE_J1 =

#-----------------------------------------------------------------------------#

MMAKE_USE_MMC_MAKE=yes

PROGS0 =	\
	bug489 \
	complex_test \
	hello \
	include_file \
	include_file2 \
	linkage_test \
	rebuild

ifeq "$(filter csharp% java%,$(GRADE))" ""
	# XXX Why isn't build_object listed here?
	C_ONLY_PROGS = \
		factt
else
	C_ONLY_PROGS =
endif

# The tests in this directory work only if the workspace was compiled
# with `--use-subdirs'. We test for this by checking the value of
# TESTS_USE_SUBDIRS, which tools/bootcheck sets to the same value
# it sets MMAKE_USE_SUBDIRS. The reason why we don't check the value
# of MMAKE_USE_SUBDIRS is that mmake itself, through scripts/mmake.in,
# can override the initial value of MMAKE_USE_SUBDIRS if it sees a Mercury
# directory, and we seem to have some test actions that create such
# directories. Some such actions, such as the ones in this directory,
# are *meant* to create Mercury directories, but some others may create them
# even though they shouldn't.
ifeq ($(TESTS_USE_SUBDIRS),yes)
	PROGS = $(PROGS0) $(C_ONLY_PROGS)
else
	PROGS =
endif

TESTS = $(sort $(PROGS))
include ../Mmake.common

%.runtest: %.res ;

Mercury.modules: $(wildcard *.m)
	$(MC) -f $(wildcard *.m)

bug489.log: Mercury.modules

complex_test.log: install_libs

# Check that included files are identified as dependencies of the target code.
# sleep 1 is required because mmc --make timestamps are not granular enough.
include_file2.runtest: include_file
	sleep 1 && touch inc/code.c inc/code.java inc/code.cs
	$(MCM) --verbose-make include_file > include_file2.err 2>&1
	! grep -qi 'error' include_file2.err && \
		grep '^Making Mercury/.*/include_file[.]' include_file2.err

linkage_test.log: install_libs_linkage_test2

# Just test that the executable is rebuilt.
rebuild.runtest:
	$(MCM) --rebuild rebuild
	$(MCM) --rebuild --verbose-make rebuild > rebuild.err2 2>&1
	! grep -qi 'error' rebuild.err2 && \
		grep '^Making rebuild\($$\|\.\)' rebuild.err2

# The compiler used to fail when invoked as `mmc --make build_object.o'.
build_object.runtest: build_object.o

# Check that no errors occur while reading back the .module_dep file on the
# second run.
factt.runtest:
	$(MCM) --make factt
	$(MCM) --make factt >factt.err2 2>&1
	! grep -i 'Error' factt.err2

.PHONY: install_libs
install_libs: start_runtests_local
	$(MMAKE) TESTS_FLAGS
	( cd lib; \
	$(MCM) --no-libgrade --install-prefix $(shell pwd)/install \
		libcomplex_numbers.install ) \
	|| touch complex_test.failed

.PHONY: install_libs_linkage_test2
install_libs_linkage_test2: start_runtests_local
	$(MMAKE) TESTS_FLAGS
	( cd lib; \
	$(MCM) --no-libgrade --install-prefix $(shell pwd)/install \
		liblinkage_test2.install --lib-linkage static ) \
	|| touch linkage_test.failed

# Copy/symlink TESTS_FLAGS into the current directory for when
# we change into the `lib' subdirectory.
TESTS_FLAGS: ../TESTS_FLAGS
	ln -s $< $@ || cp $< $@

realclean_local: realclean_mmc_make

realclean_mmc_make: TESTS_FLAGS
	rm -rf install include_file2.err rebuild.err2 factt.err2
	# ./TESTS_FLAGS is expected by the following line.
	cd lib; $(MCM) complex_numbers.realclean linkage_test2.realclean
	rm -f TESTS_FLAGS
	rm -f Mercury.modules
	rm -rf Mercury lib/Mercury

#-----------------------------------------------------------------------------#
