xref: /petsc/gmakefile.test (revision 0d8a85bb71ef0767d41d0b9371fed20be320a28f)
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)
111*0d8a85bbSJunchao ZhangPETSC_COMPILE.cu = $(call quiet,CUDAC) -c $(CUDAC_FLAGS) $(CUFLAGS) --compiler-options="${PETSC_CCPPFLAGS} $(CUDACPPFLAGS) $(CUDA_CXXFLAGS)"
112694a2f0eSJunchao ZhangPETSC_COMPILE.hip.cpp = $(call quiet,HIPC) -c $(HIPC_FLAGS) $(HIPFLAGS) $(HIPPPFLAGS) $(HIPOPTFLAGS) $(HIPC_DEPFLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(CXX_DEPFLAGS)
11328f796eaSScott KrugerPETSC_COMPILE.sycl.cpp = $(call quiet,SYCLCPP) -c $(SYCLCPP_FLAGS) $(SYCLCPPFLAGS) $(SYCLCPPCPPFLAGS) $(SYCLCPP_DEPFLAGS)
1147ba7a817SBarry SmithPETSC_GENDEPS.cu = $(call quiet,CUDAC,.dep) --generate-dependencies --output-directory=$(@D) $(CUDAC_FLAGS) $(CUFLAGS)  --compiler-options="${PETSC_CCPPFLAGS} $(CUDA_CXXFLAGS)"
11549da0fa4SScott KrugerPETSC_COMPILE.F = $(call quiet,FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS)
11649da0fa4SScott Kruger
117600dc890SJunchao Zhangifneq ($(KOKKOS_USE_CUDA_COMPILER),)
118600dc890SJunchao Zhang  # Kokkos requires nvcc to be in PATH and the C++ compiler to be given in an environmental variable
119600dc890SJunchao Zhang  PETSC_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)
120600dc890SJunchao Zhang  PETSC_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)
121600dc890SJunchao Zhangelse ifneq ($(KOKKOS_USE_HIP_COMPILER),)
122600dc890SJunchao Zhang  PETSC_COMPILE.kokkos.cxx = $(PETSC_COMPILE.hip.cpp)
123600dc890SJunchao Zhang  PETSC_LINK.kokkos.cxx = MPICH_CXX="$(HIPC)" OMPI_CXX="$(HIPC)" $(CXXLINKER) $(HIPFLAGS) $(CXXFLAGS) $(PETSC_CCPPFLAGS) $(CPPFLAGS) $(LDFLAGS)
124600dc890SJunchao Zhangelse
125600dc890SJunchao Zhang  PETSC_COMPILE.kokkos.cxx = $(PETSC_COMPILE.cxx)
126600dc890SJunchao Zhang  PETSC_LINK.kokkos.cxx = $(CXXLINKER) $(CXXFLAGS) $(PETSC_CCPPFLAGS) $(CPPFLAGS) $(LDFLAGS)
127600dc890SJunchao Zhangendif
128600dc890SJunchao Zhang
129c0558f20SBarry Smithtestlangs := c cu cxx F F90 kokkos.cxx hip.cpp sycl.cpp
130513d7a9cSJed Brown$(foreach lang, $(testlangs), $(eval \
131513d7a9cSJed Brown  testexe.$(lang) = $(foreach pkg, $(pkgs), $(testsrcs-$(pkg).$(lang):%.$(lang)=$(TESTDIR)/%))))
13249da0fa4SScott Krugerconcattestlang = $(foreach lang, $(2), $(testsrcs-$(1).$(lang):%.$(lang)=$(TESTDIR)/%.o))
13349da0fa4SScott Krugertestsrcs.o := $(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),$(testlangs)))
134fc46264cSScott Krugertestsrcs-rel := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), $(testsrcs-$(pkg).$(lang))))
135fc46264cSScott Krugertestsrcs := $(foreach sfile, $(testsrcs-rel), $(TESTSRCDIR)/$(sfile))
13649da0fa4SScott Kruger
13706fe1a63SSatish Balay# workaround win32fe failure
13806fe1a63SSatish Balayifneq (,$(findstring win32fe,$(call quiet,$(cc_name))))
13906fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex6: | $(TESTDIR)/ts/tutorials/multirate/ex5
14006fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex8: | $(TESTDIR)/ts/tutorials/multirate/ex6
14106fe1a63SSatish Balayendif
14206fe1a63SSatish Balay
14349da0fa4SScott Kruger# Refresh testfiles when sources change, but don't balk if the source file is nonexistent (deleted)
14449da0fa4SScott Kruger$(generatedtest) : $(testsrcs)
14549da0fa4SScott Kruger$(testsrcs) :
14649da0fa4SScott Kruger
1474ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.c | $$(@D)/.DIR
14849da0fa4SScott Kruger	$(PETSC_COMPILE.c) $(abspath $<) -o $@
14949da0fa4SScott Kruger
150c0558f20SBarry Smith$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.kokkos.cxx | $$(@D)/.DIR
151c0558f20SBarry Smith	$(PETSC_COMPILE.kokkos.cxx) $(abspath $<) -o $@
152c0558f20SBarry Smith
1534ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cxx | $$(@D)/.DIR
15449da0fa4SScott Kruger	$(PETSC_COMPILE.cxx) $(abspath $<) -o $@
15549da0fa4SScott Kruger
1564ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cu | $$(@D)/.DIR
15749da0fa4SScott Kruger	$(PETSC_COMPILE.cu) $(abspath $<) -o $@ # Compile first so that if there is an error, it comes from a normal compile
15849da0fa4SScott Kruger	@$(PETSC_GENDEPS.cu) $(abspath $<) -o $(@:%.o=%.d) # Generate the dependencies for later
15949da0fa4SScott Kruger
160a55d2495SJed Brown# Test modules go in the same directory as the target *.o
161a55d2495SJed BrownTESTMODDIR = $(@D)
16249da0fa4SScott KrugerFCMOD = cd
1634ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F | $$(@D)/.DIR
16449da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),)
165a55d2495SJed Brown	$(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@)
16649da0fa4SScott Krugerelse
167a55d2495SJed Brown	$(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR)
16849da0fa4SScott Krugerendif
1690266c241SJed Brown	-@$(GFORTRAN_DEP_CLEANUP)
17049da0fa4SScott Kruger
1714ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F90 | $$(@D)/.DIR
17249da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),)
173a55d2495SJed Brown	$(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@)
17449da0fa4SScott Krugerelse
175a55d2495SJed Brown	$(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR)
17649da0fa4SScott Krugerendif
1770266c241SJed Brown	-@$(GFORTRAN_DEP_CLEANUP)
1780266c241SJed Brown
179cf7d3547SScott Kruger#   This is a hack to fix a broken gfortran.
1800266c241SJed Browndefine GFORTRAN_DEP_CLEANUP
1810266c241SJed Brown  if test -e "$(@:%.o=%.d)" && head -1 "$(@:%.o=%.d)" | fgrep -q -v : ; then\
1824f45eea9SScott Kruger    echo "$(@): \\" > $(@:%.o=%.dtemp) ; \
1830266c241SJed Brown    tr '\n' '@' < $(@:%.o=%.d) | cut -d: -f2- | tr '@' '\n' >> $(@:%.o=%.dtemp) ; \
1840266c241SJed Brown    mv $(@:%.o=%.dtemp) $(@:%.o=%.d); \
1854f45eea9SScott Kruger  fi
1860266c241SJed Brownendef
18749da0fa4SScott Kruger
18820844ca6SSatish Balay# link line constructed differently for gmakefile vs gmakefile.test invocation
18920844ca6SSatish Balayifeq ($(libpetscall),)
19020844ca6SSatish BalayPETSC_TEST_LIB = $(PETSC_LIB)
19120844ca6SSatish Balayelse
19220844ca6SSatish BalayPETSC_TEST_LIB = $(C_SH_LIB_PATH) $(PETSC_EXTERNAL_LIB_BASIC)
19320844ca6SSatish Balayendif
19420844ca6SSatish Balay
195bde159b7SSatish Balay# manually list some some library dependencies to check for circular dependencies
196c4762a1bSJed Brown$(TESTDIR)/sys/tests/ex9: PETSC_TEST_LIB = $(PETSC_SYS_LIB)
197c4762a1bSJed Brown$(TESTDIR)/vec/vec/tests/ex1: PETSC_TEST_LIB = $(PETSC_VEC_LIB)
198c4762a1bSJed Brown$(TESTDIR)/mat/tests/ex1: PETSC_TEST_LIB = $(PETSC_MAT_LIB)
199c4762a1bSJed Brown$(TESTDIR)/dm/tests/ex1: PETSC_TEST_LIB = $(PETSC_DM_LIB)
200c4762a1bSJed Brown$(TESTDIR)/ksp/ksp/tests/ex1: PETSC_TEST_LIB = $(PETSC_KSP_LIB)
201c4762a1bSJed Brown$(TESTDIR)/snes/tests/ex1: PETSC_TEST_LIB = $(PETSC_SNES_LIB)
202c4762a1bSJed Brown$(TESTDIR)/ts/tests/ex2: PETSC_TEST_LIB = $(PETSC_TS_LIB)
203c4762a1bSJed Brown$(TESTDIR)/tao/tutorials/ex1: PETSC_TEST_LIB = $(PETSC_TAO_LIB)
204bde159b7SSatish Balay
2050b148140SVaclav Hapla# if run with MACOS_FIREWALL=1 or MACOS_FIREWALL_REFRESH=1, ensure mpiexec.hydra and test executable is on firewall list
2060b148140SVaclav Haplaifeq ($(MACOS_FIREWALL_REFRESH),1)
2070b148140SVaclav Hapla# MACOS_FIREWALL_REFRESH=1 imply MACOS_FIREWALL=1
2080b148140SVaclav HaplaMACOS_FIREWALL := 1
2090b148140SVaclav Haplaendif
2100b148140SVaclav Hapla
2110b148140SVaclav Haplaifeq ($(MACOS_FIREWALL),1)
2120b148140SVaclav HaplaMACOS_FIREWALL_MPIEXEC := $(shell $(PYTHON) -c "import os; print(os.path.realpath('$(MPIEXEC)'))")
2130b148140SVaclav HaplaFW := /usr/libexec/ApplicationFirewall/socketfilterfw
2140b148140SVaclav Haplaifeq ($(MACOS_FIREWALL_REFRESH),1)
2151dcdb15bSVaclav Hapladefine macos-firewall-register
2161dcdb15bSVaclav Hapla  @APP=$(call abspath, $(1)); \
2170b148140SVaclav Hapla    echo "MACOS_FIREWALL_REFRESH set => refresh firewall rule"; \
2180b148140SVaclav Hapla    if ! sudo -n true 2>/dev/null; then echo "Asking for sudo password to add new firewall rule for\n  $$APP:"; fi; \
2190b148140SVaclav Hapla    sudo $(FW) --remove $$APP && \
2200b148140SVaclav Hapla    sudo $(FW) --add $$APP && \
2210b148140SVaclav Hapla    sudo $(FW) --blockapp $$APP
2220b148140SVaclav Haplaendef
2230b148140SVaclav Haplaelse
2240b148140SVaclav Hapladefine macos-firewall-register
2250b148140SVaclav Hapla  @APP=$(call abspath, $(1)); \
2260b148140SVaclav Hapla    ANS=`$(FW) --getappblocked $$APP`; \
2271dcdb15bSVaclav Hapla    if ! echo $$ANS | grep "$$APP" &> /dev/null; then \
2281dcdb15bSVaclav Hapla      if ! sudo -n true 2>/dev/null; then echo "Asking for sudo password to add new firewall rule for\n  $$APP:"; fi; \
2290b148140SVaclav Hapla      sudo $(FW) --add $$APP && \
2300b148140SVaclav Hapla      sudo $(FW) --blockapp $$APP; \
2311dcdb15bSVaclav Hapla    else \
2321dcdb15bSVaclav Hapla      echo $$ANS; \
2331dcdb15bSVaclav Hapla    fi
2341dcdb15bSVaclav Haplaendef
2350b148140SVaclav Haplaendif
2361dcdb15bSVaclav Hapladefine macos-firewall-fix
2371dcdb15bSVaclav Hapla  $(call macos-firewall-register, $(MACOS_FIREWALL_MPIEXEC))
2381dcdb15bSVaclav Hapla  $(call macos-firewall-register, $(1))
2391dcdb15bSVaclav Haplaendef
2401dcdb15bSVaclav Haplaendif
2411dcdb15bSVaclav Hapla
24249da0fa4SScott Kruger# Test executables
243513d7a9cSJed Brown$(testexe.F) $(testexe.F90) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
24420844ca6SSatish Balay	$(call quiet,FLINKER) -o $@ $^ $(PETSC_TEST_LIB)
2451dcdb15bSVaclav Hapla	-$(call macos-firewall-fix,$@)
24649da0fa4SScott Kruger
247513d7a9cSJed Brown$(testexe.c) $(testexe.cu) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
24820844ca6SSatish Balay	$(call quiet,CLINKER) -o $@ $^ $(PETSC_TEST_LIB)
2491dcdb15bSVaclav Hapla	-$(call macos-firewall-fix,$@)
25049da0fa4SScott Kruger
251c0558f20SBarry Smith$(testexe.kokkos.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
252c0558f20SBarry Smith	$(call quiet,PETSC_LINK.kokkos.cxx) -o $@ $^ $(PETSC_TEST_LIB)
2531dcdb15bSVaclav Hapla	-$(call macos-firewall-fix,$@)
254c0558f20SBarry Smith
255513d7a9cSJed Brown$(testexe.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
2562f4326f3SSatish Balay	$(call quiet,CXXLINKER) -o $@ $^ $(PETSC_TEST_LIB)
2571dcdb15bSVaclav Hapla	-$(call macos-firewall-fix,$@)
258513d7a9cSJed Brown
25949da0fa4SScott Kruger# Fortran source files need petsc*.mod, which isn't explicitly managed in the makefile.
26049da0fa4SScott Kruger$(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),F F90)) : $(libpetscall)
26149da0fa4SScott Kruger
26249da0fa4SScott Kruger# Testing convenience targets
263c173c275SScott Kruger.PHONY: test pre-clean
264c173c275SScott Kruger
265ff7b3809SScott Krugertest: report_tests
266c173c275SScott Kruger
26749da0fa4SScott Krugerpre-clean:
2685e361860SScott Kruger	@$(RM) -rf $(TESTDIR)/counts $(TESTLOGTAPFILE) $(TESTLOGERRFILE)
2695e361860SScott Kruger	@touch $(TESTLOGTAPFILE) $(TESTLOGERRFILE)
27027d73d1fSBarry Smith	@echo "Using MAKEFLAGS:" ${MAKEFLAGS}
27149da0fa4SScott Kruger
2724d9d3ee5SSatish Balaycheck-test-errors:
2735e361860SScott Kruger	@grep '^not ok' $(TESTLOGTAPFILE) | grep -v 'Exceeded timeout' | tee $(TESTDIR)/allgtests-tap-err.log
2744d9d3ee5SSatish Balay	@test ! -s $(TESTDIR)/allgtests-tap-err.log
2754d9d3ee5SSatish Balay
27649da0fa4SScott Kruger.PHONY: $(foreach pkg, $(pkgs), test-$(pkg) $(foreach lang, $(testlangs), test-$(pkg).$(lang) test-rm-$(pkg).$(lang)))
27749da0fa4SScott Krugertestpkgs := $(foreach pkg, $(pkgs), test-$(pkg))
27849da0fa4SScott Kruger# Targets to run tests in test-$pkg.$lang and delete the executables, language by language
27949da0fa4SScott Kruger$(testpkgs) : test-% : $(foreach lang, $(testlangs), test-rm-%.$(lang))
28049da0fa4SScott Kruger# List of raw test run targets
28149da0fa4SScott Krugeralltesttargets := $(foreach tp, $(testpkgs), $(foreach lang, $(testlangs), $($(tp).$(lang))))
28249da0fa4SScott Kruger
28349da0fa4SScott Kruger# Run targets
28449da0fa4SScott Kruger$(alltesttargets) : % : $(TESTDIR)/counts/%.counts
28549da0fa4SScott Kruger.PHONY: $(alltesttargets)
28649da0fa4SScott Kruger
28749da0fa4SScott Kruger$(TESTDIR)/counts/%.counts :
28849da0fa4SScott Kruger	$(quiettest) $< $(TESTFLAGS)
28949da0fa4SScott Kruger
29049da0fa4SScott Kruger# Targets to run tests and remove executables, by package-lang pairs.
29149da0fa4SScott Kruger# Run the tests in each batch using recursive invocation of make because
29249da0fa4SScott Kruger# we need all of them to complete before removing the executables.  Make
29349da0fa4SScott Kruger# doesn't guarantee an exploration order for the graph.  Only recursive
29449da0fa4SScott Kruger# if there is something to be done.
29549da0fa4SScott Krugeralltest-rm := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), test-rm-$(pkg).$(lang)))
29649da0fa4SScott Kruger$(alltest-rm) : test-rm-% : test-%
29749da0fa4SScott Krugerifneq ($(NO_RM),1)
29849da0fa4SScott Kruger	$(call quiet,RM) $(addprefix $(TESTDIR)/,$(basename $($(@:test-rm-%=testsrcs-%))))
29949da0fa4SScott Krugerendif
30049da0fa4SScott Kruger
30149da0fa4SScott Kruger# Remove intermediate .o files
30249da0fa4SScott Kruger# This only removes the files at the end which is insufficient
30349da0fa4SScott Kruger#.INTERMEDIATE: $(testsrcs.o:%.o=%)
30449da0fa4SScott Kruger
30549da0fa4SScott Kruger# all sources should get recompiled when petscvariables changes (i.e when configure is rerun or when petscvariables is manually edited.)
30649da0fa4SScott Kruger$(testsrcs.o) : $(petscvariables)
30749da0fa4SScott Kruger
30849da0fa4SScott Kruger%/.DIR :
30949da0fa4SScott Kruger	@mkdir -p $(@D)
31049da0fa4SScott Kruger	@touch $@
31149da0fa4SScott Kruger
31249da0fa4SScott Kruger.PRECIOUS: %/.DIR
31349da0fa4SScott Kruger
31449da0fa4SScott Kruger.SUFFIXES: # Clear .SUFFIXES because we don't use implicit rules
31549da0fa4SScott Kruger.DELETE_ON_ERROR:               # Delete likely-corrupt target file if rule fails
31649da0fa4SScott Kruger
31737ed16bcSStefano Zampini.PHONY: clean cleantest all
31849da0fa4SScott Kruger
31949da0fa4SScott Krugercleantest:
32049da0fa4SScott Kruger	${RM} -r $(TESTDIR) $(generatedtest)
32149da0fa4SScott Kruger
32249da0fa4SScott Krugerclean: cleantest
32349da0fa4SScott Kruger
32449da0fa4SScott Krugeralltest.d := $(testsrcs.o:%.o=%.d)
32549da0fa4SScott Kruger# Tell make that alltest.d are all up to date.  Without this, the include
32649da0fa4SScott Kruger# below has quadratic complexity, taking more than one second for a
32749da0fa4SScott Kruger# do-nothing build of PETSc (much worse for larger projects)
32849da0fa4SScott Kruger$(alltest.d) : ;
32949da0fa4SScott Kruger
33049da0fa4SScott Kruger-include $(alltest.d)
33149da0fa4SScott Kruger
33263cf4119SScott Kruger# Tests can be generated by searching -- see documentation below
333c9625024SScott Krugershowreport=
33485bc9deeSScott Krugerifndef searchin
33585bc9deeSScott Kruger   searchin = " "
33685bc9deeSScott Krugerendif
33785bc9deeSScott Krugerifdef i
33885bc9deeSScott Kruger   searchin = $(i)
33985bc9deeSScott Krugerendif
34063cf4119SScott Krugerifdef gmakesearch
341848cfe54SJed Brown  TESTTARGETS := $(filter $(gmakesearch),$(alltesttargets))
34285bc9deeSScott Kruger  ifdef gmakesearchin
34385bc9deeSScott Kruger    TESTTARGETS2 := $(foreach v,$(TESTTARGETS),$(if $(findstring $(gmakesearchin),$(v)),$(v)))
34449da0fa4SScott Kruger    TESTTARGETS := $(TESTTARGETS2)
34549da0fa4SScott Kruger  endif
34685bc9deeSScott Krugerelse ifdef gmakesearchin
34785bc9deeSScott Kruger  TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(gmakesearchin),$(v)),$(v)))
34849da0fa4SScott Krugerelse ifdef argsearch
34949da0fa4SScott Kruger  TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(argsearch),$($(v)_ARGS)),$(v)))
35063cf4119SScott Krugerelse ifdef search
35185bc9deeSScott Kruger  TESTTARGETS := $(shell $(PYTHON) config/query_tests.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) 'name' '$(search)')
35263cf4119SScott Krugerelse ifdef s
35385bc9deeSScott Kruger  TESTTARGETS := $(shell $(PYTHON) config/query_tests.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) 'name' '$(s)')
354feeaa4f6SScott Krugerelse ifdef test-fail
355feeaa4f6SScott Kruger  TESTTARGETS := $(shell $(PETSC_ARCH)/tests/echofailures.sh)
3566f5e9bd5SScott Krugerelse ifdef query
35785bc9deeSScott Kruger  TESTTARGETS := $(shell $(PYTHON) config/query_tests.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) '$(query)' '$(queryval)')
35885bc9deeSScott Krugerelse ifdef q
35985bc9deeSScott Kruger  TESTTARGETS := $(shell $(PYTHON) config/query_tests.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) '$(q)' '$(qv)')
36049da0fa4SScott Krugerelse                            # No filter - run them all, but delete the executables as we go
36149da0fa4SScott Kruger  TESTTARGETS := $(testpkgs)
362f42deef9SScott Kruger  ifneq ($(PRINTONLY),1)
363c9625024SScott Kruger    showreport = "-s"  # Only show full report when all tests are run
364f42deef9SScott Kruger  endif
36549da0fa4SScott Krugerendif
36649da0fa4SScott Kruger
36749da0fa4SScott Kruger.PHONY: report_tests print-test
36849da0fa4SScott Kruger
36949da0fa4SScott Krugerprint-test:
3705b6dee57SScott Kruger	$(info $(TESTTARGETS))
3715b6dee57SScott Kruger	@true
37249da0fa4SScott Kruger
3736e5deea7SScott Krugershow-fail:
374b711b6a4SScott Kruger	-@$(PYTHON) $(CONFIGDIR)/report_tests.py -d $(TESTDIR)/counts -f
375b711b6a4SScott Kruger
3766e5deea7SScott Kruger
3776e5deea7SScott Kruger
378c01c7e64SJed Brown# Don't start running tests until starttime has completed
379c01c7e64SJed Brown$(alltesttargets:%=$(TESTDIR)/counts/%.counts) : starttime
380c01c7e64SJed Brown
381c01c7e64SJed Brown# Ensure that libpetsc (if it is a prerequisite) has been built and clean the counts/logs before starting timer
382c01c7e64SJed Brownstarttime: pre-clean $(libpetscall)
38327d73d1fSBarry Smith	@$(eval STARTTIME := $(shell date +%s))
38427d73d1fSBarry Smith
38527d73d1fSBarry Smithreport_tests: starttime $(TESTTARGETS)
38632f4009dSScott Kruger	@$(eval ENDTIME := $(shell date +%s))
387c9625024SScott Kruger	-@ elapsed_time=$$(($(ENDTIME)- $(STARTTIME))) && \
388c9625024SScott Kruger	$(PYTHON) $(CONFIGDIR)/report_tests.py -m $(MAKE) -d $(TESTDIR)/counts -t 5 -e $${elapsed_time} $(showreport)
38949da0fa4SScott Kruger
3905e361860SScott Krugercheck_output:
3915e361860SScott Kruger	$(PYTHON) $(CONFIGDIR)/gmakegentest.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --testdir=$(TESTDIR) --check-output
3925e361860SScott Kruger
39349da0fa4SScott Kruger# Do not how how to invoke test from makefile
39449da0fa4SScott KrugerHASGMAKEFILE := $(filter gmakefile,$(MAKEFILE_LIST))
39549da0fa4SScott Krugerifeq ($(HASGMAKEFILE),gmakefile)
39649da0fa4SScott Krugerhelpdeps:=help-make help-targets
39749da0fa4SScott Krugermakefile="gmakefile"
398142b82d2SScott Krugerother_help="To see full test help: make -f gmakefile.test help"
39949da0fa4SScott Krugerelse
40049da0fa4SScott Krugerhelpdeps:=help-make help-targets help-test
40149da0fa4SScott Krugermakefile="gmakefile.test"
402142b82d2SScott Krugerother_help=""
40349da0fa4SScott Krugerendif
40449da0fa4SScott Kruger
40549da0fa4SScott Krugerhelp: ${helpdeps}
40649da0fa4SScott Kruger	-@echo "Above is from: ${helpdeps}"
407142b82d2SScott Kruger	-@echo "${other_help}"
40849da0fa4SScott Kruger
40949da0fa4SScott Krugerhelp-make:
41049da0fa4SScott Kruger	-@echo
41149da0fa4SScott Kruger	-@echo "Basic build usage:"
41249da0fa4SScott Kruger	-@echo "   make -f ${makefile} <options>"
41349da0fa4SScott Kruger	-@echo
41449da0fa4SScott Kruger	-@echo "Options:"
41549da0fa4SScott Kruger	-@echo "  V=0           Very quiet builds"
41649da0fa4SScott Kruger	-@echo "  V=1           Verbose builds"
41749da0fa4SScott Kruger	-@echo
41849da0fa4SScott Kruger
41949da0fa4SScott Krugerhelp-targets:
42049da0fa4SScott Kruger	-@echo "All makefile targets and their dependencies:"
42149da0fa4SScott Kruger	-@grep ^[a-z] ${makefile} | grep : | grep -v =
42249da0fa4SScott Kruger	-@echo
42349da0fa4SScott Kruger	-@echo
42449da0fa4SScott Kruger
42549da0fa4SScott Krugerhelp-test:
42649da0fa4SScott Kruger	-@echo "Basic test usage:"
42749da0fa4SScott Kruger	-@echo "   make -f ${makefile} test <options>"
42849da0fa4SScott Kruger	-@echo
42949da0fa4SScott Kruger	-@echo "Options:"
43085bc9deeSScott Kruger	-@echo "  V=1               Verbose output (-v to scripts)"
43149da0fa4SScott Kruger	-@echo "  NO_RM=1           Do not remove the executables after running"
432f50802fbSScott Kruger	-@echo "  REPLACE=1         Replace the output in PETSC_DIR source tree (-m to test scripts)"
4335e361860SScott Kruger	-@echo "  OUTPUT=1          Show only the errors on stdout"
434f50802fbSScott Kruger	-@echo "  ALT=1             Replace 'alt' output in PETSC_DIR source tree (-M to test scripts)"
43549da0fa4SScott Kruger	-@echo "  DIFF_NUMBERS=1    Diff the numbers in the output (-j to test scripts and petscdiff)"
436baa5c0f4SScott Kruger	-@echo "  CUDAMEMCHECK=1    Execute the tests using cuda-memcheck (-U to test scripts)"
43749da0fa4SScott Kruger	-@echo "  VALGRIND=1        Execute the tests using valgrind (-V to test scripts)"
43885bc9deeSScott Kruger	-@echo "  DEBUG=1           Launch tests in the debugger (-d to the scripts)"
439142b82d2SScott Kruger	-@echo "  NP=<num proc>     Set a number of processors to pass to scripts."
440142b82d2SScott Kruger	-@echo "  FORCE=1           Force SKIP or TODO tests to run"
441a6f3f80dSScott Kruger	-@echo "  PRINTONLY=1       Print the command, but do not run.  For loops print first command"
442142b82d2SScott Kruger	-@echo "  TIMEOUT=<time>    Test timeout limit in seconds (default in config/petsc_harness.sh)"
443f50802fbSScott Kruger	-@echo "  TESTDIR='tests'   Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}"
44449da0fa4SScott Kruger	-@echo "                    or $${PREFIX_DIR}/$${TESTDIR}"
44549da0fa4SScott Kruger	-@echo "                    or $${PREFIX_DIR}/share/petsc/examples/$${TESTDIR})"
4464ff3c6a1SScott Kruger	-@echo "  TESTBASE='tests'   Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}"
44749da0fa4SScott Kruger	-@echo "  OPTIONS='<args>'  Override options to scripts (-a to test scripts)"
44849da0fa4SScott Kruger	-@echo "  EXTRA_OPTIONS='<args>'  Add options to scripts (-e to test scripts)"
44949da0fa4SScott Kruger	-@echo
4500b148140SVaclav Hapla	-@echo "Special options for macOS:"
4510b148140SVaclav Hapla	-@echo "  MACOS_FIREWALL=1          Add each built test to the macOS firewall list to prevent popups. Configure --with-macos-firewall-rules to make this default"
4520b148140SVaclav Hapla	-@echo "  MACOS_FIREWALL_REFRESH=1  The same, but force re-addition to the list. You need to do cleantest first"
4530b148140SVaclav Hapla	-@echo
45463cf4119SScott Kruger	-@echo "Tests can be generated by searching with multiple methods"
45563cf4119SScott Kruger	-@echo "  For general searching (using config/query_test.py):"
45663cf4119SScott Kruger	-@echo "    make -f ${makefile} test search='sys*ex2*'"
45763cf4119SScott Kruger	-@echo "   or the shortcut using s"
45863cf4119SScott Kruger	-@echo "    make -f ${makefile} test s='sys*ex2*'"
45985bc9deeSScott Kruger	-@echo "  You can also use the full path to a file directory"
46085bc9deeSScott Kruger	-@echo "    make -f ${makefile} test s='src/sys/tests/'"
461feeaa4f6SScott Kruger	-@echo
4626f5e9bd5SScott Kruger	-@echo "  To search for fields from the original test definitions:"
4636f5e9bd5SScott Kruger	-@echo "    make -f ${makefile} test query='requires' queryval='*MPI_PROCESS_SHARED_MEMORY*'"
46485bc9deeSScott Kruger	-@echo "   or the shortcut using q and qv"
46585bc9deeSScott Kruger	-@echo "    make -f ${makefile} test q='requires' qv='*MPI_PROCESS_SHARED_MEMORY*'"
46685bc9deeSScott Kruger	-@echo "  To filter results from other searches, use searchin"
46785bc9deeSScott Kruger	-@echo "    make -f ${makefile} test s='src/sys/tests/' searchin='*options*'"
46863cf4119SScott Kruger	-@echo
46963cf4119SScott Kruger	-@echo "  To re-run the last tests which failed:"
47063cf4119SScott Kruger	-@echo "    make -f ${makefile} test test-fail='1'"
47163cf4119SScott Kruger	-@echo
47249da0fa4SScott Kruger	-@echo "  To see which targets match a given pattern (useful for doing a specific target):"
47363cf4119SScott Kruger	-@echo "    make -f ${makefile} print-test search=sys*"
47449da0fa4SScott Kruger	-@echo
47549da0fa4SScott Kruger	-@echo "  To build an executable, give full path to location:"
476c4762a1bSJed Brown	-@echo '    make -f ${makefile} $${PETSC_ARCH}/tests/sys/tests/ex1'
47749da0fa4SScott Kruger	-@echo "  or make the test with NO_RM=1"
47849da0fa4SScott Kruger	-@echo
479