xref: /petsc/gmakefile.test (revision f42deef95efdb32c74e20b044efbd18de6bff042)
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
56baa5c0f4SScott Krugerifeq ($(CUDAMEMCHECK),1)
57baa5c0f4SScott Kruger  TESTFLAGS += -U    # Add cuda-memcheck option to the flags
58baa5c0f4SScott Krugerendif
5949da0fa4SScott Krugerifeq ($(VALGRIND),1)
60baa5c0f4SScott Kruger  TESTFLAGS += -V    # Add valgrind option to the flags
6149da0fa4SScott Krugerendif
6285bc9deeSScott Krugerifeq ($(DEBUG),1)
6385bc9deeSScott Kruger  TESTFLAGS += -d    # Launch test in debugger
6485bc9deeSScott Krugerendif
6549da0fa4SScott Krugerifeq ($(REPLACE),1)
6649da0fa4SScott Kruger  TESTFLAGS += -m    # Replace results by passing -m to petscdiff
6749da0fa4SScott Krugerendif
685e361860SScott Krugerifeq ($(OUTPUT),1)
695e361860SScott Kruger  TESTFLAGS += -o 'err_only'    # Show only the errors on stdout
705e361860SScott Krugerendif
71f50802fbSScott Krugerifeq ($(ALT),1)
72f50802fbSScott Kruger  TESTFLAGS += -M    # Replace alt files by passing -M to petscdiff
73f50802fbSScott Krugerendif
74e6bdf5b1SSatish BalayPRINTONLY ?= 0
75a6f3f80dSScott Krugerifeq ($(PRINTONLY),1)
76a6f3f80dSScott Kruger  TESTFLAGS += -p    # Pass -p to petscdiff to print only command
77a6f3f80dSScott Krugerendif
7849da0fa4SScott Krugerifeq ($(DIFF_NUMBERS),1)
7949da0fa4SScott Kruger  TESTFLAGS += -j    # Pass -j to petscdiff to diff the actual numbers
8049da0fa4SScott Krugerendif
8149da0fa4SScott Krugerifdef OPTIONS
8249da0fa4SScott Kruger  TESTFLAGS += -a '$(OPTIONS)'   # override arguments
8349da0fa4SScott Krugerendif
8449da0fa4SScott Krugerifdef EXTRA_OPTIONS
8549da0fa4SScott Kruger  TESTFLAGS += -e '$(EXTRA_OPTIONS)'  # add extra arguments
8649da0fa4SScott Krugerendif
8749da0fa4SScott Krugerifdef NP
8849da0fa4SScott Kruger  TESTFLAGS += -n $(NP)  # set number of processes
8949da0fa4SScott Krugerendif
9049da0fa4SScott Kruger# Override the default timeout that may be found at the top of config/petsc_harness.sh
9149da0fa4SScott Kruger# This must be an integer.  It is given in seconds.
9249da0fa4SScott Krugerifdef TIMEOUT
9349da0fa4SScott Kruger  TESTFLAGS += -t $(TIMEOUT)  # Override the default timeout
9449da0fa4SScott Krugerendif
9549da0fa4SScott Kruger
96fc46264cSScott Kruger$(generatedtest) : $(petscconf) $(petscvariables) $(CONFIGDIR)/gmakegentest.py $(TESTDIR)/.DIR | $$(@D)/.DIR
978e69c5ecSJed Brown	$(PYTHON) $(CONFIGDIR)/gmakegentest.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --testdir=$(TESTDIR)
9849da0fa4SScott Kruger
99fca490e6SSatish Balayifneq ($(filter-out clean check,$(MAKECMDGOALS:clean%=clean)),)
100336d78f1SSatish Balayinclude $(generatedtest)
101535b694aSJed Brownendif
10249da0fa4SScott Kruger
10349da0fa4SScott Krugerifeq ($(PETSC_LANGUAGE),CXXONLY)
10449da0fa4SScott Kruger  cc_name := CXX
10549da0fa4SScott Krugerelse
10649da0fa4SScott Kruger  cc_name := CC
10749da0fa4SScott Krugerendif
10849da0fa4SScott Kruger
1090b119762SSatish BalayPETSC_COMPILE.c = $(call quiet,$(cc_name)) -c $(PCC_FLAGS) $(PFLAGS) $(CCPPFLAGS) $(C_DEPFLAGS)
1100b119762SSatish BalayPETSC_COMPILE.cxx = $(call quiet,CXX) -c $(CXX_FLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(CXX_DEPFLAGS)
111c0558f20SBarry Smithifneq ($(KOKKOS_BIN),)
112c0558f20SBarry Smith# Kokkos requires nvcc to be in PATH and the C++ compiler to be given in an environmental variable
113c0558f20SBarry 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)
114c0558f20SBarry 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)
115c0558f20SBarry Smithelse
116c0558f20SBarry SmithPETSC_COMPILE.kokkos.cxx = $(call quiet,CXX) -c $(CXX_FLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(CXX_DEPFLAGS)
117c0558f20SBarry SmithPETSC_LINK.kokkos.cxx = $(CXXLINKER) $(CXX_LINKER_FLAGS) $(CXXFLAGS) $(PETSC_CCPPFLAGS) $(CPPFLAGS) $(LDFLAGS)
118c0558f20SBarry Smithendif
11982707f21SStefano ZampiniPETSC_COMPILE.cu = $(call quiet,CUDAC) -c $(CUDAC_FLAGS) $(CUFLAGS) --compiler-options="$(PCC_FLAGS) $(CXXFLAGS) $(CCPPFLAGS)"
12028f796eaSScott KrugerPETSC_COMPILE.hip.cpp = $(call quiet,HIPCC) -c $(HIPCC_FLAGS) $(HIPCCFLAGS) $(HIPCCPPFLAGS) $(HIPCC_DEPFLAGS)
12128f796eaSScott KrugerPETSC_COMPILE.sycl.cpp = $(call quiet,SYCLCPP) -c $(SYCLCPP_FLAGS) $(SYCLCPPFLAGS) $(SYCLCPPCPPFLAGS) $(SYCLCPP_DEPFLAGS)
12282707f21SStefano ZampiniPETSC_GENDEPS.cu = $(call quiet,CUDAC,.dep) --generate-dependencies --output-directory=$(@D) $(CUDAC_FLAGS) $(CUFLAGS) --compiler-options="$(PCC_FLAGS) $(CXXFLAGS) $(CCPPFLAGS)"
12349da0fa4SScott KrugerPETSC_COMPILE.F = $(call quiet,FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS)
12449da0fa4SScott Kruger
125c0558f20SBarry Smithtestlangs := c cu cxx F F90 kokkos.cxx hip.cpp sycl.cpp
126513d7a9cSJed Brown$(foreach lang, $(testlangs), $(eval \
127513d7a9cSJed Brown  testexe.$(lang) = $(foreach pkg, $(pkgs), $(testsrcs-$(pkg).$(lang):%.$(lang)=$(TESTDIR)/%))))
12849da0fa4SScott Krugerconcattestlang = $(foreach lang, $(2), $(testsrcs-$(1).$(lang):%.$(lang)=$(TESTDIR)/%.o))
12949da0fa4SScott Krugertestsrcs.o := $(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),$(testlangs)))
130fc46264cSScott Krugertestsrcs-rel := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), $(testsrcs-$(pkg).$(lang))))
131fc46264cSScott Krugertestsrcs := $(foreach sfile, $(testsrcs-rel), $(TESTSRCDIR)/$(sfile))
13249da0fa4SScott Kruger
13306fe1a63SSatish Balay# workaround win32fe failure
13406fe1a63SSatish Balayifneq (,$(findstring win32fe,$(call quiet,$(cc_name))))
13506fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex6: | $(TESTDIR)/ts/tutorials/multirate/ex5
13606fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex8: | $(TESTDIR)/ts/tutorials/multirate/ex6
13706fe1a63SSatish Balayendif
13806fe1a63SSatish Balay
13949da0fa4SScott Kruger# Refresh testfiles when sources change, but don't balk if the source file is nonexistent (deleted)
14049da0fa4SScott Kruger$(generatedtest) : $(testsrcs)
14149da0fa4SScott Kruger$(testsrcs) :
14249da0fa4SScott Kruger
1434ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.c | $$(@D)/.DIR
14449da0fa4SScott Kruger	$(PETSC_COMPILE.c) $(abspath $<) -o $@
14549da0fa4SScott Kruger
146c0558f20SBarry Smith$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.kokkos.cxx | $$(@D)/.DIR
147c0558f20SBarry Smith	$(PETSC_COMPILE.kokkos.cxx) $(abspath $<) -o $@
148c0558f20SBarry Smith
1494ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cxx | $$(@D)/.DIR
15049da0fa4SScott Kruger	$(PETSC_COMPILE.cxx) $(abspath $<) -o $@
15149da0fa4SScott Kruger
1524ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cu | $$(@D)/.DIR
15349da0fa4SScott Kruger	$(PETSC_COMPILE.cu) $(abspath $<) -o $@ # Compile first so that if there is an error, it comes from a normal compile
15449da0fa4SScott Kruger	@$(PETSC_GENDEPS.cu) $(abspath $<) -o $(@:%.o=%.d) # Generate the dependencies for later
15549da0fa4SScott Kruger
156a55d2495SJed Brown# Test modules go in the same directory as the target *.o
157a55d2495SJed BrownTESTMODDIR = $(@D)
15849da0fa4SScott KrugerFCMOD = cd
1594ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F | $$(@D)/.DIR
16049da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),)
161a55d2495SJed Brown	$(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@)
16249da0fa4SScott Krugerelse
163a55d2495SJed Brown	$(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR)
16449da0fa4SScott Krugerendif
1650266c241SJed Brown	-@$(GFORTRAN_DEP_CLEANUP)
16649da0fa4SScott Kruger
1674ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F90 | $$(@D)/.DIR
16849da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),)
169a55d2495SJed Brown	$(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@)
17049da0fa4SScott Krugerelse
171a55d2495SJed Brown	$(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR)
17249da0fa4SScott Krugerendif
1730266c241SJed Brown	-@$(GFORTRAN_DEP_CLEANUP)
1740266c241SJed Brown
175cf7d3547SScott Kruger#   This is a hack to fix a broken gfortran.
1760266c241SJed Browndefine GFORTRAN_DEP_CLEANUP
1770266c241SJed Brown  if test -e "$(@:%.o=%.d)" && head -1 "$(@:%.o=%.d)" | fgrep -q -v : ; then\
1784f45eea9SScott Kruger    echo "$(@): \\" > $(@:%.o=%.dtemp) ; \
1790266c241SJed Brown    tr '\n' '@' < $(@:%.o=%.d) | cut -d: -f2- | tr '@' '\n' >> $(@:%.o=%.dtemp) ; \
1800266c241SJed Brown    mv $(@:%.o=%.dtemp) $(@:%.o=%.d); \
1814f45eea9SScott Kruger  fi
1820266c241SJed Brownendef
18349da0fa4SScott Kruger
18420844ca6SSatish Balay# link line constructed differently for gmakefile vs gmakefile.test invocation
18520844ca6SSatish Balayifeq ($(libpetscall),)
18620844ca6SSatish BalayPETSC_TEST_LIB = $(PETSC_LIB)
18720844ca6SSatish Balayelse
18820844ca6SSatish BalayPETSC_TEST_LIB = $(C_SH_LIB_PATH) $(PETSC_EXTERNAL_LIB_BASIC)
18920844ca6SSatish Balayendif
19020844ca6SSatish Balay
191bde159b7SSatish Balay# manually list some some library dependencies to check for circular dependencies
192c4762a1bSJed Brown$(TESTDIR)/sys/tests/ex9: PETSC_TEST_LIB = $(PETSC_SYS_LIB)
193c4762a1bSJed Brown$(TESTDIR)/vec/vec/tests/ex1: PETSC_TEST_LIB = $(PETSC_VEC_LIB)
194c4762a1bSJed Brown$(TESTDIR)/mat/tests/ex1: PETSC_TEST_LIB = $(PETSC_MAT_LIB)
195c4762a1bSJed Brown$(TESTDIR)/dm/tests/ex1: PETSC_TEST_LIB = $(PETSC_DM_LIB)
196c4762a1bSJed Brown$(TESTDIR)/ksp/ksp/tests/ex1: PETSC_TEST_LIB = $(PETSC_KSP_LIB)
197c4762a1bSJed Brown$(TESTDIR)/snes/tests/ex1: PETSC_TEST_LIB = $(PETSC_SNES_LIB)
198c4762a1bSJed Brown$(TESTDIR)/ts/tests/ex2: PETSC_TEST_LIB = $(PETSC_TS_LIB)
199c4762a1bSJed Brown$(TESTDIR)/tao/tutorials/ex1: PETSC_TEST_LIB = $(PETSC_TAO_LIB)
200bde159b7SSatish Balay
2011dcdb15bSVaclav Hapla# if configured --with-macos-firewall-rules, ensure mpiexec.hydra and test executable is on firewall list
2021dcdb15bSVaclav Haplaifdef MACOS_FIREWALL_MPIEXEC
2031dcdb15bSVaclav Hapladefine macos-firewall-register
2041dcdb15bSVaclav Hapla  @APP=$(call abspath, $(1)); \
2051dcdb15bSVaclav Hapla    FW=/usr/libexec/ApplicationFirewall/socketfilterfw; \
2061dcdb15bSVaclav Hapla    ANS=`$$FW --getappblocked $$APP`; \
2071dcdb15bSVaclav Hapla    if ! echo $$ANS | grep "$$APP" &> /dev/null; then \
2081dcdb15bSVaclav Hapla      if ! sudo -n true 2>/dev/null; then echo "Asking for sudo password to add new firewall rule for\n  $$APP:"; fi; \
2091dcdb15bSVaclav Hapla      sudo $$FW --add $$APP && \
210cbf093acSVaclav Hapla      sudo $$FW --blockapp $$APP; \
2111dcdb15bSVaclav Hapla    else \
2121dcdb15bSVaclav Hapla      echo $$ANS; \
2131dcdb15bSVaclav Hapla    fi
2141dcdb15bSVaclav Haplaendef
2151dcdb15bSVaclav Hapladefine macos-firewall-fix
2161dcdb15bSVaclav Hapla  $(call macos-firewall-register, $(MACOS_FIREWALL_MPIEXEC))
2171dcdb15bSVaclav Hapla  $(call macos-firewall-register, $(1))
2181dcdb15bSVaclav Haplaendef
2191dcdb15bSVaclav Haplaendif
2201dcdb15bSVaclav Hapla
22149da0fa4SScott Kruger# Test executables
222513d7a9cSJed Brown$(testexe.F) $(testexe.F90) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
22320844ca6SSatish Balay	$(call quiet,FLINKER) -o $@ $^ $(PETSC_TEST_LIB)
2241dcdb15bSVaclav Hapla	-$(call macos-firewall-fix,$@)
22549da0fa4SScott Kruger
226513d7a9cSJed Brown$(testexe.c) $(testexe.cu) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
22720844ca6SSatish Balay	$(call quiet,CLINKER) -o $@ $^ $(PETSC_TEST_LIB)
2281dcdb15bSVaclav Hapla	-$(call macos-firewall-fix,$@)
22949da0fa4SScott Kruger
230c0558f20SBarry Smith$(testexe.kokkos.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
231c0558f20SBarry Smith	$(call quiet,PETSC_LINK.kokkos.cxx) -o $@ $^ $(PETSC_TEST_LIB)
2321dcdb15bSVaclav Hapla	-$(call macos-firewall-fix,$@)
233c0558f20SBarry Smith
234513d7a9cSJed Brown$(testexe.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
2352f4326f3SSatish Balay	$(call quiet,CXXLINKER) -o $@ $^ $(PETSC_TEST_LIB)
2361dcdb15bSVaclav Hapla	-$(call macos-firewall-fix,$@)
237513d7a9cSJed Brown
23849da0fa4SScott Kruger# Fortran source files need petsc*.mod, which isn't explicitly managed in the makefile.
23949da0fa4SScott Kruger$(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),F F90)) : $(libpetscall)
24049da0fa4SScott Kruger
24149da0fa4SScott Kruger# Testing convenience targets
242c173c275SScott Kruger.PHONY: test pre-clean
243c173c275SScott Kruger
244ff7b3809SScott Krugertest: report_tests
245c173c275SScott Kruger
24649da0fa4SScott Krugerpre-clean:
2475e361860SScott Kruger	@$(RM) -rf $(TESTDIR)/counts $(TESTLOGTAPFILE) $(TESTLOGERRFILE)
2485e361860SScott Kruger	@touch $(TESTLOGTAPFILE) $(TESTLOGERRFILE)
24927d73d1fSBarry Smith	@echo "Using MAKEFLAGS:" ${MAKEFLAGS}
25049da0fa4SScott Kruger
2514d9d3ee5SSatish Balaycheck-test-errors:
2525e361860SScott Kruger	@grep '^not ok' $(TESTLOGTAPFILE) | grep -v 'Exceeded timeout' | tee $(TESTDIR)/allgtests-tap-err.log
2534d9d3ee5SSatish Balay	@test ! -s $(TESTDIR)/allgtests-tap-err.log
2544d9d3ee5SSatish Balay
25549da0fa4SScott Kruger.PHONY: $(foreach pkg, $(pkgs), test-$(pkg) $(foreach lang, $(testlangs), test-$(pkg).$(lang) test-rm-$(pkg).$(lang)))
25649da0fa4SScott Krugertestpkgs := $(foreach pkg, $(pkgs), test-$(pkg))
25749da0fa4SScott Kruger# Targets to run tests in test-$pkg.$lang and delete the executables, language by language
25849da0fa4SScott Kruger$(testpkgs) : test-% : $(foreach lang, $(testlangs), test-rm-%.$(lang))
25949da0fa4SScott Kruger# List of raw test run targets
26049da0fa4SScott Krugeralltesttargets := $(foreach tp, $(testpkgs), $(foreach lang, $(testlangs), $($(tp).$(lang))))
26149da0fa4SScott Kruger
26249da0fa4SScott Kruger# Run targets
26349da0fa4SScott Kruger$(alltesttargets) : % : $(TESTDIR)/counts/%.counts
26449da0fa4SScott Kruger.PHONY: $(alltesttargets)
26549da0fa4SScott Kruger
26649da0fa4SScott Kruger$(TESTDIR)/counts/%.counts :
26749da0fa4SScott Kruger	$(quiettest) $< $(TESTFLAGS)
26849da0fa4SScott Kruger
26949da0fa4SScott Kruger# Targets to run tests and remove executables, by package-lang pairs.
27049da0fa4SScott Kruger# Run the tests in each batch using recursive invocation of make because
27149da0fa4SScott Kruger# we need all of them to complete before removing the executables.  Make
27249da0fa4SScott Kruger# doesn't guarantee an exploration order for the graph.  Only recursive
27349da0fa4SScott Kruger# if there is something to be done.
27449da0fa4SScott Krugeralltest-rm := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), test-rm-$(pkg).$(lang)))
27549da0fa4SScott Kruger$(alltest-rm) : test-rm-% : test-%
27649da0fa4SScott Krugerifneq ($(NO_RM),1)
27749da0fa4SScott Kruger	$(call quiet,RM) $(addprefix $(TESTDIR)/,$(basename $($(@:test-rm-%=testsrcs-%))))
27849da0fa4SScott Krugerendif
27949da0fa4SScott Kruger
28049da0fa4SScott Kruger# Remove intermediate .o files
28149da0fa4SScott Kruger# This only removes the files at the end which is insufficient
28249da0fa4SScott Kruger#.INTERMEDIATE: $(testsrcs.o:%.o=%)
28349da0fa4SScott Kruger
28449da0fa4SScott Kruger# all sources should get recompiled when petscvariables changes (i.e when configure is rerun or when petscvariables is manually edited.)
28549da0fa4SScott Kruger$(testsrcs.o) : $(petscvariables)
28649da0fa4SScott Kruger
28749da0fa4SScott Kruger%/.DIR :
28849da0fa4SScott Kruger	@mkdir -p $(@D)
28949da0fa4SScott Kruger	@touch $@
29049da0fa4SScott Kruger
29149da0fa4SScott Kruger.PRECIOUS: %/.DIR
29249da0fa4SScott Kruger
29349da0fa4SScott Kruger.SUFFIXES: # Clear .SUFFIXES because we don't use implicit rules
29449da0fa4SScott Kruger.DELETE_ON_ERROR:               # Delete likely-corrupt target file if rule fails
29549da0fa4SScott Kruger
29637ed16bcSStefano Zampini.PHONY: clean cleantest all
29749da0fa4SScott Kruger
29849da0fa4SScott Krugercleantest:
29949da0fa4SScott Kruger	${RM} -r $(TESTDIR) $(generatedtest)
30049da0fa4SScott Kruger
30149da0fa4SScott Krugerclean: cleantest
30249da0fa4SScott Kruger
30349da0fa4SScott Krugeralltest.d := $(testsrcs.o:%.o=%.d)
30449da0fa4SScott Kruger# Tell make that alltest.d are all up to date.  Without this, the include
30549da0fa4SScott Kruger# below has quadratic complexity, taking more than one second for a
30649da0fa4SScott Kruger# do-nothing build of PETSc (much worse for larger projects)
30749da0fa4SScott Kruger$(alltest.d) : ;
30849da0fa4SScott Kruger
30949da0fa4SScott Kruger-include $(alltest.d)
31049da0fa4SScott Kruger
31163cf4119SScott Kruger# Tests can be generated by searching -- see documentation below
312*f42deef9SScott Krugershowreport = false
31385bc9deeSScott Krugerifndef searchin
31485bc9deeSScott Kruger   searchin = " "
31585bc9deeSScott Krugerendif
31685bc9deeSScott Krugerifdef i
31785bc9deeSScott Kruger   searchin = $(i)
31885bc9deeSScott Krugerendif
31963cf4119SScott Krugerifdef gmakesearch
320848cfe54SJed Brown  TESTTARGETS := $(filter $(gmakesearch),$(alltesttargets))
32185bc9deeSScott Kruger  ifdef gmakesearchin
32285bc9deeSScott Kruger    TESTTARGETS2 := $(foreach v,$(TESTTARGETS),$(if $(findstring $(gmakesearchin),$(v)),$(v)))
32349da0fa4SScott Kruger    TESTTARGETS := $(TESTTARGETS2)
32449da0fa4SScott Kruger  endif
32585bc9deeSScott Krugerelse ifdef gmakesearchin
32685bc9deeSScott Kruger  TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(gmakesearchin),$(v)),$(v)))
32749da0fa4SScott Krugerelse ifdef argsearch
32849da0fa4SScott Kruger  TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(argsearch),$($(v)_ARGS)),$(v)))
32963cf4119SScott Krugerelse ifdef search
33085bc9deeSScott Kruger  TESTTARGETS := $(shell $(PYTHON) config/query_tests.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) 'name' '$(search)')
33163cf4119SScott Krugerelse ifdef s
33285bc9deeSScott Kruger  TESTTARGETS := $(shell $(PYTHON) config/query_tests.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) 'name' '$(s)')
333feeaa4f6SScott Krugerelse ifdef test-fail
334feeaa4f6SScott Kruger  TESTTARGETS := $(shell $(PETSC_ARCH)/tests/echofailures.sh)
3356f5e9bd5SScott Krugerelse ifdef query
33685bc9deeSScott Kruger  TESTTARGETS := $(shell $(PYTHON) config/query_tests.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) '$(query)' '$(queryval)')
33785bc9deeSScott Krugerelse ifdef q
33885bc9deeSScott Kruger  TESTTARGETS := $(shell $(PYTHON) config/query_tests.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) '$(q)' '$(qv)')
33949da0fa4SScott Krugerelse                            # No filter - run them all, but delete the executables as we go
34049da0fa4SScott Kruger  TESTTARGETS := $(testpkgs)
341*f42deef9SScott Kruger  ifneq ($(PRINTONLY),1)
342*f42deef9SScott Kruger    showreport = true
343*f42deef9SScott Kruger  endif
34449da0fa4SScott Krugerendif
34549da0fa4SScott Kruger
34649da0fa4SScott Kruger.PHONY: report_tests print-test
34749da0fa4SScott Kruger
34849da0fa4SScott Krugerprint-test:
3495b6dee57SScott Kruger	$(info $(TESTTARGETS))
3505b6dee57SScott Kruger	@true
35149da0fa4SScott Kruger
3526e5deea7SScott Krugershow-fail:
353b711b6a4SScott Kruger	-@$(PYTHON) $(CONFIGDIR)/report_tests.py -d $(TESTDIR)/counts -f
354b711b6a4SScott Kruger
3556e5deea7SScott Kruger
3566e5deea7SScott Kruger
357c01c7e64SJed Brown# Don't start running tests until starttime has completed
358c01c7e64SJed Brown$(alltesttargets:%=$(TESTDIR)/counts/%.counts) : starttime
359c01c7e64SJed Brown
360c01c7e64SJed Brown# Ensure that libpetsc (if it is a prerequisite) has been built and clean the counts/logs before starting timer
361c01c7e64SJed Brownstarttime: pre-clean $(libpetscall)
36227d73d1fSBarry Smith	@$(eval STARTTIME := $(shell date +%s))
36327d73d1fSBarry Smith
36427d73d1fSBarry Smithreport_tests: starttime $(TESTTARGETS)
36532f4009dSScott Kruger	@$(eval ENDTIME := $(shell date +%s))
366*f42deef9SScott Kruger	-@if test ${showreport} == "true"; then  elapsed_time=$$(($(ENDTIME)- $(STARTTIME))) && \
367a6f3f80dSScott Kruger	$(PYTHON) $(CONFIGDIR)/report_tests.py -m $(MAKE) -d $(TESTDIR)/counts -t 5 -e $${elapsed_time};\
368a6f3f80dSScott Kruger    fi
36949da0fa4SScott Kruger
3705e361860SScott Krugercheck_output:
3715e361860SScott Kruger	$(PYTHON) $(CONFIGDIR)/gmakegentest.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --testdir=$(TESTDIR) --check-output
3725e361860SScott Kruger
37349da0fa4SScott Kruger# Do not how how to invoke test from makefile
37449da0fa4SScott KrugerHASGMAKEFILE := $(filter gmakefile,$(MAKEFILE_LIST))
37549da0fa4SScott Krugerifeq ($(HASGMAKEFILE),gmakefile)
37649da0fa4SScott Krugerhelpdeps:=help-make help-targets
37749da0fa4SScott Krugermakefile="gmakefile"
378142b82d2SScott Krugerother_help="To see full test help: make -f gmakefile.test help"
37949da0fa4SScott Krugerelse
38049da0fa4SScott Krugerhelpdeps:=help-make help-targets help-test
38149da0fa4SScott Krugermakefile="gmakefile.test"
382142b82d2SScott Krugerother_help=""
38349da0fa4SScott Krugerendif
38449da0fa4SScott Kruger
38549da0fa4SScott Krugerhelp: ${helpdeps}
38649da0fa4SScott Kruger	-@echo "Above is from: ${helpdeps}"
387142b82d2SScott Kruger	-@echo "${other_help}"
38849da0fa4SScott Kruger
38949da0fa4SScott Krugerhelp-make:
39049da0fa4SScott Kruger	-@echo
39149da0fa4SScott Kruger	-@echo "Basic build usage:"
39249da0fa4SScott Kruger	-@echo "   make -f ${makefile} <options>"
39349da0fa4SScott Kruger	-@echo
39449da0fa4SScott Kruger	-@echo "Options:"
39549da0fa4SScott Kruger	-@echo "  V=0           Very quiet builds"
39649da0fa4SScott Kruger	-@echo "  V=1           Verbose builds"
39749da0fa4SScott Kruger	-@echo
39849da0fa4SScott Kruger
39949da0fa4SScott Krugerhelp-targets:
40049da0fa4SScott Kruger	-@echo "All makefile targets and their dependencies:"
40149da0fa4SScott Kruger	-@grep ^[a-z] ${makefile} | grep : | grep -v =
40249da0fa4SScott Kruger	-@echo
40349da0fa4SScott Kruger	-@echo
40449da0fa4SScott Kruger
40549da0fa4SScott Krugerhelp-test:
40649da0fa4SScott Kruger	-@echo "Basic test usage:"
40749da0fa4SScott Kruger	-@echo "   make -f ${makefile} test <options>"
40849da0fa4SScott Kruger	-@echo
40949da0fa4SScott Kruger	-@echo "Options:"
41085bc9deeSScott Kruger	-@echo "  V=1               Verbose output (-v to scripts)"
41149da0fa4SScott Kruger	-@echo "  NO_RM=1           Do not remove the executables after running"
412f50802fbSScott Kruger	-@echo "  REPLACE=1         Replace the output in PETSC_DIR source tree (-m to test scripts)"
4135e361860SScott Kruger	-@echo "  OUTPUT=1          Show only the errors on stdout"
414f50802fbSScott Kruger	-@echo "  ALT=1             Replace 'alt' output in PETSC_DIR source tree (-M to test scripts)"
41549da0fa4SScott Kruger	-@echo "  DIFF_NUMBERS=1    Diff the numbers in the output (-j to test scripts and petscdiff)"
416baa5c0f4SScott Kruger	-@echo "  CUDAMEMCHECK=1    Execute the tests using cuda-memcheck (-U to test scripts)"
41749da0fa4SScott Kruger	-@echo "  VALGRIND=1        Execute the tests using valgrind (-V to test scripts)"
41885bc9deeSScott Kruger	-@echo "  DEBUG=1           Launch tests in the debugger (-d to the scripts)"
419142b82d2SScott Kruger	-@echo "  NP=<num proc>     Set a number of processors to pass to scripts."
420142b82d2SScott Kruger	-@echo "  FORCE=1           Force SKIP or TODO tests to run"
421a6f3f80dSScott Kruger	-@echo "  PRINTONLY=1       Print the command, but do not run.  For loops print first command"
422142b82d2SScott Kruger	-@echo "  TIMEOUT=<time>    Test timeout limit in seconds (default in config/petsc_harness.sh)"
423f50802fbSScott Kruger	-@echo "  TESTDIR='tests'   Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}"
42449da0fa4SScott Kruger	-@echo "                    or $${PREFIX_DIR}/$${TESTDIR}"
42549da0fa4SScott Kruger	-@echo "                    or $${PREFIX_DIR}/share/petsc/examples/$${TESTDIR})"
4264ff3c6a1SScott Kruger	-@echo "  TESTBASE='tests'   Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}"
42749da0fa4SScott Kruger	-@echo "  OPTIONS='<args>'  Override options to scripts (-a to test scripts)"
42849da0fa4SScott Kruger	-@echo "  EXTRA_OPTIONS='<args>'  Add options to scripts (-e to test scripts)"
42949da0fa4SScott Kruger	-@echo
43063cf4119SScott Kruger	-@echo "Tests can be generated by searching with multiple methods"
43163cf4119SScott Kruger	-@echo "  For general searching (using config/query_test.py):"
43263cf4119SScott Kruger	-@echo "    make -f ${makefile} test search='sys*ex2*'"
43363cf4119SScott Kruger	-@echo "   or the shortcut using s"
43463cf4119SScott Kruger	-@echo "    make -f ${makefile} test s='sys*ex2*'"
43585bc9deeSScott Kruger	-@echo "  You can also use the full path to a file directory"
43685bc9deeSScott Kruger	-@echo "    make -f ${makefile} test s='src/sys/tests/'"
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*'"
44085bc9deeSScott Kruger	-@echo "   or the shortcut using q and qv"
44185bc9deeSScott Kruger	-@echo "    make -f ${makefile} test q='requires' qv='*MPI_PROCESS_SHARED_MEMORY*'"
44285bc9deeSScott Kruger	-@echo "  To filter results from other searches, use searchin"
44385bc9deeSScott Kruger	-@echo "    make -f ${makefile} test s='src/sys/tests/' searchin='*options*'"
44463cf4119SScott Kruger	-@echo
44563cf4119SScott Kruger	-@echo "  To re-run the last tests which failed:"
44663cf4119SScott Kruger	-@echo "    make -f ${makefile} test test-fail='1'"
44763cf4119SScott Kruger	-@echo
44849da0fa4SScott Kruger	-@echo "  To see which targets match a given pattern (useful for doing a specific target):"
44963cf4119SScott Kruger	-@echo "    make -f ${makefile} print-test search=sys*"
45049da0fa4SScott Kruger	-@echo
45149da0fa4SScott Kruger	-@echo "  To build an executable, give full path to location:"
452c4762a1bSJed Brown	-@echo '    make -f ${makefile} $${PETSC_ARCH}/tests/sys/tests/ex1'
45349da0fa4SScott Kruger	-@echo "  or make the test with NO_RM=1"
45449da0fa4SScott Kruger	-@echo
455