xref: /petsc/gmakefile.test (revision 636bfc99ee5ad3e598b916a58264e2777008f4de)
149da0fa4SScott Kruger# -*- mode: makefile-gmake -*-
2fca490e6SSatish Balay-include petscdir.mk
349da0fa4SScott Kruger
450dcbc5aSJunchao Zhang.SUFFIXES: .F  .F90 .f90 ${SUFFIXES} .PETSc .C .cc .cpp .cxx .r .rm .so .html .ad .m .tex .make  .fig .svg .eps .pdf .jpg .png .dvi .ps .F95 .f95 .fiat .cu .kokkos.cxx .raja.cxx .hip.cpp .sycl.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
1670d5ab12SJacob FaibussowitschTESTDIR ?= ./$(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
32a5b23f4aSJose E. Roman#workaround 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
9943bc4718SBarry Smithifneq ($(filter-out clean check info libs all checkbadSource,$(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
1093761b06dSJed BrownPETSC_COMPILE.c = $(call quiet,$(cc_name)) -c $(PCC_FLAGS) $($(CLANGUAGE)FLAGS) $(CCPPFLAGS) $(C_DEPFLAGS)
1100b119762SSatish BalayPETSC_COMPILE.cxx = $(call quiet,CXX) -c $(CXX_FLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(CXX_DEPFLAGS)
111042217e8SBarry SmithPETSC_COMPILE.cu = $(call quiet,CUDAC) -c $(MPICXX_INCLUDES) $(CUDAC_FLAGS) $(CUFLAGS) --compiler-options="${PETSC_CCPPFLAGS} $(CUDACPPFLAGS) $(CUDA_CXXFLAGS)"
11250dcbc5aSJunchao ZhangPETSC_COMPILE.hip.cpp = $(call quiet,HIPC)   -c $(MPICXX_INCLUDES) $(HIPC_FLAGS) $(HIPPP_FLAGS) $(HIPFLAGS) $(HIPPPFLAGS) $(HIPOPTFLAGS) $(HIPC_DEPFLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(HIP_DEPFLAGS)
11350dcbc5aSJunchao ZhangPETSC_COMPILE.sycl.cxx = $(call quiet,SYCLC) -c $(MPICXX_INCLUDES) $(SYCLC_FLAGS) $(SYCLPP_FLAGS) $(SYCLFLAGS) $(SYCLPPFLAGS) $(SYCLOPTFLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(SYCL_DEPFLAGS)
114042217e8SBarry SmithPETSC_GENDEPS.cu = $(call quiet,CUDAC,.dep) --generate-dependencies --output-directory=$(@D) $(MPICXX_INCLUDES) $(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
11964cfe48dSJed Brown  KOKC = PATH=`dirname $(CUDAC)`:$(PATH) NVCC_WRAPPER_DEFAULT_COMPILER="$(CUDA_CXX)" $(KOKKOS_BIN)/nvcc_wrapper --expt-extended-lambda
12064cfe48dSJed Brown  PETSC_COMPILE.kokkos.cxx = $(call quiet,KOKC) -c $(CUDAC_FLAGS) ${PETSC_CCPPFLAGS} $(CUDACPPFLAGS) $(CUDA_CXXFLAGS) $(MPICXX_INCLUDES)
12164cfe48dSJed Brown  PETSC_LINK.kokkos.cxx = $(KOKC) $(CUDAC_FLAGS) $(MPICXX_INCLUDES) ${PETSC_CCPPFLAGS} $(CUDA_CXXFLAGS) $(CUDA_CXXLIBS) $(MPICXX_LIBS) $(LDFLAGS)
122600dc890SJunchao Zhangelse ifneq ($(KOKKOS_USE_HIP_COMPILER),)
123600dc890SJunchao Zhang  PETSC_COMPILE.kokkos.cxx = $(PETSC_COMPILE.hip.cpp)
1248bc43e58SJunchao Zhang  PETSC_LINK.kokkos.cxx = $(HIPC) $(HIPFLAGS) $(CXXFLAGS) $(PETSC_CCPPFLAGS) $(CPPFLAGS) $(LDFLAGS) $(MPICXX_INCLUDES) $(MPICXX_LIBS)
12550dcbc5aSJunchao Zhangelse ifneq ($(KOKKOS_USE_SYCL_COMPILER),)
12650dcbc5aSJunchao Zhang  PETSC_COMPILE.kokkos.cxx = $(PETSC_COMPILE.sycl.cxx)
12750dcbc5aSJunchao Zhang  PETSC_LINK.kokkos.cxx = $(SYCLC) $(SYCLFLAGS) $(CXXFLAGS) $(PETSC_CCPPFLAGS) $(CPPFLAGS) $(LDFLAGS) $(MPICXX_INCLUDES) $(MPICXX_LIBS)
128600dc890SJunchao Zhangelse
129600dc890SJunchao Zhang  PETSC_COMPILE.kokkos.cxx = $(PETSC_COMPILE.cxx)
130600dc890SJunchao Zhang  PETSC_LINK.kokkos.cxx = $(CXXLINKER) $(CXXFLAGS) $(PETSC_CCPPFLAGS) $(CPPFLAGS) $(LDFLAGS)
131600dc890SJunchao Zhangendif
132600dc890SJunchao Zhang
133d23021a0SBarry Smithifneq ($(RAJA_USE_CUDA_COMPILER),)
134d23021a0SBarry Smith  PETSC_COMPILE.raja.cxx  = ${CUDAC} $(MPICXX_INCLUDES) ${CUDAC_FLAGS} ${CUFLAGS} -x cu -Xcudafe "--display_error_number" -c --compiler-options="${PETSC_CCPPFLAGS} ${PETSC_CC_INCLUDES} ${CUDA_CXXFLAGS}" --expt-extended-lambda --expt-relaxed-constexpr
135d23021a0SBarry Smithelse
136d23021a0SBarry Smith  PETSC_COMPILE.raja.cxx = ${CXX} -o $*.o -c ${CXX_FLAGS} ${CXXFLAGS} ${CXXCPPFLAGS}
137d23021a0SBarry Smithendif
138d23021a0SBarry Smith
13950dcbc5aSJunchao Zhangtestlangs := c cu cxx F F90 kokkos.cxx hip.cpp sycl.cxx raja.cxx
140513d7a9cSJed Brown$(foreach lang, $(testlangs), $(eval \
141513d7a9cSJed Brown  testexe.$(lang) = $(foreach pkg, $(pkgs), $(testsrcs-$(pkg).$(lang):%.$(lang)=$(TESTDIR)/%))))
14249da0fa4SScott Krugerconcattestlang = $(foreach lang, $(2), $(testsrcs-$(1).$(lang):%.$(lang)=$(TESTDIR)/%.o))
14349da0fa4SScott Krugertestsrcs.o := $(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),$(testlangs)))
144fc46264cSScott Krugertestsrcs-rel := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), $(testsrcs-$(pkg).$(lang))))
145fc46264cSScott Krugertestsrcs := $(foreach sfile, $(testsrcs-rel), $(TESTSRCDIR)/$(sfile))
14649da0fa4SScott Kruger
14706fe1a63SSatish Balay# workaround win32fe failure
14806fe1a63SSatish Balayifneq (,$(findstring win32fe,$(call quiet,$(cc_name))))
14906fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex6: | $(TESTDIR)/ts/tutorials/multirate/ex5
15006fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex8: | $(TESTDIR)/ts/tutorials/multirate/ex6
15106fe1a63SSatish Balayendif
15206fe1a63SSatish Balay
15349da0fa4SScott Kruger# Refresh testfiles when sources change, but don't balk if the source file is nonexistent (deleted)
15449da0fa4SScott Kruger$(generatedtest) : $(testsrcs)
15549da0fa4SScott Kruger$(testsrcs) :
15649da0fa4SScott Kruger
1574ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.c | $$(@D)/.DIR
15849da0fa4SScott Kruger	$(PETSC_COMPILE.c) $(abspath $<) -o $@
15949da0fa4SScott Kruger
160c0558f20SBarry Smith$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.kokkos.cxx | $$(@D)/.DIR
161c0558f20SBarry Smith	$(PETSC_COMPILE.kokkos.cxx) $(abspath $<) -o $@
162c0558f20SBarry Smith
16350dcbc5aSJunchao Zhang$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.sycl.cxx | $$(@D)/.DIR
16450dcbc5aSJunchao Zhang	$(PETSC_COMPILE.sycl.cxx) $(abspath $<) -o $@
16550dcbc5aSJunchao Zhang
166d23021a0SBarry Smith$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.raja.cxx | $$(@D)/.DIR
167d23021a0SBarry Smith	$(PETSC_COMPILE.raja.cxx) $(abspath $<) -o $@
168d23021a0SBarry Smith
1694ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cxx | $$(@D)/.DIR
17049da0fa4SScott Kruger	$(PETSC_COMPILE.cxx) $(abspath $<) -o $@
17149da0fa4SScott Kruger
1724ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cu | $$(@D)/.DIR
17349da0fa4SScott Kruger	$(PETSC_COMPILE.cu) $(abspath $<) -o $@ # Compile first so that if there is an error, it comes from a normal compile
17449da0fa4SScott Kruger	@$(PETSC_GENDEPS.cu) $(abspath $<) -o $(@:%.o=%.d) # Generate the dependencies for later
17549da0fa4SScott Kruger
1761a5aed34SJunchao Zhang$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.hip.cpp | $$(@D)/.DIR
1771a5aed34SJunchao Zhang	$(PETSC_COMPILE.hip.cpp) $(abspath $<) -o $@
1781a5aed34SJunchao Zhang
179a55d2495SJed Brown# Test modules go in the same directory as the target *.o
180a55d2495SJed BrownTESTMODDIR = $(@D)
18149da0fa4SScott KrugerFCMOD = cd
1824ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F | $$(@D)/.DIR
18349da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),)
184a55d2495SJed Brown	$(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@)
18549da0fa4SScott Krugerelse
186a55d2495SJed Brown	$(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR)
18749da0fa4SScott Krugerendif
1880266c241SJed Brown	-@$(GFORTRAN_DEP_CLEANUP)
18949da0fa4SScott Kruger
1904ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F90 | $$(@D)/.DIR
19149da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),)
192a55d2495SJed Brown	$(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@)
19349da0fa4SScott Krugerelse
194a55d2495SJed Brown	$(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR)
19549da0fa4SScott Krugerendif
1960266c241SJed Brown	-@$(GFORTRAN_DEP_CLEANUP)
1970266c241SJed Brown
198cf7d3547SScott Kruger#   This is a hack to fix a broken gfortran.
1990266c241SJed Browndefine GFORTRAN_DEP_CLEANUP
2000266c241SJed Brown  if test -e "$(@:%.o=%.d)" && head -1 "$(@:%.o=%.d)" | fgrep -q -v : ; then\
2014f45eea9SScott Kruger    echo "$(@): \\" > $(@:%.o=%.dtemp) ; \
2020266c241SJed Brown    tr '\n' '@' < $(@:%.o=%.d) | cut -d: -f2- | tr '@' '\n' >> $(@:%.o=%.dtemp) ; \
2030266c241SJed Brown    mv $(@:%.o=%.dtemp) $(@:%.o=%.d); \
2044f45eea9SScott Kruger  fi
2050266c241SJed Brownendef
20649da0fa4SScott Kruger
20720844ca6SSatish Balay# link line constructed differently for gmakefile vs gmakefile.test invocation
20820844ca6SSatish Balayifeq ($(libpetscall),)
20920844ca6SSatish BalayPETSC_TEST_LIB = $(PETSC_LIB)
21020844ca6SSatish Balayelse
21120844ca6SSatish BalayPETSC_TEST_LIB = $(C_SH_LIB_PATH) $(PETSC_EXTERNAL_LIB_BASIC)
21220844ca6SSatish Balayendif
21320844ca6SSatish Balay
214bde159b7SSatish Balay# manually list some some library dependencies to check for circular dependencies
215c4762a1bSJed Brown$(TESTDIR)/sys/tests/ex9: PETSC_TEST_LIB = $(PETSC_SYS_LIB)
216c4762a1bSJed Brown$(TESTDIR)/vec/vec/tests/ex1: PETSC_TEST_LIB = $(PETSC_VEC_LIB)
217c4762a1bSJed Brown$(TESTDIR)/mat/tests/ex1: PETSC_TEST_LIB = $(PETSC_MAT_LIB)
218c4762a1bSJed Brown$(TESTDIR)/dm/tests/ex1: PETSC_TEST_LIB = $(PETSC_DM_LIB)
219c4762a1bSJed Brown$(TESTDIR)/ksp/ksp/tests/ex1: PETSC_TEST_LIB = $(PETSC_KSP_LIB)
220c4762a1bSJed Brown$(TESTDIR)/snes/tests/ex1: PETSC_TEST_LIB = $(PETSC_SNES_LIB)
221c4762a1bSJed Brown$(TESTDIR)/ts/tests/ex2: PETSC_TEST_LIB = $(PETSC_TS_LIB)
222c4762a1bSJed Brown$(TESTDIR)/tao/tutorials/ex1: PETSC_TEST_LIB = $(PETSC_TAO_LIB)
223bde159b7SSatish Balay
2247cb68e74SVaclav Hapla# MACOS FIREWALL HANDLING
2257cb68e74SVaclav Hapla# - if run with MACOS_FIREWALL=1
2267cb68e74SVaclav Hapla#   (automatically set in $PETSC_ARCH/lib/petsc/conf/petscvariables if configured --with-macos-firewall-rules),
2277cb68e74SVaclav Hapla#   ensure mpiexec and test executable is on firewall list
2287cb68e74SVaclav Hapla#
2290b148140SVaclav Haplaifeq ($(MACOS_FIREWALL),1)
2300b148140SVaclav HaplaFW := /usr/libexec/ApplicationFirewall/socketfilterfw
2317cb68e74SVaclav Hapla# There is no reliable realpath command in macOS without need for 3rd party tools like homebrew coreutils
2327cb68e74SVaclav Hapla# Using Python's realpath seems like the most robust way here
2337cb68e74SVaclav Haplarealpath-py = $(shell $(PYTHON) -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' $(1))
2347cb68e74SVaclav Hapla#
2351dcdb15bSVaclav Hapladefine macos-firewall-register
2367cb68e74SVaclav Hapla  @APP=$(call realpath-py, $(1)); \
2371855f086SVaclav Hapla    if ! sudo -n true 2>/dev/null; then printf "Asking for sudo password to add new firewall rule for\n  $$APP\n"; fi; \
2387cb68e74SVaclav Hapla    sudo $(FW) --remove $$APP --add $$APP --blockapp $$APP
2391dcdb15bSVaclav Haplaendef
2400b148140SVaclav Haplaendif
2417cb68e74SVaclav Hapla#
2427cb68e74SVaclav Haplamacos-firewall-register-mpiexec:
243961fb248SStefano Zampini	-$(call macos-firewall-register, $(MPIEXEC))
2441dcdb15bSVaclav Hapla
24549da0fa4SScott Kruger# Test executables
246513d7a9cSJed Brown$(testexe.F) $(testexe.F90) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
24720844ca6SSatish Balay	$(call quiet,FLINKER) -o $@ $^ $(PETSC_TEST_LIB)
2487cb68e74SVaclav Hapla	-$(call macos-firewall-register,$@)
24949da0fa4SScott Kruger
250513d7a9cSJed Brown$(testexe.c) $(testexe.cu) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
2511c6715b8SMatthew G. Knepley	$(call quiet,CLINKER) $(EXEFLAGS) -o $@ $^ $(PETSC_TEST_LIB)
2527cb68e74SVaclav Hapla	-$(call macos-firewall-register,$@)
25349da0fa4SScott Kruger
2541a5aed34SJunchao Zhang$(testexe.hip.cpp) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
2551a5aed34SJunchao Zhang	$(call quiet,CLINKER) -o $@ $^ $(PETSC_TEST_LIB)
2561a5aed34SJunchao Zhang	-$(call macos-firewall-register,$@)
2571a5aed34SJunchao Zhang
258c0558f20SBarry Smith$(testexe.kokkos.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
259c0558f20SBarry Smith	$(call quiet,PETSC_LINK.kokkos.cxx) -o $@ $^ $(PETSC_TEST_LIB)
2607cb68e74SVaclav Hapla	-$(call macos-firewall-register,$@)
261c0558f20SBarry Smith
262d23021a0SBarry Smith$(testexe.raja.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
263d23021a0SBarry Smith	$(call quiet,CLINKER) -o $@ $^ $(PETSC_TEST_LIB)
264d23021a0SBarry Smith	-$(call macos-firewall-register,$@)
265d23021a0SBarry Smith
266513d7a9cSJed Brown$(testexe.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
2672f4326f3SSatish Balay	$(call quiet,CXXLINKER) -o $@ $^ $(PETSC_TEST_LIB)
2687cb68e74SVaclav Hapla	-$(call macos-firewall-register,$@)
269513d7a9cSJed Brown
27049da0fa4SScott Kruger# Fortran source files need petsc*.mod, which isn't explicitly managed in the makefile.
27149da0fa4SScott Kruger$(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),F F90)) : $(libpetscall)
27249da0fa4SScott Kruger
27349da0fa4SScott Kruger# Testing convenience targets
274c173c275SScott Kruger.PHONY: test pre-clean
275c173c275SScott Kruger
276ff7b3809SScott Krugertest: report_tests
277c173c275SScott Kruger
27849da0fa4SScott Krugerpre-clean:
2795e361860SScott Kruger	@$(RM) -rf $(TESTDIR)/counts $(TESTLOGTAPFILE) $(TESTLOGERRFILE)
2805e361860SScott Kruger	@touch $(TESTLOGTAPFILE) $(TESTLOGERRFILE)
28127d73d1fSBarry Smith	@echo "Using MAKEFLAGS:" ${MAKEFLAGS}
28249da0fa4SScott Kruger
2834d9d3ee5SSatish Balaycheck-test-errors:
2845e361860SScott Kruger	@grep '^not ok' $(TESTLOGTAPFILE) | grep -v 'Exceeded timeout' | tee $(TESTDIR)/allgtests-tap-err.log
2854d9d3ee5SSatish Balay	@test ! -s $(TESTDIR)/allgtests-tap-err.log
2864d9d3ee5SSatish Balay
28749da0fa4SScott Kruger.PHONY: $(foreach pkg, $(pkgs), test-$(pkg) $(foreach lang, $(testlangs), test-$(pkg).$(lang) test-rm-$(pkg).$(lang)))
28849da0fa4SScott Krugertestpkgs := $(foreach pkg, $(pkgs), test-$(pkg))
28949da0fa4SScott Kruger# Targets to run tests in test-$pkg.$lang and delete the executables, language by language
29049da0fa4SScott Kruger$(testpkgs) : test-% : $(foreach lang, $(testlangs), test-rm-%.$(lang))
29149da0fa4SScott Kruger# List of raw test run targets
29249da0fa4SScott Krugeralltesttargets := $(foreach tp, $(testpkgs), $(foreach lang, $(testlangs), $($(tp).$(lang))))
29349da0fa4SScott Kruger
29449da0fa4SScott Kruger# Run targets
29549da0fa4SScott Kruger$(alltesttargets) : % : $(TESTDIR)/counts/%.counts
29649da0fa4SScott Kruger.PHONY: $(alltesttargets)
29749da0fa4SScott Kruger
29849da0fa4SScott Kruger$(TESTDIR)/counts/%.counts :
29949da0fa4SScott Kruger	$(quiettest) $< $(TESTFLAGS)
30049da0fa4SScott Kruger
30149da0fa4SScott Kruger# Targets to run tests and remove executables, by package-lang pairs.
30249da0fa4SScott Kruger# Run the tests in each batch using recursive invocation of make because
30349da0fa4SScott Kruger# we need all of them to complete before removing the executables.  Make
30449da0fa4SScott Kruger# doesn't guarantee an exploration order for the graph.  Only recursive
30549da0fa4SScott Kruger# if there is something to be done.
30649da0fa4SScott Krugeralltest-rm := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), test-rm-$(pkg).$(lang)))
30749da0fa4SScott Kruger$(alltest-rm) : test-rm-% : test-%
30849da0fa4SScott Krugerifneq ($(NO_RM),1)
30949da0fa4SScott Kruger	$(call quiet,RM) $(addprefix $(TESTDIR)/,$(basename $($(@:test-rm-%=testsrcs-%))))
31049da0fa4SScott Krugerendif
31149da0fa4SScott Kruger
31249da0fa4SScott Kruger# Remove intermediate .o files
31349da0fa4SScott Kruger# This only removes the files at the end which is insufficient
31449da0fa4SScott Kruger#.INTERMEDIATE: $(testsrcs.o:%.o=%)
31549da0fa4SScott Kruger
31649da0fa4SScott Kruger# all sources should get recompiled when petscvariables changes (i.e when configure is rerun or when petscvariables is manually edited.)
31749da0fa4SScott Kruger$(testsrcs.o) : $(petscvariables)
31849da0fa4SScott Kruger
31949da0fa4SScott Kruger%/.DIR :
32049da0fa4SScott Kruger	@mkdir -p $(@D)
32149da0fa4SScott Kruger	@touch $@
32249da0fa4SScott Kruger
32349da0fa4SScott Kruger.PRECIOUS: %/.DIR
32449da0fa4SScott Kruger
32549da0fa4SScott Kruger.SUFFIXES: # Clear .SUFFIXES because we don't use implicit rules
32649da0fa4SScott Kruger.DELETE_ON_ERROR:               # Delete likely-corrupt target file if rule fails
32749da0fa4SScott Kruger
32837ed16bcSStefano Zampini.PHONY: clean cleantest all
32949da0fa4SScott Kruger
33049da0fa4SScott Krugercleantest:
33149da0fa4SScott Kruger	${RM} -r $(TESTDIR) $(generatedtest)
33249da0fa4SScott Kruger
33349da0fa4SScott Krugerclean: cleantest
33449da0fa4SScott Kruger
33549da0fa4SScott Krugeralltest.d := $(testsrcs.o:%.o=%.d)
33649da0fa4SScott Kruger# Tell make that alltest.d are all up to date.  Without this, the include
33749da0fa4SScott Kruger# below has quadratic complexity, taking more than one second for a
33849da0fa4SScott Kruger# do-nothing build of PETSc (much worse for larger projects)
33949da0fa4SScott Kruger$(alltest.d) : ;
34049da0fa4SScott Kruger
34149da0fa4SScott Kruger-include $(alltest.d)
34249da0fa4SScott Kruger
34363cf4119SScott Kruger# Tests can be generated by searching -- see documentation below
344c9625024SScott Krugershowreport=
34585bc9deeSScott Krugerifndef searchin
34685bc9deeSScott Kruger   searchin = " "
34785bc9deeSScott Krugerendif
34885bc9deeSScott Krugerifdef i
34985bc9deeSScott Kruger   searchin = $(i)
35085bc9deeSScott Krugerendif
35158da34e9SJed Brownifdef gs
35258da34e9SJed Brown  gmakesearch = $(gs)
35358da34e9SJed Brownendif
35463cf4119SScott Krugerifdef gmakesearch
355848cfe54SJed Brown  TESTTARGETS := $(filter $(gmakesearch),$(alltesttargets))
35685bc9deeSScott Kruger  ifdef gmakesearchin
35785bc9deeSScott Kruger    TESTTARGETS2 := $(foreach v,$(TESTTARGETS),$(if $(findstring $(gmakesearchin),$(v)),$(v)))
35849da0fa4SScott Kruger    TESTTARGETS := $(TESTTARGETS2)
35949da0fa4SScott Kruger  endif
36085bc9deeSScott Krugerelse ifdef gmakesearchin
36185bc9deeSScott Kruger  TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(gmakesearchin),$(v)),$(v)))
36249da0fa4SScott Krugerelse ifdef argsearch
36349da0fa4SScott Kruger  TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(argsearch),$($(v)_ARGS)),$(v)))
36463cf4119SScott Krugerelse ifdef search
3659ea87190SJacob Faibussowitsch  TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) 'name' '$(search)')
36663cf4119SScott Krugerelse ifdef s
3679ea87190SJacob Faibussowitsch  TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) 'name' '$(s)')
368feeaa4f6SScott Krugerelse ifdef test-fail
369f1f6c4e6SStefano Zampini  TESTTARGETS := $(shell $(TESTDIR)/echofailures.sh)
3706f5e9bd5SScott Krugerelse ifdef query
3719ea87190SJacob Faibussowitsch  TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) '$(query)' '$(queryval)')
37285bc9deeSScott Krugerelse ifdef q
3739ea87190SJacob Faibussowitsch  TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) '$(q)' '$(qv)')
37449da0fa4SScott Krugerelse                            # No filter - run them all, but delete the executables as we go
37549da0fa4SScott Kruger  TESTTARGETS := $(testpkgs)
376f42deef9SScott Kruger  ifneq ($(PRINTONLY),1)
377c9625024SScott Kruger    showreport = "-s"  # Only show full report when all tests are run
378f42deef9SScott Kruger  endif
37949da0fa4SScott Krugerendif
38049da0fa4SScott Kruger
38149da0fa4SScott Kruger.PHONY: report_tests print-test
38249da0fa4SScott Kruger
38349da0fa4SScott Krugerprint-test:
3845b6dee57SScott Kruger	$(info $(TESTTARGETS))
3855b6dee57SScott Kruger	@true
38649da0fa4SScott Kruger
3876e5deea7SScott Krugershow-fail:
388b711b6a4SScott Kruger	-@$(PYTHON) $(CONFIGDIR)/report_tests.py -d $(TESTDIR)/counts -f
389b711b6a4SScott Kruger
3906e5deea7SScott Kruger
3916e5deea7SScott Kruger
392c01c7e64SJed Brown# Don't start running tests until starttime has completed
393c01c7e64SJed Brown$(alltesttargets:%=$(TESTDIR)/counts/%.counts) : starttime
394c01c7e64SJed Brown
395c01c7e64SJed Brown# Ensure that libpetsc (if it is a prerequisite) has been built and clean the counts/logs before starting timer
3967cb68e74SVaclav Haplastarttime: pre-clean $(libpetscall) macos-firewall-register-mpiexec
39727d73d1fSBarry Smith	@$(eval STARTTIME := $(shell date +%s))
39827d73d1fSBarry Smith
39927d73d1fSBarry Smithreport_tests: starttime $(TESTTARGETS)
40032f4009dSScott Kruger	@$(eval ENDTIME := $(shell date +%s))
401c9625024SScott Kruger	-@ elapsed_time=$$(($(ENDTIME)- $(STARTTIME))) && \
402c9625024SScott Kruger	$(PYTHON) $(CONFIGDIR)/report_tests.py -m $(MAKE) -d $(TESTDIR)/counts -t 5 -e $${elapsed_time} $(showreport)
40349da0fa4SScott Kruger
4045e361860SScott Krugercheck_output:
4055e361860SScott Kruger	$(PYTHON) $(CONFIGDIR)/gmakegentest.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --testdir=$(TESTDIR) --check-output
4065e361860SScott Kruger
40749da0fa4SScott Kruger# Do not how how to invoke test from makefile
40849da0fa4SScott KrugerHASGMAKEFILE := $(filter gmakefile,$(MAKEFILE_LIST))
40949da0fa4SScott Krugerifeq ($(HASGMAKEFILE),gmakefile)
41049da0fa4SScott Krugerhelpdeps:=help-make help-targets
41149da0fa4SScott Krugermakefile="gmakefile"
412142b82d2SScott Krugerother_help="To see full test help: make -f gmakefile.test help"
41349da0fa4SScott Krugerelse
41449da0fa4SScott Krugerhelpdeps:=help-make help-targets help-test
41549da0fa4SScott Krugermakefile="gmakefile.test"
416142b82d2SScott Krugerother_help=""
41749da0fa4SScott Krugerendif
41849da0fa4SScott Kruger
41949da0fa4SScott Krugerhelp: ${helpdeps}
42049da0fa4SScott Kruger	-@echo "Above is from: ${helpdeps}"
421142b82d2SScott Kruger	-@echo "${other_help}"
42249da0fa4SScott Kruger
42349da0fa4SScott Krugerhelp-make:
42449da0fa4SScott Kruger	-@echo
42549da0fa4SScott Kruger	-@echo "Basic build usage:"
42649da0fa4SScott Kruger	-@echo "   make -f ${makefile} <options>"
42749da0fa4SScott Kruger	-@echo
42849da0fa4SScott Kruger	-@echo "Options:"
42949da0fa4SScott Kruger	-@echo "  V=0           Very quiet builds"
43049da0fa4SScott Kruger	-@echo "  V=1           Verbose builds"
43149da0fa4SScott Kruger	-@echo
43249da0fa4SScott Kruger
43349da0fa4SScott Krugerhelp-targets:
43449da0fa4SScott Kruger	-@echo "All makefile targets and their dependencies:"
43549da0fa4SScott Kruger	-@grep ^[a-z] ${makefile} | grep : | grep -v =
43649da0fa4SScott Kruger	-@echo
43749da0fa4SScott Kruger	-@echo
43849da0fa4SScott Kruger
43949da0fa4SScott Krugerhelp-test:
44049da0fa4SScott Kruger	-@echo "Basic test usage:"
44149da0fa4SScott Kruger	-@echo "   make -f ${makefile} test <options>"
44249da0fa4SScott Kruger	-@echo
44349da0fa4SScott Kruger	-@echo "Options:"
44485bc9deeSScott Kruger	-@echo "  V=1               Verbose output (-v to scripts)"
44549da0fa4SScott Kruger	-@echo "  NO_RM=1           Do not remove the executables after running"
446f50802fbSScott Kruger	-@echo "  REPLACE=1         Replace the output in PETSC_DIR source tree (-m to test scripts)"
4475e361860SScott Kruger	-@echo "  OUTPUT=1          Show only the errors on stdout"
448f50802fbSScott Kruger	-@echo "  ALT=1             Replace 'alt' output in PETSC_DIR source tree (-M to test scripts)"
44949da0fa4SScott Kruger	-@echo "  DIFF_NUMBERS=1    Diff the numbers in the output (-j to test scripts and petscdiff)"
450baa5c0f4SScott Kruger	-@echo "  CUDAMEMCHECK=1    Execute the tests using cuda-memcheck (-U to test scripts)"
451*636bfc99SJacob Faibussowitsch	-@echo "                    Use PETSC_CUDAMEMCHECK_COMMAND to change the executable to run and"
452*636bfc99SJacob Faibussowitsch	-@echo "                    PETSC_CUDAMEMCHECK_ARGS to change the arguments (note: both"
453*636bfc99SJacob Faibussowitsch	-@echo "                    cuda-memcheck and compute-sanitizer are supported)"
45449da0fa4SScott Kruger	-@echo "  VALGRIND=1        Execute the tests using valgrind (-V to test scripts)"
45585bc9deeSScott Kruger	-@echo "  DEBUG=1           Launch tests in the debugger (-d to the scripts)"
456142b82d2SScott Kruger	-@echo "  NP=<num proc>     Set a number of processors to pass to scripts."
457142b82d2SScott Kruger	-@echo "  FORCE=1           Force SKIP or TODO tests to run"
458a6f3f80dSScott Kruger	-@echo "  PRINTONLY=1       Print the command, but do not run.  For loops print first command"
459142b82d2SScott Kruger	-@echo "  TIMEOUT=<time>    Test timeout limit in seconds (default in config/petsc_harness.sh)"
460f50802fbSScott Kruger	-@echo "  TESTDIR='tests'   Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}"
46149da0fa4SScott Kruger	-@echo "                    or $${PREFIX_DIR}/$${TESTDIR}"
46249da0fa4SScott Kruger	-@echo "                    or $${PREFIX_DIR}/share/petsc/examples/$${TESTDIR})"
4634ff3c6a1SScott Kruger	-@echo "  TESTBASE='tests'   Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}"
46449da0fa4SScott Kruger	-@echo "  OPTIONS='<args>'  Override options to scripts (-a to test scripts)"
46549da0fa4SScott Kruger	-@echo "  EXTRA_OPTIONS='<args>'  Add options to scripts (-e to test scripts)"
46649da0fa4SScott Kruger	-@echo
4670b148140SVaclav Hapla	-@echo "Special options for macOS:"
4680b148140SVaclav 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"
4690b148140SVaclav Hapla	-@echo
47063cf4119SScott Kruger	-@echo "Tests can be generated by searching with multiple methods"
47163cf4119SScott Kruger	-@echo "  For general searching (using config/query_test.py):"
47263cf4119SScott Kruger	-@echo "    make -f ${makefile} test search='sys*ex2*'"
47363cf4119SScott Kruger	-@echo "   or the shortcut using s"
47463cf4119SScott Kruger	-@echo "    make -f ${makefile} test s='sys*ex2*'"
47585bc9deeSScott Kruger	-@echo "  You can also use the full path to a file directory"
47685bc9deeSScott Kruger	-@echo "    make -f ${makefile} test s='src/sys/tests/'"
477feeaa4f6SScott Kruger	-@echo
4786f5e9bd5SScott Kruger	-@echo "  To search for fields from the original test definitions:"
4796f5e9bd5SScott Kruger	-@echo "    make -f ${makefile} test query='requires' queryval='*MPI_PROCESS_SHARED_MEMORY*'"
48085bc9deeSScott Kruger	-@echo "   or the shortcut using q and qv"
48185bc9deeSScott Kruger	-@echo "    make -f ${makefile} test q='requires' qv='*MPI_PROCESS_SHARED_MEMORY*'"
48285bc9deeSScott Kruger	-@echo "  To filter results from other searches, use searchin"
48385bc9deeSScott Kruger	-@echo "    make -f ${makefile} test s='src/sys/tests/' searchin='*options*'"
48463cf4119SScott Kruger	-@echo
48563cf4119SScott Kruger	-@echo "  To re-run the last tests which failed:"
48663cf4119SScott Kruger	-@echo "    make -f ${makefile} test test-fail='1'"
48763cf4119SScott Kruger	-@echo
48849da0fa4SScott Kruger	-@echo "  To see which targets match a given pattern (useful for doing a specific target):"
48963cf4119SScott Kruger	-@echo "    make -f ${makefile} print-test search=sys*"
49049da0fa4SScott Kruger	-@echo
49149da0fa4SScott Kruger	-@echo "  To build an executable, give full path to location:"
492c4762a1bSJed Brown	-@echo '    make -f ${makefile} $${PETSC_ARCH}/tests/sys/tests/ex1'
49349da0fa4SScott Kruger	-@echo "  or make the test with NO_RM=1"
49449da0fa4SScott Kruger	-@echo
495