xref: /petsc/gmakefile.test (revision 1dcdb15b858aa6e150067f0cf0ca43c266cc31a8)
149da0fa4SScott Kruger# -*- mode: makefile-gmake -*-
2fca490e6SSatish Balay-include petscdir.mk
349da0fa4SScott Kruger
4c0558f20SBarry Smith.SUFFIXES: .F  .F90 .f90 ${SUFFIXES} .PETSc .C .cc .cpp .cxx .r .rm .so .html .ad .m .tex .mtex .make  .fig .svg .eps .pdf .jpg .png .dvi .ps .F95 .f95 .fiat .cu .kokkos.cxx
5c0558f20SBarry Smith
637ed16bcSStefano ZampiniCONFIGDIR := $(PETSC_DIR)/config
749da0fa4SScott Kruger
8fc46264cSScott Kruger# TESTSRCDIR is always relative to gmakefile.test
9fc46264cSScott Kruger#  This must be before includes
105b5a9be8SJed Brownmkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
115b5a9be8SJed BrownTESTSRCDIR := $(dir $(mkfile_path))src
12fc46264cSScott Kruger
130e03b746SBarry Smith-include $(PETSC_DIR)/$(PETSC_ARCH)/lib/petsc/conf/petscvariables
140e03b746SBarry Smith-include $(PETSC_DIR)/lib/petsc/conf/variables
1549da0fa4SScott Kruger
168e69c5ecSJed BrownTESTDIR ?= ./$(PETSC_ARCH)/tests
174ff3c6a1SScott KrugerMODDIR := $(PETSC_DIR)/$(PETSC_ARCH)/include
18e73aa2c6SSatish BalayTESTLOGTAPFILE ?= $(TESTDIR)/test_$(PETSC_ARCH)_tap.log
19e73aa2c6SSatish BalayTESTLOGERRFILE ?= $(TESTDIR)/test_$(PETSC_ARCH)_err.log
2094666443SJed BrownEXAMPLESDIR := $(TESTSRCDIR)
2149da0fa4SScott Kruger
2249da0fa4SScott Krugerpkgs := sys vec mat dm ksp snes ts tao
2349da0fa4SScott Kruger
244ff3c6a1SScott Krugerpetscconf      := $(PETSC_DIR)/$(PETSC_ARCH)/include/petscconf.h
254ff3c6a1SScott Krugerpetscvariables := $(PETSC_DIR)/$(PETSC_ARCH)/lib/petsc/conf/petscvariables
268e69c5ecSJed Browngeneratedtest  := $(TESTDIR)/testfiles
2749da0fa4SScott Kruger
2849da0fa4SScott Kruger.SECONDEXPANSION:		# to expand $$(@D)/.DIR
2949da0fa4SScott Kruger
3049da0fa4SScott KrugerTESTFLAGS :=             # Initialize as simple variable
3149da0fa4SScott Kruger
3249da0fa4SScott Kruger#workarround old cygwin versions
3349da0fa4SScott Krugerifeq ($(PETSC_CYGWIN_BROKEN_PIPE),1)
3449da0fa4SScott Krugerifeq ($(shell basename $(AR)),ar)
3549da0fa4SScott Kruger  V ?=1
3649da0fa4SScott Krugerendif
3749da0fa4SScott Krugerendif
3849da0fa4SScott KrugerV ?= $(if $(findstring s,$(MAKEFLAGS)),0)
3949da0fa4SScott Krugerifeq ($(V),)  # Default
4049da0fa4SScott Kruger  quiet_HELP := "Use \"$(MAKE) V=1\" to see verbose compile lines, \"$(MAKE) V=0\" to suppress.\n"
4149da0fa4SScott Kruger  quiet = @printf $(quiet_HELP)$(eval quiet_HELP:=)"  %10s %s\n" "$1$2" "$@"; $($1)
4249da0fa4SScott Kruger  quiettest = @printf "  %10s %s\n" "TEST" "$(@:$(TESTDIR)/counts/%.counts=%)";
4349da0fa4SScott Krugerelse ifeq ($(V),0)		# Suppress entire command
4449da0fa4SScott Kruger  quiet = @$($1)
4549da0fa4SScott Kruger  quiettest = @
465e361860SScott Kruger  TESTFLAGS += -o err_only
4749da0fa4SScott Krugerelse				# Show the full command line
4849da0fa4SScott Kruger  quiet = $($1)
4949da0fa4SScott Kruger  quiettest =
5049da0fa4SScott Kruger  TESTFLAGS += -v
5149da0fa4SScott Krugerendif
5249da0fa4SScott Kruger
5349da0fa4SScott Krugerifeq ($(FORCE),1)
5449da0fa4SScott Kruger  TESTFLAGS += -f    # force test execution
5549da0fa4SScott Krugerendif
5649da0fa4SScott Krugerifeq ($(VALGRIND),1)
5749da0fa4SScott Kruger  TESTFLAGS += -V    # Add valgrind to the flags
5849da0fa4SScott Krugerendif
5949da0fa4SScott Krugerifeq ($(REPLACE),1)
6049da0fa4SScott Kruger  TESTFLAGS += -m    # Replace results by passing -m to petscdiff
6149da0fa4SScott Krugerendif
625e361860SScott Krugerifeq ($(OUTPUT),1)
635e361860SScott Kruger  TESTFLAGS += -o 'err_only'    # Show only the errors on stdout
645e361860SScott Krugerendif
65f50802fbSScott Krugerifeq ($(ALT),1)
66f50802fbSScott Kruger  TESTFLAGS += -M    # Replace alt files by passing -M to petscdiff
67f50802fbSScott Krugerendif
68e6bdf5b1SSatish BalayPRINTONLY ?= 0
69a6f3f80dSScott Krugerifeq ($(PRINTONLY),1)
70a6f3f80dSScott Kruger  TESTFLAGS += -p    # Pass -p to petscdiff to print only command
71a6f3f80dSScott Krugerendif
7249da0fa4SScott Krugerifeq ($(DIFF_NUMBERS),1)
7349da0fa4SScott Kruger  TESTFLAGS += -j    # Pass -j to petscdiff to diff the actual numbers
7449da0fa4SScott Krugerendif
7549da0fa4SScott Krugerifdef OPTIONS
7649da0fa4SScott Kruger  TESTFLAGS += -a '$(OPTIONS)'   # override arguments
7749da0fa4SScott Krugerendif
7849da0fa4SScott Krugerifdef EXTRA_OPTIONS
7949da0fa4SScott Kruger  TESTFLAGS += -e '$(EXTRA_OPTIONS)'  # add extra arguments
8049da0fa4SScott Krugerendif
8149da0fa4SScott Krugerifdef NP
8249da0fa4SScott Kruger  TESTFLAGS += -n $(NP)  # set number of processes
8349da0fa4SScott Krugerendif
8449da0fa4SScott Kruger# Override the default timeout that may be found at the top of config/petsc_harness.sh
8549da0fa4SScott Kruger# This must be an integer.  It is given in seconds.
8649da0fa4SScott Krugerifdef TIMEOUT
8749da0fa4SScott Kruger  TESTFLAGS += -t $(TIMEOUT)  # Override the default timeout
8849da0fa4SScott Krugerendif
8949da0fa4SScott Kruger
90fc46264cSScott Kruger$(generatedtest) : $(petscconf) $(petscvariables) $(CONFIGDIR)/gmakegentest.py $(TESTDIR)/.DIR | $$(@D)/.DIR
918e69c5ecSJed Brown	$(PYTHON) $(CONFIGDIR)/gmakegentest.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --testdir=$(TESTDIR)
9249da0fa4SScott Kruger
93fca490e6SSatish Balayifneq ($(filter-out clean check,$(MAKECMDGOALS:clean%=clean)),)
94336d78f1SSatish Balayinclude $(generatedtest)
95535b694aSJed Brownendif
9649da0fa4SScott Kruger
9749da0fa4SScott Krugerifeq ($(PETSC_LANGUAGE),CXXONLY)
9849da0fa4SScott Kruger  cc_name := CXX
9949da0fa4SScott Krugerelse
10049da0fa4SScott Kruger  cc_name := CC
10149da0fa4SScott Krugerendif
10249da0fa4SScott Kruger
1030b119762SSatish BalayPETSC_COMPILE.c = $(call quiet,$(cc_name)) -c $(PCC_FLAGS) $(PFLAGS) $(CCPPFLAGS) $(C_DEPFLAGS)
1040b119762SSatish BalayPETSC_COMPILE.cxx = $(call quiet,CXX) -c $(CXX_FLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(CXX_DEPFLAGS)
105c0558f20SBarry Smithifneq ($(KOKKOS_BIN),)
106c0558f20SBarry Smith# Kokkos requires nvcc to be in PATH and the C++ compiler to be given in an environmental variable
107c0558f20SBarry SmithPETSC_COMPILE.kokkos.cxx = PATH=$(PATH):`dirname $(CUDAC)` NVCC_WRAPPER_DEFAULT_COMPILER=$(CXX_LINKER) $(KOKKOS_BIN)/nvcc_wrapper --expt-extended-lambda -c $(CXX_FLAGS) $(CXXFLAGS) $(CXXCPPFLAGS)
108c0558f20SBarry SmithPETSC_LINK.kokkos.cxx = PATH=$(PATH):`dirname $(CUDAC)` NVCC_WRAPPER_DEFAULT_COMPILER=$(CXX_LINKER) $(KOKKOS_BIN)/nvcc_wrapper --expt-extended-lambda  $(CXX_LINKER_FLAGS) $(PETSC_CCPPFLAGS) $(CPPFLAGS) $(LDFLAGS)
109c0558f20SBarry Smithelse
110c0558f20SBarry SmithPETSC_COMPILE.kokkos.cxx = $(call quiet,CXX) -c $(CXX_FLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(CXX_DEPFLAGS)
111c0558f20SBarry SmithPETSC_LINK.kokkos.cxx = $(CXXLINKER) $(CXX_LINKER_FLAGS) $(CXXFLAGS) $(PETSC_CCPPFLAGS) $(CPPFLAGS) $(LDFLAGS)
112c0558f20SBarry Smithendif
11382707f21SStefano ZampiniPETSC_COMPILE.cu = $(call quiet,CUDAC) -c $(CUDAC_FLAGS) $(CUFLAGS) --compiler-options="$(PCC_FLAGS) $(CXXFLAGS) $(CCPPFLAGS)"
11428f796eaSScott KrugerPETSC_COMPILE.hip.cpp = $(call quiet,HIPCC) -c $(HIPCC_FLAGS) $(HIPCCFLAGS) $(HIPCCPPFLAGS) $(HIPCC_DEPFLAGS)
11528f796eaSScott KrugerPETSC_COMPILE.sycl.cpp = $(call quiet,SYCLCPP) -c $(SYCLCPP_FLAGS) $(SYCLCPPFLAGS) $(SYCLCPPCPPFLAGS) $(SYCLCPP_DEPFLAGS)
11682707f21SStefano ZampiniPETSC_GENDEPS.cu = $(call quiet,CUDAC,.dep) --generate-dependencies --output-directory=$(@D) $(CUDAC_FLAGS) $(CUFLAGS) --compiler-options="$(PCC_FLAGS) $(CXXFLAGS) $(CCPPFLAGS)"
11749da0fa4SScott KrugerPETSC_COMPILE.F = $(call quiet,FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS)
11849da0fa4SScott Kruger
119c0558f20SBarry Smithtestlangs := c cu cxx F F90 kokkos.cxx hip.cpp sycl.cpp
120513d7a9cSJed Brown$(foreach lang, $(testlangs), $(eval \
121513d7a9cSJed Brown  testexe.$(lang) = $(foreach pkg, $(pkgs), $(testsrcs-$(pkg).$(lang):%.$(lang)=$(TESTDIR)/%))))
12249da0fa4SScott Krugerconcattestlang = $(foreach lang, $(2), $(testsrcs-$(1).$(lang):%.$(lang)=$(TESTDIR)/%.o))
12349da0fa4SScott Krugertestsrcs.o := $(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),$(testlangs)))
124fc46264cSScott Krugertestsrcs-rel := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), $(testsrcs-$(pkg).$(lang))))
125fc46264cSScott Krugertestsrcs := $(foreach sfile, $(testsrcs-rel), $(TESTSRCDIR)/$(sfile))
12649da0fa4SScott Kruger
12706fe1a63SSatish Balay# workaround win32fe failure
12806fe1a63SSatish Balayifneq (,$(findstring win32fe,$(call quiet,$(cc_name))))
12906fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex6: | $(TESTDIR)/ts/tutorials/multirate/ex5
13006fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex8: | $(TESTDIR)/ts/tutorials/multirate/ex6
13106fe1a63SSatish Balayendif
13206fe1a63SSatish Balay
13349da0fa4SScott Kruger# Refresh testfiles when sources change, but don't balk if the source file is nonexistent (deleted)
13449da0fa4SScott Kruger$(generatedtest) : $(testsrcs)
13549da0fa4SScott Kruger$(testsrcs) :
13649da0fa4SScott Kruger
1374ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.c | $$(@D)/.DIR
13849da0fa4SScott Kruger	$(PETSC_COMPILE.c) $(abspath $<) -o $@
13949da0fa4SScott Kruger
140c0558f20SBarry Smith$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.kokkos.cxx | $$(@D)/.DIR
141c0558f20SBarry Smith	$(PETSC_COMPILE.kokkos.cxx) $(abspath $<) -o $@
142c0558f20SBarry Smith
1434ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cxx | $$(@D)/.DIR
14449da0fa4SScott Kruger	$(PETSC_COMPILE.cxx) $(abspath $<) -o $@
14549da0fa4SScott Kruger
1464ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cu | $$(@D)/.DIR
14749da0fa4SScott Kruger	$(PETSC_COMPILE.cu) $(abspath $<) -o $@ # Compile first so that if there is an error, it comes from a normal compile
14849da0fa4SScott Kruger	@$(PETSC_GENDEPS.cu) $(abspath $<) -o $(@:%.o=%.d) # Generate the dependencies for later
14949da0fa4SScott Kruger
150a55d2495SJed Brown# Test modules go in the same directory as the target *.o
151a55d2495SJed BrownTESTMODDIR = $(@D)
15249da0fa4SScott KrugerFCMOD = cd
1534ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F | $$(@D)/.DIR
15449da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),)
155a55d2495SJed Brown	$(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@)
15649da0fa4SScott Krugerelse
157a55d2495SJed Brown	$(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR)
15849da0fa4SScott Krugerendif
1590266c241SJed Brown	-@$(GFORTRAN_DEP_CLEANUP)
16049da0fa4SScott Kruger
1614ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F90 | $$(@D)/.DIR
16249da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),)
163a55d2495SJed Brown	$(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@)
16449da0fa4SScott Krugerelse
165a55d2495SJed Brown	$(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR)
16649da0fa4SScott Krugerendif
1670266c241SJed Brown	-@$(GFORTRAN_DEP_CLEANUP)
1680266c241SJed Brown
169cf7d3547SScott Kruger#   This is a hack to fix a broken gfortran.
1700266c241SJed Browndefine GFORTRAN_DEP_CLEANUP
1710266c241SJed Brown  if test -e "$(@:%.o=%.d)" && head -1 "$(@:%.o=%.d)" | fgrep -q -v : ; then\
1724f45eea9SScott Kruger    echo "$(@): \\" > $(@:%.o=%.dtemp) ; \
1730266c241SJed Brown    tr '\n' '@' < $(@:%.o=%.d) | cut -d: -f2- | tr '@' '\n' >> $(@:%.o=%.dtemp) ; \
1740266c241SJed Brown    mv $(@:%.o=%.dtemp) $(@:%.o=%.d); \
1754f45eea9SScott Kruger  fi
1760266c241SJed Brownendef
17749da0fa4SScott Kruger
17820844ca6SSatish Balay# link line constructed differently for gmakefile vs gmakefile.test invocation
17920844ca6SSatish Balayifeq ($(libpetscall),)
18020844ca6SSatish BalayPETSC_TEST_LIB = $(PETSC_LIB)
18120844ca6SSatish Balayelse
18220844ca6SSatish BalayPETSC_TEST_LIB = $(C_SH_LIB_PATH) $(PETSC_EXTERNAL_LIB_BASIC)
18320844ca6SSatish Balayendif
18420844ca6SSatish Balay
185bde159b7SSatish Balay# manually list some some library dependencies to check for circular dependencies
186c4762a1bSJed Brown$(TESTDIR)/sys/tests/ex9: PETSC_TEST_LIB = $(PETSC_SYS_LIB)
187c4762a1bSJed Brown$(TESTDIR)/vec/vec/tests/ex1: PETSC_TEST_LIB = $(PETSC_VEC_LIB)
188c4762a1bSJed Brown$(TESTDIR)/mat/tests/ex1: PETSC_TEST_LIB = $(PETSC_MAT_LIB)
189c4762a1bSJed Brown$(TESTDIR)/dm/tests/ex1: PETSC_TEST_LIB = $(PETSC_DM_LIB)
190c4762a1bSJed Brown$(TESTDIR)/ksp/ksp/tests/ex1: PETSC_TEST_LIB = $(PETSC_KSP_LIB)
191c4762a1bSJed Brown$(TESTDIR)/snes/tests/ex1: PETSC_TEST_LIB = $(PETSC_SNES_LIB)
192c4762a1bSJed Brown$(TESTDIR)/ts/tests/ex2: PETSC_TEST_LIB = $(PETSC_TS_LIB)
193c4762a1bSJed Brown$(TESTDIR)/tao/tutorials/ex1: PETSC_TEST_LIB = $(PETSC_TAO_LIB)
194bde159b7SSatish Balay
195*1dcdb15bSVaclav Hapla# if configured --with-macos-firewall-rules, ensure mpiexec.hydra and test executable is on firewall list
196*1dcdb15bSVaclav Haplaifdef MACOS_FIREWALL_MPIEXEC
197*1dcdb15bSVaclav Hapladefine macos-firewall-register
198*1dcdb15bSVaclav Hapla  @APP=$(call abspath, $(1)); \
199*1dcdb15bSVaclav Hapla    FW=/usr/libexec/ApplicationFirewall/socketfilterfw; \
200*1dcdb15bSVaclav Hapla    ANS=`$$FW --getappblocked $$APP`; \
201*1dcdb15bSVaclav Hapla    if ! echo $$ANS | grep "$$APP" &> /dev/null; then \
202*1dcdb15bSVaclav Hapla      if ! sudo -n true 2>/dev/null; then echo "Asking for sudo password to add new firewall rule for\n  $$APP:"; fi; \
203*1dcdb15bSVaclav Hapla      sudo $$FW --add $$APP && \
204*1dcdb15bSVaclav Hapla      sudo $$FW --block $$APP; \
205*1dcdb15bSVaclav Hapla    else \
206*1dcdb15bSVaclav Hapla      echo $$ANS; \
207*1dcdb15bSVaclav Hapla    fi
208*1dcdb15bSVaclav Haplaendef
209*1dcdb15bSVaclav Hapladefine macos-firewall-fix
210*1dcdb15bSVaclav Hapla  $(call macos-firewall-register, $(MACOS_FIREWALL_MPIEXEC))
211*1dcdb15bSVaclav Hapla  $(call macos-firewall-register, $(1))
212*1dcdb15bSVaclav Haplaendef
213*1dcdb15bSVaclav Haplaendif
214*1dcdb15bSVaclav Hapla
21549da0fa4SScott Kruger# Test executables
216513d7a9cSJed Brown$(testexe.F) $(testexe.F90) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
21720844ca6SSatish Balay	$(call quiet,FLINKER) -o $@ $^ $(PETSC_TEST_LIB)
218*1dcdb15bSVaclav Hapla	-$(call macos-firewall-fix,$@)
21949da0fa4SScott Kruger
220513d7a9cSJed Brown$(testexe.c) $(testexe.cu) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
22120844ca6SSatish Balay	$(call quiet,CLINKER) -o $@ $^ $(PETSC_TEST_LIB)
222*1dcdb15bSVaclav Hapla	-$(call macos-firewall-fix,$@)
22349da0fa4SScott Kruger
224c0558f20SBarry Smith$(testexe.kokkos.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
225c0558f20SBarry Smith	$(call quiet,PETSC_LINK.kokkos.cxx) -o $@ $^ $(PETSC_TEST_LIB)
226*1dcdb15bSVaclav Hapla	-$(call macos-firewall-fix,$@)
227c0558f20SBarry Smith
228513d7a9cSJed Brown$(testexe.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
2292f4326f3SSatish Balay	$(call quiet,CXXLINKER) -o $@ $^ $(PETSC_TEST_LIB)
230*1dcdb15bSVaclav Hapla	-$(call macos-firewall-fix,$@)
231513d7a9cSJed Brown
23249da0fa4SScott Kruger# Fortran source files need petsc*.mod, which isn't explicitly managed in the makefile.
23349da0fa4SScott Kruger$(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),F F90)) : $(libpetscall)
23449da0fa4SScott Kruger
23549da0fa4SScott Kruger# Testing convenience targets
236c173c275SScott Kruger.PHONY: test pre-clean
237c173c275SScott Kruger
238ff7b3809SScott Krugertest: report_tests
239c173c275SScott Kruger
24049da0fa4SScott Krugerpre-clean:
2415e361860SScott Kruger	@$(RM) -rf $(TESTDIR)/counts $(TESTLOGTAPFILE) $(TESTLOGERRFILE)
2425e361860SScott Kruger	@touch $(TESTLOGTAPFILE) $(TESTLOGERRFILE)
24327d73d1fSBarry Smith	@echo "Using MAKEFLAGS:" ${MAKEFLAGS}
24449da0fa4SScott Kruger
2454d9d3ee5SSatish Balaycheck-test-errors:
2465e361860SScott Kruger	@grep '^not ok' $(TESTLOGTAPFILE) | grep -v 'Exceeded timeout' | tee $(TESTDIR)/allgtests-tap-err.log
2474d9d3ee5SSatish Balay	@test ! -s $(TESTDIR)/allgtests-tap-err.log
2484d9d3ee5SSatish Balay
24949da0fa4SScott Kruger.PHONY: $(foreach pkg, $(pkgs), test-$(pkg) $(foreach lang, $(testlangs), test-$(pkg).$(lang) test-rm-$(pkg).$(lang)))
25049da0fa4SScott Krugertestpkgs := $(foreach pkg, $(pkgs), test-$(pkg))
25149da0fa4SScott Kruger# Targets to run tests in test-$pkg.$lang and delete the executables, language by language
25249da0fa4SScott Kruger$(testpkgs) : test-% : $(foreach lang, $(testlangs), test-rm-%.$(lang))
25349da0fa4SScott Kruger# List of raw test run targets
25449da0fa4SScott Krugeralltesttargets := $(foreach tp, $(testpkgs), $(foreach lang, $(testlangs), $($(tp).$(lang))))
25549da0fa4SScott Kruger
25649da0fa4SScott Kruger# Run targets
25749da0fa4SScott Kruger$(alltesttargets) : % : $(TESTDIR)/counts/%.counts
25849da0fa4SScott Kruger.PHONY: $(alltesttargets)
25949da0fa4SScott Kruger
26049da0fa4SScott Kruger$(TESTDIR)/counts/%.counts :
26149da0fa4SScott Kruger	$(quiettest) $< $(TESTFLAGS)
26249da0fa4SScott Kruger
26349da0fa4SScott Kruger# Targets to run tests and remove executables, by package-lang pairs.
26449da0fa4SScott Kruger# Run the tests in each batch using recursive invocation of make because
26549da0fa4SScott Kruger# we need all of them to complete before removing the executables.  Make
26649da0fa4SScott Kruger# doesn't guarantee an exploration order for the graph.  Only recursive
26749da0fa4SScott Kruger# if there is something to be done.
26849da0fa4SScott Krugeralltest-rm := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), test-rm-$(pkg).$(lang)))
26949da0fa4SScott Kruger$(alltest-rm) : test-rm-% : test-%
27049da0fa4SScott Krugerifneq ($(NO_RM),1)
27149da0fa4SScott Kruger	$(call quiet,RM) $(addprefix $(TESTDIR)/,$(basename $($(@:test-rm-%=testsrcs-%))))
27249da0fa4SScott Krugerendif
27349da0fa4SScott Kruger
27449da0fa4SScott Kruger# Remove intermediate .o files
27549da0fa4SScott Kruger# This only removes the files at the end which is insufficient
27649da0fa4SScott Kruger#.INTERMEDIATE: $(testsrcs.o:%.o=%)
27749da0fa4SScott Kruger
27849da0fa4SScott Kruger# all sources should get recompiled when petscvariables changes (i.e when configure is rerun or when petscvariables is manually edited.)
27949da0fa4SScott Kruger$(testsrcs.o) : $(petscvariables)
28049da0fa4SScott Kruger
28149da0fa4SScott Kruger%/.DIR :
28249da0fa4SScott Kruger	@mkdir -p $(@D)
28349da0fa4SScott Kruger	@touch $@
28449da0fa4SScott Kruger
28549da0fa4SScott Kruger.PRECIOUS: %/.DIR
28649da0fa4SScott Kruger
28749da0fa4SScott Kruger.SUFFIXES: # Clear .SUFFIXES because we don't use implicit rules
28849da0fa4SScott Kruger.DELETE_ON_ERROR:               # Delete likely-corrupt target file if rule fails
28949da0fa4SScott Kruger
29037ed16bcSStefano Zampini.PHONY: clean cleantest all
29149da0fa4SScott Kruger
29249da0fa4SScott Krugercleantest:
29349da0fa4SScott Kruger	${RM} -r $(TESTDIR) $(generatedtest)
29449da0fa4SScott Kruger
29549da0fa4SScott Krugerclean: cleantest
29649da0fa4SScott Kruger
29749da0fa4SScott Krugeralltest.d := $(testsrcs.o:%.o=%.d)
29849da0fa4SScott Kruger# Tell make that alltest.d are all up to date.  Without this, the include
29949da0fa4SScott Kruger# below has quadratic complexity, taking more than one second for a
30049da0fa4SScott Kruger# do-nothing build of PETSc (much worse for larger projects)
30149da0fa4SScott Kruger$(alltest.d) : ;
30249da0fa4SScott Kruger
30349da0fa4SScott Kruger-include $(alltest.d)
30449da0fa4SScott Kruger
30549da0fa4SScott Kruger# Tests can be generated by searching
30649da0fa4SScott Kruger# Percent is a wildcard (only one allowed):
30749da0fa4SScott Kruger#    make -f gmakefile test search=sys%ex2
30849da0fa4SScott Kruger# To match internal substrings (matches *ex2*):
30949da0fa4SScott Kruger#    make -f gmakefile test searchin=ex2
31049da0fa4SScott Kruger# Search and searchin can be combined:
31149da0fa4SScott Kruger#    make -f gmakefile test search='sys%' searchin=ex2
31249da0fa4SScott Kruger# For args:
31349da0fa4SScott Kruger#    make -f gmakefile test argsearch=cuda
31449da0fa4SScott Kruger# For general glob-style searching using python:
31549da0fa4SScott Kruger# NOTE: uses shell which is possibly slower and is possibly more brittle
31649da0fa4SScott Kruger#    make -f gmakefile test globsearch='sys*ex2*'
31749da0fa4SScott Krugerifdef search
31849da0fa4SScott Kruger  TESTTARGETS := $(filter $(search),$(alltesttargets))
31949da0fa4SScott Kruger  ifdef searchin
32049da0fa4SScott Kruger    TESTTARGETS2 := $(foreach v,$(TESTTARGETS),$(if $(findstring $(searchin),$(v)),$(v)))
32149da0fa4SScott Kruger    TESTTARGETS := $(TESTTARGETS2)
32249da0fa4SScott Kruger  endif
32349da0fa4SScott Krugerelse ifdef searchin
32449da0fa4SScott Kruger  TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(searchin),$(v)),$(v)))
32549da0fa4SScott Krugerelse ifdef argsearch
32649da0fa4SScott Kruger  TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(argsearch),$($(v)_ARGS)),$(v)))
32749da0fa4SScott Krugerelse ifdef globsearch
328aec279ffSScott Kruger  TESTTARGETS := $(shell $(PYTHON) config/query_tests.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) 'name' '$(globsearch)')
329feeaa4f6SScott Krugerelse ifdef test-fail
330feeaa4f6SScott Kruger  TESTTARGETS := $(shell $(PETSC_ARCH)/tests/echofailures.sh)
3316f5e9bd5SScott Krugerelse ifdef query
332aec279ffSScott Kruger  TESTTARGETS := $(shell $(PYTHON) config/query_tests.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) '$(query)' '$(queryval)')
33349da0fa4SScott Krugerelse                            # No filter - run them all, but delete the executables as we go
33449da0fa4SScott Kruger  TESTTARGETS := $(testpkgs)
33549da0fa4SScott Krugerendif
33649da0fa4SScott Kruger
33749da0fa4SScott Kruger.PHONY: report_tests print-test
33849da0fa4SScott Kruger
33949da0fa4SScott Krugerprint-test:
3405b6dee57SScott Kruger	$(info $(TESTTARGETS))
3415b6dee57SScott Kruger	@true
34249da0fa4SScott Kruger
3436e5deea7SScott Krugershow-fail:
344b711b6a4SScott Kruger	-@$(PYTHON) $(CONFIGDIR)/report_tests.py -d $(TESTDIR)/counts -f
345b711b6a4SScott Kruger
3466e5deea7SScott Kruger
3476e5deea7SScott Kruger
348c01c7e64SJed Brown# Don't start running tests until starttime has completed
349c01c7e64SJed Brown$(alltesttargets:%=$(TESTDIR)/counts/%.counts) : starttime
350c01c7e64SJed Brown
351c01c7e64SJed Brown# Ensure that libpetsc (if it is a prerequisite) has been built and clean the counts/logs before starting timer
352c01c7e64SJed Brownstarttime: pre-clean $(libpetscall)
35327d73d1fSBarry Smith	@$(eval STARTTIME := $(shell date +%s))
35427d73d1fSBarry Smith
35527d73d1fSBarry Smithreport_tests: starttime $(TESTTARGETS)
35632f4009dSScott Kruger	@$(eval ENDTIME := $(shell date +%s))
357a6f3f80dSScott Kruger	-@if test ${PRINTONLY} -ne 1; then  elapsed_time=$$(($(ENDTIME)- $(STARTTIME))) && \
358a6f3f80dSScott Kruger	$(PYTHON) $(CONFIGDIR)/report_tests.py -m $(MAKE) -d $(TESTDIR)/counts -t 5 -e $${elapsed_time};\
359a6f3f80dSScott Kruger    fi
36049da0fa4SScott Kruger
3615e361860SScott Krugercheck_output:
3625e361860SScott Kruger	$(PYTHON) $(CONFIGDIR)/gmakegentest.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --testdir=$(TESTDIR) --check-output
3635e361860SScott Kruger
36449da0fa4SScott Kruger# Do not how how to invoke test from makefile
36549da0fa4SScott KrugerHASGMAKEFILE := $(filter gmakefile,$(MAKEFILE_LIST))
36649da0fa4SScott Krugerifeq ($(HASGMAKEFILE),gmakefile)
36749da0fa4SScott Krugerhelpdeps:=help-make help-targets
36849da0fa4SScott Krugermakefile="gmakefile"
369142b82d2SScott Krugerother_help="To see full test help: make -f gmakefile.test help"
37049da0fa4SScott Krugerelse
37149da0fa4SScott Krugerhelpdeps:=help-make help-targets help-test
37249da0fa4SScott Krugermakefile="gmakefile.test"
373142b82d2SScott Krugerother_help=""
37449da0fa4SScott Krugerendif
37549da0fa4SScott Kruger
37649da0fa4SScott Krugerhelp: ${helpdeps}
37749da0fa4SScott Kruger	-@echo "Above is from: ${helpdeps}"
378142b82d2SScott Kruger	-@echo "${other_help}"
37949da0fa4SScott Kruger
38049da0fa4SScott Krugerhelp-make:
38149da0fa4SScott Kruger	-@echo
38249da0fa4SScott Kruger	-@echo "Basic build usage:"
38349da0fa4SScott Kruger	-@echo "   make -f ${makefile} <options>"
38449da0fa4SScott Kruger	-@echo
38549da0fa4SScott Kruger	-@echo "Options:"
38649da0fa4SScott Kruger	-@echo "  V=0           Very quiet builds"
38749da0fa4SScott Kruger	-@echo "  V=1           Verbose builds"
38849da0fa4SScott Kruger	-@echo
38949da0fa4SScott Kruger
39049da0fa4SScott Krugerhelp-targets:
39149da0fa4SScott Kruger	-@echo "All makefile targets and their dependencies:"
39249da0fa4SScott Kruger	-@grep ^[a-z] ${makefile} | grep : | grep -v =
39349da0fa4SScott Kruger	-@echo
39449da0fa4SScott Kruger	-@echo
39549da0fa4SScott Kruger
39649da0fa4SScott Krugerhelp-test:
39749da0fa4SScott Kruger	-@echo "Basic test usage:"
39849da0fa4SScott Kruger	-@echo "   make -f ${makefile} test <options>"
39949da0fa4SScott Kruger	-@echo
40049da0fa4SScott Kruger	-@echo "Options:"
40149da0fa4SScott Kruger	-@echo "  NO_RM=1           Do not remove the executables after running"
402f50802fbSScott Kruger	-@echo "  REPLACE=1         Replace the output in PETSC_DIR source tree (-m to test scripts)"
4035e361860SScott Kruger	-@echo "  OUTPUT=1          Show only the errors on stdout"
404f50802fbSScott Kruger	-@echo "  ALT=1             Replace 'alt' output in PETSC_DIR source tree (-M to test scripts)"
40549da0fa4SScott Kruger	-@echo "  DIFF_NUMBERS=1    Diff the numbers in the output (-j to test scripts and petscdiff)"
40649da0fa4SScott Kruger	-@echo "  VALGRIND=1        Execute the tests using valgrind (-V to test scripts)"
407142b82d2SScott Kruger	-@echo "  NP=<num proc>     Set a number of processors to pass to scripts."
408142b82d2SScott Kruger	-@echo "  FORCE=1           Force SKIP or TODO tests to run"
409a6f3f80dSScott Kruger	-@echo "  PRINTONLY=1       Print the command, but do not run.  For loops print first command"
410142b82d2SScott Kruger	-@echo "  TIMEOUT=<time>    Test timeout limit in seconds (default in config/petsc_harness.sh)"
411f50802fbSScott Kruger	-@echo "  TESTDIR='tests'   Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}"
41249da0fa4SScott Kruger	-@echo "                    or $${PREFIX_DIR}/$${TESTDIR}"
41349da0fa4SScott Kruger	-@echo "                    or $${PREFIX_DIR}/share/petsc/examples/$${TESTDIR})"
4144ff3c6a1SScott Kruger	-@echo "  TESTBASE='tests'   Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}"
41549da0fa4SScott Kruger	-@echo "  OPTIONS='<args>'  Override options to scripts (-a to test scripts)"
41649da0fa4SScott Kruger	-@echo "  EXTRA_OPTIONS='<args>'  Add options to scripts (-e to test scripts)"
41749da0fa4SScott Kruger	-@echo
41849da0fa4SScott Kruger	-@echo "Tests can be generated by searching:"
41949da0fa4SScott Kruger	-@echo "  Percent is a wildcard (only one allowed):"
42049da0fa4SScott Kruger	-@echo "    make -f ${makefile} test search=sys%ex2"
42149da0fa4SScott Kruger	-@echo
42249da0fa4SScott Kruger	-@echo "  To match internal substrings (matches *ex2*):"
42349da0fa4SScott Kruger	-@echo "    make -f ${makefile} test searchin=ex2"
42449da0fa4SScott Kruger	-@echo
42549da0fa4SScott Kruger	-@echo "  Search and searchin can be combined:"
42649da0fa4SScott Kruger	-@echo "    make -f ${makefile} test search='sys%' searchin=ex2"
42749da0fa4SScott Kruger	-@echo
42849da0fa4SScott Kruger	-@echo "  To match patterns in the arguments:"
42949da0fa4SScott Kruger	-@echo "    make -f ${makefile} test argsearch=cuda"
43049da0fa4SScott Kruger	-@echo
43149da0fa4SScott Kruger	-@echo "  For general glob-style searching using python:"
43249da0fa4SScott Kruger	-@echo "   NOTE: uses shell which is possibly slower and more brittle"
43349da0fa4SScott Kruger	-@echo "    make -f ${makefile} test globsearch='sys*ex2*'"
43449da0fa4SScott Kruger	-@echo
435feeaa4f6SScott Kruger	-@echo "  To re-run the last tests which failed:"
436feeaa4f6SScott Kruger	-@echo "    make -f ${makefile} test test-fail='1'"
437feeaa4f6SScott Kruger	-@echo
4386f5e9bd5SScott Kruger	-@echo "  To search for fields from the original test definitions:"
4396f5e9bd5SScott Kruger	-@echo "    make -f ${makefile} test query='requires' queryval='*MPI_PROCESS_SHARED_MEMORY*'"
4406f5e9bd5SScott Kruger	-@echo
44149da0fa4SScott Kruger	-@echo "  To see which targets match a given pattern (useful for doing a specific target):"
44249da0fa4SScott Kruger	-@echo "    make -f ${makefile} print-test search=sys%"
44349da0fa4SScott Kruger	-@echo "  which is equivalent to:"
44449da0fa4SScott Kruger	-@echo "    make -f ${makefile} print VAR=TESTTARGETS search='sys%'"
44549da0fa4SScott Kruger	-@echo
44649da0fa4SScott Kruger	-@echo "  To build an executable, give full path to location:"
447c4762a1bSJed Brown	-@echo '    make -f ${makefile} $${PETSC_ARCH}/tests/sys/tests/ex1'
44849da0fa4SScott Kruger	-@echo "  or make the test with NO_RM=1"
44949da0fa4SScott Kruger	-@echo
450