xref: /petsc/gmakefile.test (revision baa5c0f46e095eb0c642a4339de9b41f2cdd5ea4)
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
56*baa5c0f4SScott Krugerifeq ($(CUDAMEMCHECK),1)
57*baa5c0f4SScott Kruger  TESTFLAGS += -U    # Add cuda-memcheck option to the flags
58*baa5c0f4SScott Krugerendif
5949da0fa4SScott Krugerifeq ($(VALGRIND),1)
60*baa5c0f4SScott Kruger  TESTFLAGS += -V    # Add valgrind option to the flags
6149da0fa4SScott Krugerendif
6249da0fa4SScott Krugerifeq ($(REPLACE),1)
6349da0fa4SScott Kruger  TESTFLAGS += -m    # Replace results by passing -m to petscdiff
6449da0fa4SScott Krugerendif
655e361860SScott Krugerifeq ($(OUTPUT),1)
665e361860SScott Kruger  TESTFLAGS += -o 'err_only'    # Show only the errors on stdout
675e361860SScott Krugerendif
68f50802fbSScott Krugerifeq ($(ALT),1)
69f50802fbSScott Kruger  TESTFLAGS += -M    # Replace alt files by passing -M to petscdiff
70f50802fbSScott Krugerendif
71e6bdf5b1SSatish BalayPRINTONLY ?= 0
72a6f3f80dSScott Krugerifeq ($(PRINTONLY),1)
73a6f3f80dSScott Kruger  TESTFLAGS += -p    # Pass -p to petscdiff to print only command
74a6f3f80dSScott Krugerendif
7549da0fa4SScott Krugerifeq ($(DIFF_NUMBERS),1)
7649da0fa4SScott Kruger  TESTFLAGS += -j    # Pass -j to petscdiff to diff the actual numbers
7749da0fa4SScott Krugerendif
7849da0fa4SScott Krugerifdef OPTIONS
7949da0fa4SScott Kruger  TESTFLAGS += -a '$(OPTIONS)'   # override arguments
8049da0fa4SScott Krugerendif
8149da0fa4SScott Krugerifdef EXTRA_OPTIONS
8249da0fa4SScott Kruger  TESTFLAGS += -e '$(EXTRA_OPTIONS)'  # add extra arguments
8349da0fa4SScott Krugerendif
8449da0fa4SScott Krugerifdef NP
8549da0fa4SScott Kruger  TESTFLAGS += -n $(NP)  # set number of processes
8649da0fa4SScott Krugerendif
8749da0fa4SScott Kruger# Override the default timeout that may be found at the top of config/petsc_harness.sh
8849da0fa4SScott Kruger# This must be an integer.  It is given in seconds.
8949da0fa4SScott Krugerifdef TIMEOUT
9049da0fa4SScott Kruger  TESTFLAGS += -t $(TIMEOUT)  # Override the default timeout
9149da0fa4SScott Krugerendif
9249da0fa4SScott Kruger
93fc46264cSScott Kruger$(generatedtest) : $(petscconf) $(petscvariables) $(CONFIGDIR)/gmakegentest.py $(TESTDIR)/.DIR | $$(@D)/.DIR
948e69c5ecSJed Brown	$(PYTHON) $(CONFIGDIR)/gmakegentest.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --testdir=$(TESTDIR)
9549da0fa4SScott Kruger
96fca490e6SSatish Balayifneq ($(filter-out clean check,$(MAKECMDGOALS:clean%=clean)),)
97336d78f1SSatish Balayinclude $(generatedtest)
98535b694aSJed Brownendif
9949da0fa4SScott Kruger
10049da0fa4SScott Krugerifeq ($(PETSC_LANGUAGE),CXXONLY)
10149da0fa4SScott Kruger  cc_name := CXX
10249da0fa4SScott Krugerelse
10349da0fa4SScott Kruger  cc_name := CC
10449da0fa4SScott Krugerendif
10549da0fa4SScott Kruger
1060b119762SSatish BalayPETSC_COMPILE.c = $(call quiet,$(cc_name)) -c $(PCC_FLAGS) $(PFLAGS) $(CCPPFLAGS) $(C_DEPFLAGS)
1070b119762SSatish BalayPETSC_COMPILE.cxx = $(call quiet,CXX) -c $(CXX_FLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(CXX_DEPFLAGS)
108c0558f20SBarry Smithifneq ($(KOKKOS_BIN),)
109c0558f20SBarry Smith# Kokkos requires nvcc to be in PATH and the C++ compiler to be given in an environmental variable
110c0558f20SBarry 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)
111c0558f20SBarry 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)
112c0558f20SBarry Smithelse
113c0558f20SBarry SmithPETSC_COMPILE.kokkos.cxx = $(call quiet,CXX) -c $(CXX_FLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(CXX_DEPFLAGS)
114c0558f20SBarry SmithPETSC_LINK.kokkos.cxx = $(CXXLINKER) $(CXX_LINKER_FLAGS) $(CXXFLAGS) $(PETSC_CCPPFLAGS) $(CPPFLAGS) $(LDFLAGS)
115c0558f20SBarry Smithendif
11682707f21SStefano ZampiniPETSC_COMPILE.cu = $(call quiet,CUDAC) -c $(CUDAC_FLAGS) $(CUFLAGS) --compiler-options="$(PCC_FLAGS) $(CXXFLAGS) $(CCPPFLAGS)"
11728f796eaSScott KrugerPETSC_COMPILE.hip.cpp = $(call quiet,HIPCC) -c $(HIPCC_FLAGS) $(HIPCCFLAGS) $(HIPCCPPFLAGS) $(HIPCC_DEPFLAGS)
11828f796eaSScott KrugerPETSC_COMPILE.sycl.cpp = $(call quiet,SYCLCPP) -c $(SYCLCPP_FLAGS) $(SYCLCPPFLAGS) $(SYCLCPPCPPFLAGS) $(SYCLCPP_DEPFLAGS)
11982707f21SStefano ZampiniPETSC_GENDEPS.cu = $(call quiet,CUDAC,.dep) --generate-dependencies --output-directory=$(@D) $(CUDAC_FLAGS) $(CUFLAGS) --compiler-options="$(PCC_FLAGS) $(CXXFLAGS) $(CCPPFLAGS)"
12049da0fa4SScott KrugerPETSC_COMPILE.F = $(call quiet,FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS)
12149da0fa4SScott Kruger
122c0558f20SBarry Smithtestlangs := c cu cxx F F90 kokkos.cxx hip.cpp sycl.cpp
123513d7a9cSJed Brown$(foreach lang, $(testlangs), $(eval \
124513d7a9cSJed Brown  testexe.$(lang) = $(foreach pkg, $(pkgs), $(testsrcs-$(pkg).$(lang):%.$(lang)=$(TESTDIR)/%))))
12549da0fa4SScott Krugerconcattestlang = $(foreach lang, $(2), $(testsrcs-$(1).$(lang):%.$(lang)=$(TESTDIR)/%.o))
12649da0fa4SScott Krugertestsrcs.o := $(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),$(testlangs)))
127fc46264cSScott Krugertestsrcs-rel := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), $(testsrcs-$(pkg).$(lang))))
128fc46264cSScott Krugertestsrcs := $(foreach sfile, $(testsrcs-rel), $(TESTSRCDIR)/$(sfile))
12949da0fa4SScott Kruger
13006fe1a63SSatish Balay# workaround win32fe failure
13106fe1a63SSatish Balayifneq (,$(findstring win32fe,$(call quiet,$(cc_name))))
13206fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex6: | $(TESTDIR)/ts/tutorials/multirate/ex5
13306fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex8: | $(TESTDIR)/ts/tutorials/multirate/ex6
13406fe1a63SSatish Balayendif
13506fe1a63SSatish Balay
13649da0fa4SScott Kruger# Refresh testfiles when sources change, but don't balk if the source file is nonexistent (deleted)
13749da0fa4SScott Kruger$(generatedtest) : $(testsrcs)
13849da0fa4SScott Kruger$(testsrcs) :
13949da0fa4SScott Kruger
1404ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.c | $$(@D)/.DIR
14149da0fa4SScott Kruger	$(PETSC_COMPILE.c) $(abspath $<) -o $@
14249da0fa4SScott Kruger
143c0558f20SBarry Smith$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.kokkos.cxx | $$(@D)/.DIR
144c0558f20SBarry Smith	$(PETSC_COMPILE.kokkos.cxx) $(abspath $<) -o $@
145c0558f20SBarry Smith
1464ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cxx | $$(@D)/.DIR
14749da0fa4SScott Kruger	$(PETSC_COMPILE.cxx) $(abspath $<) -o $@
14849da0fa4SScott Kruger
1494ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cu | $$(@D)/.DIR
15049da0fa4SScott Kruger	$(PETSC_COMPILE.cu) $(abspath $<) -o $@ # Compile first so that if there is an error, it comes from a normal compile
15149da0fa4SScott Kruger	@$(PETSC_GENDEPS.cu) $(abspath $<) -o $(@:%.o=%.d) # Generate the dependencies for later
15249da0fa4SScott Kruger
153a55d2495SJed Brown# Test modules go in the same directory as the target *.o
154a55d2495SJed BrownTESTMODDIR = $(@D)
15549da0fa4SScott KrugerFCMOD = cd
1564ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F | $$(@D)/.DIR
15749da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),)
158a55d2495SJed Brown	$(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@)
15949da0fa4SScott Krugerelse
160a55d2495SJed Brown	$(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR)
16149da0fa4SScott Krugerendif
1620266c241SJed Brown	-@$(GFORTRAN_DEP_CLEANUP)
16349da0fa4SScott Kruger
1644ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F90 | $$(@D)/.DIR
16549da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),)
166a55d2495SJed Brown	$(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@)
16749da0fa4SScott Krugerelse
168a55d2495SJed Brown	$(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR)
16949da0fa4SScott Krugerendif
1700266c241SJed Brown	-@$(GFORTRAN_DEP_CLEANUP)
1710266c241SJed Brown
172cf7d3547SScott Kruger#   This is a hack to fix a broken gfortran.
1730266c241SJed Browndefine GFORTRAN_DEP_CLEANUP
1740266c241SJed Brown  if test -e "$(@:%.o=%.d)" && head -1 "$(@:%.o=%.d)" | fgrep -q -v : ; then\
1754f45eea9SScott Kruger    echo "$(@): \\" > $(@:%.o=%.dtemp) ; \
1760266c241SJed Brown    tr '\n' '@' < $(@:%.o=%.d) | cut -d: -f2- | tr '@' '\n' >> $(@:%.o=%.dtemp) ; \
1770266c241SJed Brown    mv $(@:%.o=%.dtemp) $(@:%.o=%.d); \
1784f45eea9SScott Kruger  fi
1790266c241SJed Brownendef
18049da0fa4SScott Kruger
18120844ca6SSatish Balay# link line constructed differently for gmakefile vs gmakefile.test invocation
18220844ca6SSatish Balayifeq ($(libpetscall),)
18320844ca6SSatish BalayPETSC_TEST_LIB = $(PETSC_LIB)
18420844ca6SSatish Balayelse
18520844ca6SSatish BalayPETSC_TEST_LIB = $(C_SH_LIB_PATH) $(PETSC_EXTERNAL_LIB_BASIC)
18620844ca6SSatish Balayendif
18720844ca6SSatish Balay
188bde159b7SSatish Balay# manually list some some library dependencies to check for circular dependencies
189c4762a1bSJed Brown$(TESTDIR)/sys/tests/ex9: PETSC_TEST_LIB = $(PETSC_SYS_LIB)
190c4762a1bSJed Brown$(TESTDIR)/vec/vec/tests/ex1: PETSC_TEST_LIB = $(PETSC_VEC_LIB)
191c4762a1bSJed Brown$(TESTDIR)/mat/tests/ex1: PETSC_TEST_LIB = $(PETSC_MAT_LIB)
192c4762a1bSJed Brown$(TESTDIR)/dm/tests/ex1: PETSC_TEST_LIB = $(PETSC_DM_LIB)
193c4762a1bSJed Brown$(TESTDIR)/ksp/ksp/tests/ex1: PETSC_TEST_LIB = $(PETSC_KSP_LIB)
194c4762a1bSJed Brown$(TESTDIR)/snes/tests/ex1: PETSC_TEST_LIB = $(PETSC_SNES_LIB)
195c4762a1bSJed Brown$(TESTDIR)/ts/tests/ex2: PETSC_TEST_LIB = $(PETSC_TS_LIB)
196c4762a1bSJed Brown$(TESTDIR)/tao/tutorials/ex1: PETSC_TEST_LIB = $(PETSC_TAO_LIB)
197bde159b7SSatish Balay
1981dcdb15bSVaclav Hapla# if configured --with-macos-firewall-rules, ensure mpiexec.hydra and test executable is on firewall list
1991dcdb15bSVaclav Haplaifdef MACOS_FIREWALL_MPIEXEC
2001dcdb15bSVaclav Hapladefine macos-firewall-register
2011dcdb15bSVaclav Hapla  @APP=$(call abspath, $(1)); \
2021dcdb15bSVaclav Hapla    FW=/usr/libexec/ApplicationFirewall/socketfilterfw; \
2031dcdb15bSVaclav Hapla    ANS=`$$FW --getappblocked $$APP`; \
2041dcdb15bSVaclav Hapla    if ! echo $$ANS | grep "$$APP" &> /dev/null; then \
2051dcdb15bSVaclav Hapla      if ! sudo -n true 2>/dev/null; then echo "Asking for sudo password to add new firewall rule for\n  $$APP:"; fi; \
2061dcdb15bSVaclav Hapla      sudo $$FW --add $$APP && \
2071dcdb15bSVaclav Hapla      sudo $$FW --block $$APP; \
2081dcdb15bSVaclav Hapla    else \
2091dcdb15bSVaclav Hapla      echo $$ANS; \
2101dcdb15bSVaclav Hapla    fi
2111dcdb15bSVaclav Haplaendef
2121dcdb15bSVaclav Hapladefine macos-firewall-fix
2131dcdb15bSVaclav Hapla  $(call macos-firewall-register, $(MACOS_FIREWALL_MPIEXEC))
2141dcdb15bSVaclav Hapla  $(call macos-firewall-register, $(1))
2151dcdb15bSVaclav Haplaendef
2161dcdb15bSVaclav Haplaendif
2171dcdb15bSVaclav Hapla
21849da0fa4SScott Kruger# Test executables
219513d7a9cSJed Brown$(testexe.F) $(testexe.F90) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
22020844ca6SSatish Balay	$(call quiet,FLINKER) -o $@ $^ $(PETSC_TEST_LIB)
2211dcdb15bSVaclav Hapla	-$(call macos-firewall-fix,$@)
22249da0fa4SScott Kruger
223513d7a9cSJed Brown$(testexe.c) $(testexe.cu) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
22420844ca6SSatish Balay	$(call quiet,CLINKER) -o $@ $^ $(PETSC_TEST_LIB)
2251dcdb15bSVaclav Hapla	-$(call macos-firewall-fix,$@)
22649da0fa4SScott Kruger
227c0558f20SBarry Smith$(testexe.kokkos.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
228c0558f20SBarry Smith	$(call quiet,PETSC_LINK.kokkos.cxx) -o $@ $^ $(PETSC_TEST_LIB)
2291dcdb15bSVaclav Hapla	-$(call macos-firewall-fix,$@)
230c0558f20SBarry Smith
231513d7a9cSJed Brown$(testexe.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
2322f4326f3SSatish Balay	$(call quiet,CXXLINKER) -o $@ $^ $(PETSC_TEST_LIB)
2331dcdb15bSVaclav Hapla	-$(call macos-firewall-fix,$@)
234513d7a9cSJed Brown
23549da0fa4SScott Kruger# Fortran source files need petsc*.mod, which isn't explicitly managed in the makefile.
23649da0fa4SScott Kruger$(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),F F90)) : $(libpetscall)
23749da0fa4SScott Kruger
23849da0fa4SScott Kruger# Testing convenience targets
239c173c275SScott Kruger.PHONY: test pre-clean
240c173c275SScott Kruger
241ff7b3809SScott Krugertest: report_tests
242c173c275SScott Kruger
24349da0fa4SScott Krugerpre-clean:
2445e361860SScott Kruger	@$(RM) -rf $(TESTDIR)/counts $(TESTLOGTAPFILE) $(TESTLOGERRFILE)
2455e361860SScott Kruger	@touch $(TESTLOGTAPFILE) $(TESTLOGERRFILE)
24627d73d1fSBarry Smith	@echo "Using MAKEFLAGS:" ${MAKEFLAGS}
24749da0fa4SScott Kruger
2484d9d3ee5SSatish Balaycheck-test-errors:
2495e361860SScott Kruger	@grep '^not ok' $(TESTLOGTAPFILE) | grep -v 'Exceeded timeout' | tee $(TESTDIR)/allgtests-tap-err.log
2504d9d3ee5SSatish Balay	@test ! -s $(TESTDIR)/allgtests-tap-err.log
2514d9d3ee5SSatish Balay
25249da0fa4SScott Kruger.PHONY: $(foreach pkg, $(pkgs), test-$(pkg) $(foreach lang, $(testlangs), test-$(pkg).$(lang) test-rm-$(pkg).$(lang)))
25349da0fa4SScott Krugertestpkgs := $(foreach pkg, $(pkgs), test-$(pkg))
25449da0fa4SScott Kruger# Targets to run tests in test-$pkg.$lang and delete the executables, language by language
25549da0fa4SScott Kruger$(testpkgs) : test-% : $(foreach lang, $(testlangs), test-rm-%.$(lang))
25649da0fa4SScott Kruger# List of raw test run targets
25749da0fa4SScott Krugeralltesttargets := $(foreach tp, $(testpkgs), $(foreach lang, $(testlangs), $($(tp).$(lang))))
25849da0fa4SScott Kruger
25949da0fa4SScott Kruger# Run targets
26049da0fa4SScott Kruger$(alltesttargets) : % : $(TESTDIR)/counts/%.counts
26149da0fa4SScott Kruger.PHONY: $(alltesttargets)
26249da0fa4SScott Kruger
26349da0fa4SScott Kruger$(TESTDIR)/counts/%.counts :
26449da0fa4SScott Kruger	$(quiettest) $< $(TESTFLAGS)
26549da0fa4SScott Kruger
26649da0fa4SScott Kruger# Targets to run tests and remove executables, by package-lang pairs.
26749da0fa4SScott Kruger# Run the tests in each batch using recursive invocation of make because
26849da0fa4SScott Kruger# we need all of them to complete before removing the executables.  Make
26949da0fa4SScott Kruger# doesn't guarantee an exploration order for the graph.  Only recursive
27049da0fa4SScott Kruger# if there is something to be done.
27149da0fa4SScott Krugeralltest-rm := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), test-rm-$(pkg).$(lang)))
27249da0fa4SScott Kruger$(alltest-rm) : test-rm-% : test-%
27349da0fa4SScott Krugerifneq ($(NO_RM),1)
27449da0fa4SScott Kruger	$(call quiet,RM) $(addprefix $(TESTDIR)/,$(basename $($(@:test-rm-%=testsrcs-%))))
27549da0fa4SScott Krugerendif
27649da0fa4SScott Kruger
27749da0fa4SScott Kruger# Remove intermediate .o files
27849da0fa4SScott Kruger# This only removes the files at the end which is insufficient
27949da0fa4SScott Kruger#.INTERMEDIATE: $(testsrcs.o:%.o=%)
28049da0fa4SScott Kruger
28149da0fa4SScott Kruger# all sources should get recompiled when petscvariables changes (i.e when configure is rerun or when petscvariables is manually edited.)
28249da0fa4SScott Kruger$(testsrcs.o) : $(petscvariables)
28349da0fa4SScott Kruger
28449da0fa4SScott Kruger%/.DIR :
28549da0fa4SScott Kruger	@mkdir -p $(@D)
28649da0fa4SScott Kruger	@touch $@
28749da0fa4SScott Kruger
28849da0fa4SScott Kruger.PRECIOUS: %/.DIR
28949da0fa4SScott Kruger
29049da0fa4SScott Kruger.SUFFIXES: # Clear .SUFFIXES because we don't use implicit rules
29149da0fa4SScott Kruger.DELETE_ON_ERROR:               # Delete likely-corrupt target file if rule fails
29249da0fa4SScott Kruger
29337ed16bcSStefano Zampini.PHONY: clean cleantest all
29449da0fa4SScott Kruger
29549da0fa4SScott Krugercleantest:
29649da0fa4SScott Kruger	${RM} -r $(TESTDIR) $(generatedtest)
29749da0fa4SScott Kruger
29849da0fa4SScott Krugerclean: cleantest
29949da0fa4SScott Kruger
30049da0fa4SScott Krugeralltest.d := $(testsrcs.o:%.o=%.d)
30149da0fa4SScott Kruger# Tell make that alltest.d are all up to date.  Without this, the include
30249da0fa4SScott Kruger# below has quadratic complexity, taking more than one second for a
30349da0fa4SScott Kruger# do-nothing build of PETSc (much worse for larger projects)
30449da0fa4SScott Kruger$(alltest.d) : ;
30549da0fa4SScott Kruger
30649da0fa4SScott Kruger-include $(alltest.d)
30749da0fa4SScott Kruger
30849da0fa4SScott Kruger# Tests can be generated by searching
30949da0fa4SScott Kruger# Percent is a wildcard (only one allowed):
31049da0fa4SScott Kruger#    make -f gmakefile test search=sys%ex2
31149da0fa4SScott Kruger# To match internal substrings (matches *ex2*):
31249da0fa4SScott Kruger#    make -f gmakefile test searchin=ex2
31349da0fa4SScott Kruger# Search and searchin can be combined:
31449da0fa4SScott Kruger#    make -f gmakefile test search='sys%' searchin=ex2
31549da0fa4SScott Kruger# For args:
31649da0fa4SScott Kruger#    make -f gmakefile test argsearch=cuda
31749da0fa4SScott Kruger# For general glob-style searching using python:
31849da0fa4SScott Kruger# NOTE: uses shell which is possibly slower and is possibly more brittle
31949da0fa4SScott Kruger#    make -f gmakefile test globsearch='sys*ex2*'
32049da0fa4SScott Krugerifdef search
32149da0fa4SScott Kruger  TESTTARGETS := $(filter $(search),$(alltesttargets))
32249da0fa4SScott Kruger  ifdef searchin
32349da0fa4SScott Kruger    TESTTARGETS2 := $(foreach v,$(TESTTARGETS),$(if $(findstring $(searchin),$(v)),$(v)))
32449da0fa4SScott Kruger    TESTTARGETS := $(TESTTARGETS2)
32549da0fa4SScott Kruger  endif
32649da0fa4SScott Krugerelse ifdef searchin
32749da0fa4SScott Kruger  TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(searchin),$(v)),$(v)))
32849da0fa4SScott Krugerelse ifdef argsearch
32949da0fa4SScott Kruger  TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(argsearch),$($(v)_ARGS)),$(v)))
33049da0fa4SScott Krugerelse ifdef globsearch
331aec279ffSScott Kruger  TESTTARGETS := $(shell $(PYTHON) config/query_tests.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) 'name' '$(globsearch)')
332feeaa4f6SScott Krugerelse ifdef test-fail
333feeaa4f6SScott Kruger  TESTTARGETS := $(shell $(PETSC_ARCH)/tests/echofailures.sh)
3346f5e9bd5SScott Krugerelse ifdef query
335aec279ffSScott Kruger  TESTTARGETS := $(shell $(PYTHON) config/query_tests.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) '$(query)' '$(queryval)')
33649da0fa4SScott Krugerelse                            # No filter - run them all, but delete the executables as we go
33749da0fa4SScott Kruger  TESTTARGETS := $(testpkgs)
33849da0fa4SScott Krugerendif
33949da0fa4SScott Kruger
34049da0fa4SScott Kruger.PHONY: report_tests print-test
34149da0fa4SScott Kruger
34249da0fa4SScott Krugerprint-test:
3435b6dee57SScott Kruger	$(info $(TESTTARGETS))
3445b6dee57SScott Kruger	@true
34549da0fa4SScott Kruger
3466e5deea7SScott Krugershow-fail:
347b711b6a4SScott Kruger	-@$(PYTHON) $(CONFIGDIR)/report_tests.py -d $(TESTDIR)/counts -f
348b711b6a4SScott Kruger
3496e5deea7SScott Kruger
3506e5deea7SScott Kruger
351c01c7e64SJed Brown# Don't start running tests until starttime has completed
352c01c7e64SJed Brown$(alltesttargets:%=$(TESTDIR)/counts/%.counts) : starttime
353c01c7e64SJed Brown
354c01c7e64SJed Brown# Ensure that libpetsc (if it is a prerequisite) has been built and clean the counts/logs before starting timer
355c01c7e64SJed Brownstarttime: pre-clean $(libpetscall)
35627d73d1fSBarry Smith	@$(eval STARTTIME := $(shell date +%s))
35727d73d1fSBarry Smith
35827d73d1fSBarry Smithreport_tests: starttime $(TESTTARGETS)
35932f4009dSScott Kruger	@$(eval ENDTIME := $(shell date +%s))
360a6f3f80dSScott Kruger	-@if test ${PRINTONLY} -ne 1; then  elapsed_time=$$(($(ENDTIME)- $(STARTTIME))) && \
361a6f3f80dSScott Kruger	$(PYTHON) $(CONFIGDIR)/report_tests.py -m $(MAKE) -d $(TESTDIR)/counts -t 5 -e $${elapsed_time};\
362a6f3f80dSScott Kruger    fi
36349da0fa4SScott Kruger
3645e361860SScott Krugercheck_output:
3655e361860SScott Kruger	$(PYTHON) $(CONFIGDIR)/gmakegentest.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --testdir=$(TESTDIR) --check-output
3665e361860SScott Kruger
36749da0fa4SScott Kruger# Do not how how to invoke test from makefile
36849da0fa4SScott KrugerHASGMAKEFILE := $(filter gmakefile,$(MAKEFILE_LIST))
36949da0fa4SScott Krugerifeq ($(HASGMAKEFILE),gmakefile)
37049da0fa4SScott Krugerhelpdeps:=help-make help-targets
37149da0fa4SScott Krugermakefile="gmakefile"
372142b82d2SScott Krugerother_help="To see full test help: make -f gmakefile.test help"
37349da0fa4SScott Krugerelse
37449da0fa4SScott Krugerhelpdeps:=help-make help-targets help-test
37549da0fa4SScott Krugermakefile="gmakefile.test"
376142b82d2SScott Krugerother_help=""
37749da0fa4SScott Krugerendif
37849da0fa4SScott Kruger
37949da0fa4SScott Krugerhelp: ${helpdeps}
38049da0fa4SScott Kruger	-@echo "Above is from: ${helpdeps}"
381142b82d2SScott Kruger	-@echo "${other_help}"
38249da0fa4SScott Kruger
38349da0fa4SScott Krugerhelp-make:
38449da0fa4SScott Kruger	-@echo
38549da0fa4SScott Kruger	-@echo "Basic build usage:"
38649da0fa4SScott Kruger	-@echo "   make -f ${makefile} <options>"
38749da0fa4SScott Kruger	-@echo
38849da0fa4SScott Kruger	-@echo "Options:"
38949da0fa4SScott Kruger	-@echo "  V=0           Very quiet builds"
39049da0fa4SScott Kruger	-@echo "  V=1           Verbose builds"
39149da0fa4SScott Kruger	-@echo
39249da0fa4SScott Kruger
39349da0fa4SScott Krugerhelp-targets:
39449da0fa4SScott Kruger	-@echo "All makefile targets and their dependencies:"
39549da0fa4SScott Kruger	-@grep ^[a-z] ${makefile} | grep : | grep -v =
39649da0fa4SScott Kruger	-@echo
39749da0fa4SScott Kruger	-@echo
39849da0fa4SScott Kruger
39949da0fa4SScott Krugerhelp-test:
40049da0fa4SScott Kruger	-@echo "Basic test usage:"
40149da0fa4SScott Kruger	-@echo "   make -f ${makefile} test <options>"
40249da0fa4SScott Kruger	-@echo
40349da0fa4SScott Kruger	-@echo "Options:"
40449da0fa4SScott Kruger	-@echo "  NO_RM=1           Do not remove the executables after running"
405f50802fbSScott Kruger	-@echo "  REPLACE=1         Replace the output in PETSC_DIR source tree (-m to test scripts)"
4065e361860SScott Kruger	-@echo "  OUTPUT=1          Show only the errors on stdout"
407f50802fbSScott Kruger	-@echo "  ALT=1             Replace 'alt' output in PETSC_DIR source tree (-M to test scripts)"
40849da0fa4SScott Kruger	-@echo "  DIFF_NUMBERS=1    Diff the numbers in the output (-j to test scripts and petscdiff)"
409*baa5c0f4SScott Kruger	-@echo "  CUDAMEMCHECK=1    Execute the tests using cuda-memcheck (-U to test scripts)"
41049da0fa4SScott Kruger	-@echo "  VALGRIND=1        Execute the tests using valgrind (-V to test scripts)"
411142b82d2SScott Kruger	-@echo "  NP=<num proc>     Set a number of processors to pass to scripts."
412142b82d2SScott Kruger	-@echo "  FORCE=1           Force SKIP or TODO tests to run"
413a6f3f80dSScott Kruger	-@echo "  PRINTONLY=1       Print the command, but do not run.  For loops print first command"
414142b82d2SScott Kruger	-@echo "  TIMEOUT=<time>    Test timeout limit in seconds (default in config/petsc_harness.sh)"
415f50802fbSScott Kruger	-@echo "  TESTDIR='tests'   Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}"
41649da0fa4SScott Kruger	-@echo "                    or $${PREFIX_DIR}/$${TESTDIR}"
41749da0fa4SScott Kruger	-@echo "                    or $${PREFIX_DIR}/share/petsc/examples/$${TESTDIR})"
4184ff3c6a1SScott Kruger	-@echo "  TESTBASE='tests'   Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}"
41949da0fa4SScott Kruger	-@echo "  OPTIONS='<args>'  Override options to scripts (-a to test scripts)"
42049da0fa4SScott Kruger	-@echo "  EXTRA_OPTIONS='<args>'  Add options to scripts (-e to test scripts)"
42149da0fa4SScott Kruger	-@echo
42249da0fa4SScott Kruger	-@echo "Tests can be generated by searching:"
42349da0fa4SScott Kruger	-@echo "  Percent is a wildcard (only one allowed):"
42449da0fa4SScott Kruger	-@echo "    make -f ${makefile} test search=sys%ex2"
42549da0fa4SScott Kruger	-@echo
42649da0fa4SScott Kruger	-@echo "  To match internal substrings (matches *ex2*):"
42749da0fa4SScott Kruger	-@echo "    make -f ${makefile} test searchin=ex2"
42849da0fa4SScott Kruger	-@echo
42949da0fa4SScott Kruger	-@echo "  Search and searchin can be combined:"
43049da0fa4SScott Kruger	-@echo "    make -f ${makefile} test search='sys%' searchin=ex2"
43149da0fa4SScott Kruger	-@echo
43249da0fa4SScott Kruger	-@echo "  To match patterns in the arguments:"
43349da0fa4SScott Kruger	-@echo "    make -f ${makefile} test argsearch=cuda"
43449da0fa4SScott Kruger	-@echo
43549da0fa4SScott Kruger	-@echo "  For general glob-style searching using python:"
43649da0fa4SScott Kruger	-@echo "   NOTE: uses shell which is possibly slower and more brittle"
43749da0fa4SScott Kruger	-@echo "    make -f ${makefile} test globsearch='sys*ex2*'"
43849da0fa4SScott Kruger	-@echo
439feeaa4f6SScott Kruger	-@echo "  To re-run the last tests which failed:"
440feeaa4f6SScott Kruger	-@echo "    make -f ${makefile} test test-fail='1'"
441feeaa4f6SScott Kruger	-@echo
4426f5e9bd5SScott Kruger	-@echo "  To search for fields from the original test definitions:"
4436f5e9bd5SScott Kruger	-@echo "    make -f ${makefile} test query='requires' queryval='*MPI_PROCESS_SHARED_MEMORY*'"
4446f5e9bd5SScott Kruger	-@echo
44549da0fa4SScott Kruger	-@echo "  To see which targets match a given pattern (useful for doing a specific target):"
44649da0fa4SScott Kruger	-@echo "    make -f ${makefile} print-test search=sys%"
44749da0fa4SScott Kruger	-@echo "  which is equivalent to:"
44849da0fa4SScott Kruger	-@echo "    make -f ${makefile} print VAR=TESTTARGETS search='sys%'"
44949da0fa4SScott Kruger	-@echo
45049da0fa4SScott Kruger	-@echo "  To build an executable, give full path to location:"
451c4762a1bSJed Brown	-@echo '    make -f ${makefile} $${PETSC_ARCH}/tests/sys/tests/ex1'
45249da0fa4SScott Kruger	-@echo "  or make the test with NO_RM=1"
45349da0fa4SScott Kruger	-@echo
454