xref: /petsc/gmakefile.test (revision daba9d70159ea2f6905738fcbec7404635487b2b)
149da0fa4SScott Kruger# -*- mode: makefile-gmake -*-
2fca490e6SSatish Balay-include petscdir.mk
349da0fa4SScott Kruger
4*d52a580bSJunchao 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.cxx .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)))
118d5d1ea2SBarry SmithTESTSRCDIR ?= $(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
2234b254c5SRichard Tran Millspkgs := sys vec mat dm ksp snes ts tao ml
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
38ef93a428SToby Isaac# gmake should turn '-s', '--silent', and '--quiet' into an 's' in the first word of MAKEFLAGS
39ef93a428SToby IsaacMAKEFLAGS_FW=$(firstword $(MAKEFLAGS))
40ef93a428SToby Isaac# ignore first work if it starts with -, because then there are no shortoptions
41ef93a428SToby IsaacMAKEFLAGS_SHORT=$(patsubst -%,,$(MAKEFLAGS_FW))
42ef93a428SToby IsaacMAKEFLAGS_SILENT=$(findstring s,$(MAKEFLAGS_SHORT))
43ef93a428SToby IsaacV ?= $(if $(MAKEFLAGS_SILENT),0)
4449da0fa4SScott Krugerifeq ($(V),)  # Default
4549da0fa4SScott Kruger  quiet_HELP := "Use \"$(MAKE) V=1\" to see verbose compile lines, \"$(MAKE) V=0\" to suppress.\n"
4649da0fa4SScott Kruger  quiet = @printf $(quiet_HELP)$(eval quiet_HELP:=)" %10s %s\n" "$1$2" "$@"; $($1)
4749da0fa4SScott Kruger  quiettest = @printf " %10s %s\n" "TEST" "$(@:$(TESTDIR)/counts/%.counts=%)";
4849da0fa4SScott Krugerelse ifeq ($(V),0)	# Suppress entire command
4949da0fa4SScott Kruger  quiet = @$($1)
5049da0fa4SScott Kruger  quiettest = @
515e361860SScott Kruger  TESTFLAGS += -o err_only
5249da0fa4SScott Krugerelse      # Show the full command line
5349da0fa4SScott Kruger  quiet = $($1)
5449da0fa4SScott Kruger  quiettest =
5549da0fa4SScott Kruger  TESTFLAGS += -v
5649da0fa4SScott Krugerendif
5749da0fa4SScott Kruger
5849da0fa4SScott Krugerifeq ($(FORCE),1)
5949da0fa4SScott Kruger  TESTFLAGS += -f # force test execution
6049da0fa4SScott Krugerendif
61baa5c0f4SScott Krugerifeq ($(CUDAMEMCHECK),1)
6274df5e01SJunchao Zhang  TESTFLAGS += -U # Add CUDA "compute-sanitizer --tool memcheck" option to the flags
63baa5c0f4SScott Krugerendif
6449da0fa4SScott Krugerifeq ($(VALGRIND),1)
65baa5c0f4SScott Kruger  TESTFLAGS += -V # Add valgrind option to the flags
6649da0fa4SScott Krugerendif
6785bc9deeSScott Krugerifeq ($(DEBUG),1)
681199fdcbSBarry Smith  TESTFLAGS += -d  Launch test in debugger
6985bc9deeSScott Krugerendif
7049da0fa4SScott Krugerifeq ($(REPLACE),1)
7149da0fa4SScott Kruger  TESTFLAGS += -m # Replace results by passing -m to petscdiff
7249da0fa4SScott Krugerendif
735e361860SScott Krugerifeq ($(OUTPUT),1)
745e361860SScott Kruger  TESTFLAGS += -o 'err_only' # Show only the errors on stdout
755e361860SScott Krugerendif
76f50802fbSScott Krugerifeq ($(ALT),1)
77f50802fbSScott Kruger  TESTFLAGS += -M # Replace alt files by passing -M to petscdiff
78f50802fbSScott Krugerendif
79e6bdf5b1SSatish BalayPRINTONLY ?= 0
80a6f3f80dSScott Krugerifeq ($(PRINTONLY),1)
81a6f3f80dSScott Kruger  TESTFLAGS += -p  # Pass -p to petscdiff to print only command
82a6f3f80dSScott Krugerendif
8349da0fa4SScott Krugerifeq ($(DIFF_NUMBERS),1)
8449da0fa4SScott Kruger  TESTFLAGS += -j # Pass -j to petscdiff to diff the actual numbers
8549da0fa4SScott Krugerendif
8649da0fa4SScott Krugerifdef OPTIONS
8749da0fa4SScott Kruger  TESTFLAGS += -a '$(OPTIONS)' # override arguments
8849da0fa4SScott Krugerendif
89c1139c55SMatthew Knepleyifdef EXTRA_OPTIONS_INITIAL
90c1139c55SMatthew Knepley  TESTFLAGS += -e '$(EXTRA_OPTIONS_INITIAL)' # add initial arguments
91c1139c55SMatthew Knepleyendif
9249da0fa4SScott Krugerifdef EXTRA_OPTIONS
93c1139c55SMatthew Knepley  TESTFLAGS += -E '$(EXTRA_OPTIONS)' # add final arguments
9449da0fa4SScott Krugerendif
9549da0fa4SScott Krugerifdef NP
9649da0fa4SScott Kruger  TESTFLAGS += -n $(NP) # set number of processes
9749da0fa4SScott Krugerendif
9849da0fa4SScott Kruger# Override the default timeout that may be found at the top of config/petsc_harness.sh
9949da0fa4SScott Kruger# This must be an integer.  It is given in seconds.
10049da0fa4SScott Krugerifdef TIMEOUT
10149da0fa4SScott Kruger  TESTFLAGS += -t $(TIMEOUT) # Override the default timeout
10249da0fa4SScott Krugerendif
10349da0fa4SScott Kruger
104fc46264cSScott Kruger$(generatedtest) : $(petscconf) $(petscvariables) $(CONFIGDIR)/gmakegentest.py $(TESTDIR)/.DIR | $$(@D)/.DIR
1058d5d1ea2SBarry Smith	$(PYTHON) $(CONFIGDIR)/gmakegentest.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --testdir=$(TESTDIR) --srcdir $(TESTSRCDIR) --pkg-pkgs "$(pkgs)"
10649da0fa4SScott Kruger
107bcd4bb4aSBarry Smithifneq ($(filter-out help docs clean distclean check info gmakeinfo libs all install install-lib checkbadSource checkbadFileChange deletefortranbindings fortranbindings alletags etags clangformat checkclangformat fprettify lint shellcheck checkshellcheck get% %build,$(MAKECMDGOALS:clean%=clean)),)
108336d78f1SSatish Balayinclude $(generatedtest)
109535b694aSJed Brownendif
11049da0fa4SScott Kruger
11149da0fa4SScott Krugerifeq ($(PETSC_LANGUAGE),CXXONLY)
11249da0fa4SScott Kruger  cc_name := CXX
11349da0fa4SScott Krugerelse
11449da0fa4SScott Kruger  cc_name := CC
11549da0fa4SScott Krugerendif
11649da0fa4SScott Kruger
1173761b06dSJed BrownPETSC_COMPILE.c = $(call quiet,$(cc_name)) -c $(PCC_FLAGS) $($(CLANGUAGE)FLAGS) $(CCPPFLAGS) $(C_DEPFLAGS)
1180b119762SSatish BalayPETSC_COMPILE.cxx = $(call quiet,CXX) -c $(CXX_FLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(CXX_DEPFLAGS)
119de364511SSatish BalayPETSC_COMPILE.cu = $(call quiet,CUDAC) -c $(MPICXX_INCLUDES) $(CUDAC_FLAGS) $(CUDAPP_FLAGS) $(CUDAFLAGS) $(CUDA_HOSTFLAGS)
120*d52a580bSJunchao ZhangPETSC_COMPILE.hip.cxx = $(call quiet,HIPC) -c $(MPICXX_INCLUDES) $(HIPC_FLAGS) $(HIPPP_FLAGS) $(HIPFLAGS) $(HIPPPFLAGS) $(HIPOPTFLAGS) $(HIPC_DEPFLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(HIP_DEPFLAGS)
12150dcbc5aSJunchao ZhangPETSC_COMPILE.sycl.cxx = $(call quiet,SYCLC) -c $(MPICXX_INCLUDES) $(SYCLC_FLAGS) $(SYCLPP_FLAGS) $(SYCLFLAGS) $(SYCLPPFLAGS) $(SYCLOPTFLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(SYCL_DEPFLAGS)
1228a4d847aSStefano ZampiniPETSC_GENDEPS.cu = ${CUDA_PETSC_GENDEPS}
12349da0fa4SScott KrugerPETSC_COMPILE.F = $(call quiet,FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS)
12449da0fa4SScott Kruger
125600dc890SJunchao Zhangifneq ($(KOKKOS_USE_CUDA_COMPILER),)
126600dc890SJunchao Zhang  # Kokkos requires nvcc to be in PATH and the C++ compiler to be given in an environmental variable
127257f855aSJunchao Zhang  KOKC = PATH=`dirname $(CUDAC)`:$(PATH) NVCC_WRAPPER_DEFAULT_COMPILER="$(CUDA_CXX)" $(KOKKOS_BIN)/nvcc_wrapper --expt-extended-lambda --expt-relaxed-constexpr
12855bc12c6SJunchao Zhang  KOKKOS_COMPILE = $(call quiet,KOKC) -c $(CUDAC_FLAGS) ${PETSC_CXXCPPFLAGS} $(CUDACPPFLAGS) $(CUDA_CXXFLAGS) $(MPICXX_INCLUDES)
1298a4d847aSStefano Zampinielse ifneq ($(KOKKOS_USE_CUDACLANG_COMPILER),)
1308a4d847aSStefano Zampini  KOKKOS_COMPILE = $(PETSC_COMPILE.cu)
131600dc890SJunchao Zhangelse ifneq ($(KOKKOS_USE_HIP_COMPILER),)
132*d52a580bSJunchao Zhang  KOKKOS_COMPILE = $(PETSC_COMPILE.hip.cxx)
13350dcbc5aSJunchao Zhangelse ifneq ($(KOKKOS_USE_SYCL_COMPILER),)
13455bc12c6SJunchao Zhang  KOKKOS_COMPILE = $(PETSC_COMPILE.sycl.cxx)
135600dc890SJunchao Zhangelse
13655bc12c6SJunchao Zhang  KOKKOS_COMPILE = $(PETSC_COMPILE.cxx)
137600dc890SJunchao Zhangendif
13855bc12c6SJunchao Zhang# https://github.com/kokkos/kokkos/pull/5473 used a C++17 feature, inline static variables.
13955bc12c6SJunchao Zhang# We found -fvisibility=hidden could hide these variables such that the supposed globally unique
14055bc12c6SJunchao Zhang# variables become local to each file including them and thus have multiple copies (see an example
14155bc12c6SJunchao Zhang# at the end of PR5473). It might be a gcc bug thus we also filed at https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107535
14255bc12c6SJunchao Zhang# See also an older bug report related to visibility, https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59693
14355bc12c6SJunchao Zhang#
14455bc12c6SJunchao Zhang# Our workaround here is to git rid of -fvisibility=hidden from Kokkos compiler options, so that petsc
14555bc12c6SJunchao Zhang# files including Kokkos headers won't be affected by this flag.
14655bc12c6SJunchao Zhang#
14755bc12c6SJunchao Zhang# The solution is not ideal in the sense we have to duplicate the same workaround to any external libraries
14855bc12c6SJunchao Zhang# using C++17 inline static variables. We have to wait for GNU to clarify this issue.
1496a1fbadbSJacob FaibussowitschPETSC_COMPILE.kokkos.cxx = $(filter-out -fvisibility=hidden,$(subst -Xcompiler -fvisibility=hidden ,,$(strip $(KOKKOS_COMPILE))))
15081a145c3SJunchao ZhangKOKKOS_LINKER = $(filter-out -fvisibility=hidden,$(subst -Xcompiler -fvisibility=hidden ,,$(strip $(CLINKER))))
151600dc890SJunchao Zhang
152d23021a0SBarry Smithifneq ($(RAJA_USE_CUDA_COMPILER),)
153f09347e2SJunchao Zhang  PETSC_COMPILE.raja.cxx = ${CUDAC} $(MPICXX_INCLUDES) ${CUDAC_FLAGS} -x cu -Xcudafe "--display_error_number" -c --compiler-options="${PETSC_CXXCPPFLAGS} ${PETSC_CC_INCLUDES} ${CUDA_CXXFLAGS}" --expt-extended-lambda --expt-relaxed-constexpr
154d23021a0SBarry Smithelse
155d23021a0SBarry Smith  PETSC_COMPILE.raja.cxx = ${CXX} -o $*.o -c ${CXX_FLAGS} ${CXXFLAGS} ${CXXCPPFLAGS}
156d23021a0SBarry Smithendif
157d23021a0SBarry Smith
158*d52a580bSJunchao Zhangtestlangs := c cu cxx F F90 kokkos.cxx hip.cxx sycl.cxx raja.cxx
159513d7a9cSJed Brown$(foreach lang, $(testlangs), $(eval\
160513d7a9cSJed Brown  testexe.$(lang) = $(foreach pkg, $(pkgs), $(testsrcs-$(pkg).$(lang):%.$(lang)=$(TESTDIR)/%))))
16149da0fa4SScott Krugerconcattestlang = $(foreach lang, $(2), $(testsrcs-$(1).$(lang):%.$(lang)=$(TESTDIR)/%.o))
16249da0fa4SScott Krugertestsrcs.o := $(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),$(testlangs)))
163fc46264cSScott Krugertestsrcs-rel := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), $(testsrcs-$(pkg).$(lang))))
164fc46264cSScott Krugertestsrcs := $(foreach sfile, $(testsrcs-rel), $(TESTSRCDIR)/$(sfile))
16549da0fa4SScott Kruger
16606fe1a63SSatish Balay# workaround win32fe failure
1677d7394c2SSatish Balayifneq (,$(findstring win32fe,$(call quiet,$(cc_name))))
16806fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex6: | $(TESTDIR)/ts/tutorials/multirate/ex5
16906fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex8: | $(TESTDIR)/ts/tutorials/multirate/ex6
17006fe1a63SSatish Balayendif
17106fe1a63SSatish Balay
17249da0fa4SScott Kruger# Refresh testfiles when sources change, but don't balk if the source file is nonexistent (deleted)
17349da0fa4SScott Kruger$(generatedtest) : $(testsrcs)
17449da0fa4SScott Kruger$(testsrcs) :
17549da0fa4SScott Kruger
1764ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.c | $$(@D)/.DIR
17749da0fa4SScott Kruger	$(PETSC_COMPILE.c) $(abspath $<) -o $@
17849da0fa4SScott Kruger
179c0558f20SBarry Smith$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.kokkos.cxx | $$(@D)/.DIR
180c0558f20SBarry Smith	$(PETSC_COMPILE.kokkos.cxx) $(abspath $<) -o $@
181c0558f20SBarry Smith
18250dcbc5aSJunchao Zhang$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.sycl.cxx | $$(@D)/.DIR
18350dcbc5aSJunchao Zhang	$(PETSC_COMPILE.sycl.cxx) $(abspath $<) -o $@
18450dcbc5aSJunchao Zhang
185d23021a0SBarry Smith$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.raja.cxx | $$(@D)/.DIR
186d23021a0SBarry Smith	$(PETSC_COMPILE.raja.cxx) $(abspath $<) -o $@
187d23021a0SBarry Smith
1884ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cxx | $$(@D)/.DIR
18949da0fa4SScott Kruger	$(PETSC_COMPILE.cxx) $(abspath $<) -o $@
19049da0fa4SScott Kruger
1914ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cu | $$(@D)/.DIR
19249da0fa4SScott Kruger	$(PETSC_COMPILE.cu) $(abspath $<) -o $@ # Compile first so that if there is an error, it comes from a normal compile
19349da0fa4SScott Kruger	@$(PETSC_GENDEPS.cu) $(abspath $<) -o $(@:%.o=%.d) # Generate the dependencies for later
19449da0fa4SScott Kruger
195*d52a580bSJunchao Zhang$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.hip.cxx | $$(@D)/.DIR
196*d52a580bSJunchao Zhang	$(PETSC_COMPILE.hip.cxx) $(abspath $<) -o $@
1971a5aed34SJunchao Zhang
198a55d2495SJed Brown# Test modules go in the same directory as the target *.o
199a55d2495SJed BrownTESTMODDIR = $(@D)
20049da0fa4SScott KrugerFCMOD = cd
2014ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F | $$(@D)/.DIR
20249da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),)
203a55d2495SJed Brown	$(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@)
20449da0fa4SScott Krugerelse
205a55d2495SJed Brown	$(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR)
20649da0fa4SScott Krugerendif
2070266c241SJed Brown	-@$(GFORTRAN_DEP_CLEANUP)
20849da0fa4SScott Kruger
2094ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F90 | $$(@D)/.DIR
21049da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),)
211a55d2495SJed Brown	$(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@)
21249da0fa4SScott Krugerelse
213a55d2495SJed Brown	$(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR)
21449da0fa4SScott Krugerendif
2150266c241SJed Brown	-@$(GFORTRAN_DEP_CLEANUP)
2160266c241SJed Brown
217cf7d3547SScott Kruger#   This is a hack to fix a broken gfortran.
2180266c241SJed Browndefine GFORTRAN_DEP_CLEANUP
219ef0d7cd8SPierre Jolivet  if test -e "$(@:%.o=%.d)" && head -1 "$(@:%.o=%.d)" | grep -F -q -v : ; then\
2204f45eea9SScott Kruger    echo "$(@): \\" > $(@:%.o=%.dtemp) ;\
2210266c241SJed Brown    tr '\n' '@' < $(@:%.o=%.d) | cut -d: -f2- | tr '@' '\n' >> $(@:%.o=%.dtemp) ;\
2220266c241SJed Brown    mv $(@:%.o=%.dtemp) $(@:%.o=%.d);\
2234f45eea9SScott Kruger  fi
2240266c241SJed Brownendef
22549da0fa4SScott Kruger
22620844ca6SSatish Balay# link line constructed differently for gmakefile vs gmakefile.test invocation
22720844ca6SSatish Balayifeq ($(libpetscall),)
22820844ca6SSatish BalayPETSC_TEST_LIB = $(PETSC_LIB)
22920844ca6SSatish Balayelse
2308020a2f4SSatish BalayPETSC_TEST_LIB = $(C_SH_LIB_PATH) $(PETSC_EXTERNAL_LIB_BASIC)
23120844ca6SSatish Balayendif
23220844ca6SSatish Balay
23315229ffcSPierre Jolivet# manually list some library dependencies to check for circular dependencies
234c4762a1bSJed Brown$(TESTDIR)/sys/tests/ex9: PETSC_TEST_LIB = $(PETSC_SYS_LIB)
235c4762a1bSJed Brown$(TESTDIR)/vec/vec/tests/ex1: PETSC_TEST_LIB = $(PETSC_VEC_LIB)
236c4762a1bSJed Brown$(TESTDIR)/mat/tests/ex1: PETSC_TEST_LIB = $(PETSC_MAT_LIB)
237c4762a1bSJed Brown$(TESTDIR)/dm/tests/ex1: PETSC_TEST_LIB = $(PETSC_DM_LIB)
238c4762a1bSJed Brown$(TESTDIR)/ksp/ksp/tests/ex1: PETSC_TEST_LIB = $(PETSC_KSP_LIB)
239c4762a1bSJed Brown$(TESTDIR)/snes/tests/ex1: PETSC_TEST_LIB = $(PETSC_SNES_LIB)
240c4762a1bSJed Brown$(TESTDIR)/ts/tests/ex2: PETSC_TEST_LIB = $(PETSC_TS_LIB)
241c4762a1bSJed Brown$(TESTDIR)/tao/tutorials/ex1: PETSC_TEST_LIB = $(PETSC_TAO_LIB)
242bde159b7SSatish Balay
2437cb68e74SVaclav Hapla# MACOS FIREWALL HANDLING
2447cb68e74SVaclav Hapla# - if run with MACOS_FIREWALL=1
2457cb68e74SVaclav Hapla#   (automatically set in $PETSC_ARCH/lib/petsc/conf/petscvariables if configured --with-macos-firewall-rules),
2467cb68e74SVaclav Hapla#   ensure mpiexec and test executable is on firewall list
2477cb68e74SVaclav Hapla#
2480b148140SVaclav Haplaifeq ($(MACOS_FIREWALL),1)
2490b148140SVaclav HaplaFW := /usr/libexec/ApplicationFirewall/socketfilterfw
2507cb68e74SVaclav Hapla# There is no reliable realpath command in macOS without need for 3rd party tools like homebrew coreutils
2517cb68e74SVaclav Hapla# Using Python's realpath seems like the most robust way here
2527cb68e74SVaclav Haplarealpath-py = $(shell $(PYTHON) -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' $(1))
2537cb68e74SVaclav Hapla#
2541dcdb15bSVaclav Hapladefine macos-firewall-register
2557cb68e74SVaclav Hapla  @APP=$(call realpath-py, $(1));\
2561855f086SVaclav Hapla    if ! sudo -n true 2>/dev/null; then printf "Asking for sudo password to add new firewall rule for\n $$APP\n"; fi;\
2577cb68e74SVaclav Hapla    sudo $(FW) --remove $$APP --add $$APP --blockapp $$APP
2581dcdb15bSVaclav Haplaendef
2590b148140SVaclav Haplaendif
2607cb68e74SVaclav Hapla#
2617cb68e74SVaclav Haplamacos-firewall-register-mpiexec:
262961fb248SStefano Zampini	-$(call macos-firewall-register, $(MPIEXEC))
2631dcdb15bSVaclav Hapla
26449da0fa4SScott Kruger# Test executables
265513d7a9cSJed Brown$(testexe.F) $(testexe.F90) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
26620844ca6SSatish Balay	$(call quiet,FLINKER) -o $@ $^ $(PETSC_TEST_LIB)
2677cb68e74SVaclav Hapla	-$(call macos-firewall-register,$@)
26849da0fa4SScott Kruger
269accbd18bSBarry Smithifneq (,$(findstring emcc,$(CC)))
270accbd18bSBarry Smith$(testexe.c) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
271accbd18bSBarry Smith	-@$(call quiet,CLINKER) -s MAIN_MODULE -s ASSERTIONS=2 -s SAFE_HEAP=1 -s STACK_OVERFLOW_CHECK=1 -s ALLOW_MEMORY_GROWTH $(EXEFLAGS) -o $@.js $@.o $(PETSC_LIB)
272accbd18bSBarry Smith	-@printf '#!/usr/bin/env sh\nnode --redirect-warnings=/dev/null $$0.js $$* | grep -v "Heap resize call from"' > $@
273accbd18bSBarry Smith	-@chmod u+x $@
274accbd18bSBarry Smithelse
275513d7a9cSJed Brown$(testexe.c) $(testexe.cu) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
2761c6715b8SMatthew G. Knepley	$(call quiet,CLINKER) $(EXEFLAGS) -o $@ $^ $(PETSC_TEST_LIB)
2777cb68e74SVaclav Hapla	-$(call macos-firewall-register,$@)
27849da0fa4SScott Kruger
279accbd18bSBarry Smithendif
280accbd18bSBarry Smith
281*d52a580bSJunchao Zhang$(testexe.hip.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
2821a5aed34SJunchao Zhang	$(call quiet,CLINKER) -o $@ $^ $(PETSC_TEST_LIB)
2831a5aed34SJunchao Zhang	-$(call macos-firewall-register,$@)
2841a5aed34SJunchao Zhang
285c0558f20SBarry Smith$(testexe.kokkos.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
28681a145c3SJunchao Zhang	$(call quiet,KOKKOS_LINKER) $(EXEFLAGS) -o $@ $^ $(PETSC_TEST_LIB)
2877cb68e74SVaclav Hapla	-$(call macos-firewall-register,$@)
288c0558f20SBarry Smith
289d23021a0SBarry Smith$(testexe.raja.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
290d23021a0SBarry Smith	$(call quiet,CLINKER) -o $@ $^ $(PETSC_TEST_LIB)
291d23021a0SBarry Smith	-$(call macos-firewall-register,$@)
292d23021a0SBarry Smith
293513d7a9cSJed Brown$(testexe.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
2942f4326f3SSatish Balay	$(call quiet,CXXLINKER) -o $@ $^ $(PETSC_TEST_LIB)
2957cb68e74SVaclav Hapla	-$(call macos-firewall-register,$@)
296513d7a9cSJed Brown
29749da0fa4SScott Kruger# Fortran source files need petsc*.mod, which isn't explicitly managed in the makefile.
29849da0fa4SScott Kruger$(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),F F90)) : $(libpetscall)
29949da0fa4SScott Kruger
30049da0fa4SScott Kruger# Testing convenience targets
301c173c275SScott Kruger.PHONY: test pre-clean
302c173c275SScott Kruger
3030e2a8ab2SBarry Smith# The Fortran compiler may use out-dated module files in the tutorial and test directories so delete them all
3040e2a8ab2SBarry Smithremove-test-mod-files:
3050e2a8ab2SBarry Smith	-@find src -name "*.mod" -not -path "src/binding/*" -delete
3060e2a8ab2SBarry Smith
3070e2a8ab2SBarry Smithtest: remove-test-mod-files report_tests
308c173c275SScott Kruger
30949da0fa4SScott Krugerpre-clean:
3105e361860SScott Kruger	@$(RM) -rf $(TESTDIR)/counts $(TESTLOGTAPFILE) $(TESTLOGERRFILE)
3115e361860SScott Kruger	@touch $(TESTLOGTAPFILE) $(TESTLOGERRFILE)
31227d73d1fSBarry Smith	@echo "Using MAKEFLAGS:" ${MAKEFLAGS}
31349da0fa4SScott Kruger
3144d9d3ee5SSatish Balaycheck-test-errors:
3155e361860SScott Kruger	@grep '^not ok' $(TESTLOGTAPFILE) | grep -v 'Exceeded timeout' | tee $(TESTDIR)/allgtests-tap-err.log
3164d9d3ee5SSatish Balay	@test ! -s $(TESTDIR)/allgtests-tap-err.log
3174d9d3ee5SSatish Balay
31849da0fa4SScott Kruger.PHONY: $(foreach pkg, $(pkgs), test-$(pkg) $(foreach lang, $(testlangs), test-$(pkg).$(lang) test-rm-$(pkg).$(lang)))
31949da0fa4SScott Krugertestpkgs := $(foreach pkg, $(pkgs), test-$(pkg))
32049da0fa4SScott Kruger# Targets to run tests in test-$pkg.$lang and delete the executables, language by language
32149da0fa4SScott Kruger$(testpkgs) : test-% : $(foreach lang, $(testlangs), test-rm-%.$(lang))
32249da0fa4SScott Kruger# List of raw test run targets
32349da0fa4SScott Krugeralltesttargets := $(foreach tp, $(testpkgs), $(foreach lang, $(testlangs), $($(tp).$(lang))))
32449da0fa4SScott Kruger
32549da0fa4SScott Kruger# Run targets
32649da0fa4SScott Kruger$(alltesttargets) : % : $(TESTDIR)/counts/%.counts
32749da0fa4SScott Kruger.PHONY: $(alltesttargets)
32849da0fa4SScott Kruger
32949da0fa4SScott Kruger$(TESTDIR)/counts/%.counts :
33049da0fa4SScott Kruger	$(quiettest) $< $(TESTFLAGS)
33149da0fa4SScott Kruger
33249da0fa4SScott Kruger# Targets to run tests and remove executables, by package-lang pairs.
33349da0fa4SScott Kruger# Run the tests in each batch using recursive invocation of make because
33449da0fa4SScott Kruger# we need all of them to complete before removing the executables. Make
33549da0fa4SScott Kruger# doesn't guarantee an exploration order for the graph. Only recursive
33649da0fa4SScott Kruger# if there is something to be done.
33749da0fa4SScott Krugeralltest-rm := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), test-rm-$(pkg).$(lang)))
33849da0fa4SScott Kruger$(alltest-rm) : test-rm-% : test-%
33949da0fa4SScott Krugerifneq ($(NO_RM),1)
34049da0fa4SScott Kruger	$(call quiet,RM) $(addprefix $(TESTDIR)/,$(basename $($(@:test-rm-%=testsrcs-%))))
34149da0fa4SScott Krugerendif
34249da0fa4SScott Kruger
34349da0fa4SScott Kruger# Remove intermediate .o files
34449da0fa4SScott Kruger# This only removes the files at the end which is insufficient
34549da0fa4SScott Kruger#.INTERMEDIATE: $(testsrcs.o:%.o=%)
34649da0fa4SScott Kruger
34749da0fa4SScott Kruger# all sources should get recompiled when petscvariables changes (i.e when configure is rerun or when petscvariables is manually edited.)
34849da0fa4SScott Kruger$(testsrcs.o) : $(petscvariables)
34949da0fa4SScott Kruger
35049da0fa4SScott Kruger%/.DIR :
35149da0fa4SScott Kruger	@mkdir -p $(@D)
35249da0fa4SScott Kruger	@touch $@
35349da0fa4SScott Kruger
35449da0fa4SScott Kruger.PRECIOUS: %/.DIR
35549da0fa4SScott Kruger
35649da0fa4SScott Kruger.SUFFIXES: # Clear .SUFFIXES because we don't use implicit rules
35749da0fa4SScott Kruger.DELETE_ON_ERROR: # Delete likely-corrupt target file if rule fails
35849da0fa4SScott Kruger
35937ed16bcSStefano Zampini.PHONY: clean cleantest all
36049da0fa4SScott Kruger
36149da0fa4SScott Krugercleantest:
36249da0fa4SScott Kruger	${RM} -r $(TESTDIR) $(generatedtest)
36349da0fa4SScott Kruger
36449da0fa4SScott Krugerclean: cleantest
36549da0fa4SScott Kruger
36649da0fa4SScott Krugeralltest.d := $(testsrcs.o:%.o=%.d)
36749da0fa4SScott Kruger# Tell make that alltest.d are all up to date. Without this, the include
36849da0fa4SScott Kruger# below has quadratic complexity, taking more than one second for a
36949da0fa4SScott Kruger# do-nothing build of PETSc (much worse for larger projects)
37049da0fa4SScott Kruger$(alltest.d) : ;
37149da0fa4SScott Kruger
37249da0fa4SScott Kruger-include $(alltest.d)
37349da0fa4SScott Kruger
37463cf4119SScott Kruger# Tests can be generated by searching -- see documentation below
375c9625024SScott Krugershowreport=
37685bc9deeSScott Krugerifndef searchin
37785bc9deeSScott Kruger   searchin = " "
37885bc9deeSScott Krugerendif
37985bc9deeSScott Krugerifdef i
38085bc9deeSScott Kruger   searchin = $(i)
38185bc9deeSScott Krugerendif
38258da34e9SJed Brownifdef gs
38358da34e9SJed Brown  gmakesearch = $(gs)
38458da34e9SJed Brownendif
38563cf4119SScott Krugerifdef gmakesearch
386848cfe54SJed Brown  TESTTARGETS := $(filter $(gmakesearch),$(alltesttargets))
38785bc9deeSScott Kruger  ifdef gmakesearchin
38885bc9deeSScott Kruger    TESTTARGETS2 := $(foreach v,$(TESTTARGETS),$(if $(findstring $(gmakesearchin),$(v)),$(v)))
38949da0fa4SScott Kruger    TESTTARGETS := $(TESTTARGETS2)
39049da0fa4SScott Kruger  endif
39185bc9deeSScott Krugerelse ifdef gmakesearchin
39285bc9deeSScott Kruger  TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(gmakesearchin),$(v)),$(v)))
39349da0fa4SScott Krugerelse ifdef argsearch
39449da0fa4SScott Kruger  TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(argsearch),$($(v)_ARGS)),$(v)))
39563cf4119SScott Krugerelse ifdef search
3969ea87190SJacob Faibussowitsch  TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) 'name' '$(search)')
39763cf4119SScott Krugerelse ifdef s
3989ea87190SJacob Faibussowitsch  TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) 'name' '$(s)')
399feeaa4f6SScott Krugerelse ifdef test-fail
400f1f6c4e6SStefano Zampini  TESTTARGETS := $(shell $(TESTDIR)/echofailures.sh)
4016f5e9bd5SScott Krugerelse ifdef query
4029ea87190SJacob Faibussowitsch  TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) '$(query)' '$(queryval)')
40385bc9deeSScott Krugerelse ifdef q
4049ea87190SJacob Faibussowitsch  TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) '$(q)' '$(qv)')
40549da0fa4SScott Krugerelse # No filter - run them all, but delete the executables as we go
40649da0fa4SScott Kruger  TESTTARGETS := $(testpkgs)
407f42deef9SScott Kruger  ifneq ($(PRINTONLY),1)
408c9625024SScott Kruger    showreport = "-s" # Only show full report when all tests are run
409f42deef9SScott Kruger  endif
41049da0fa4SScott Krugerendif
41149da0fa4SScott Kruger
41249da0fa4SScott Kruger.PHONY: report_tests print-test
41349da0fa4SScott Kruger
41449da0fa4SScott Krugerprint-test:
4155b6dee57SScott Kruger	$(info $(TESTTARGETS))
4165b6dee57SScott Kruger	@true
41749da0fa4SScott Kruger
4186e5deea7SScott Krugershow-fail:
419b711b6a4SScott Kruger	-@$(PYTHON) $(CONFIGDIR)/report_tests.py -d $(TESTDIR)/counts -f
4206e5deea7SScott Kruger
421c01c7e64SJed Brown# Don't start running tests until starttime has completed
422c01c7e64SJed Brown$(alltesttargets:%=$(TESTDIR)/counts/%.counts) : starttime
423c01c7e64SJed Brown
424c01c7e64SJed Brown# Ensure that libpetsc (if it is a prerequisite) has been built and clean the counts/logs before starting timer
4257cb68e74SVaclav Haplastarttime: pre-clean $(libpetscall) macos-firewall-register-mpiexec
42627d73d1fSBarry Smith	@$(eval STARTTIME := $(shell date +%s))
42727d73d1fSBarry Smith
42827d73d1fSBarry Smithreport_tests: starttime $(TESTTARGETS)
42932f4009dSScott Kruger	@$(eval ENDTIME := $(shell date +%s))
430c9625024SScott Kruger	-@ elapsed_time=$$(($(ENDTIME)- $(STARTTIME))) &&\
431c9625024SScott Kruger	$(PYTHON) $(CONFIGDIR)/report_tests.py -m $(MAKE) -d $(TESTDIR)/counts -t 5 -e $${elapsed_time} $(showreport)
43249da0fa4SScott Kruger
4335e361860SScott Krugercheck_output:
4348d5d1ea2SBarry Smith	$(PYTHON) $(CONFIGDIR)/gmakegentest.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --testdir=$(TESTDIR) --srcdir $(TESTSRCDIR) --pkg-pkgs "$(pkgs)" --check-output
4355e361860SScott Kruger
43640a841f6SBarry Smith# If users make is a gnumake then these messages are provided even if the user does not do make -f gmakefile.test
43749da0fa4SScott KrugerHASGMAKEFILE := $(filter gmakefile,$(MAKEFILE_LIST))
43849da0fa4SScott Krugerifeq ($(HASGMAKEFILE),gmakefile)
43940a841f6SBarry Smithhelpdeps:= help-nontest
44049da0fa4SScott Krugerelse
44140a841f6SBarry Smithhelpdeps:= help-test
44249da0fa4SScott Krugerendif
44349da0fa4SScott Kruger
44440a841f6SBarry Smithhelp: help-make ${helpdeps}
44540a841f6SBarry Smith	-@echo ""
44649da0fa4SScott Kruger
44749da0fa4SScott Krugerhelp-make:
44849da0fa4SScott Kruger	-@echo
44986a7890dSBarry Smith	-@echo "PETSc makefile Basic usage:"
450fff3f5faSBarry Smith	-@echo "  ${OMAKE} rule <V=1 for verbose output> <other options>"
45149da0fa4SScott Kruger	-@echo
45249da0fa4SScott Kruger
45340a841f6SBarry Smithhelp-nontest:
45440a841f6SBarry Smith	-@echo "Available rules:"
45540a841f6SBarry Smith	-@echo "   all - build (update) the PETSc and related libraries in parallel"
45640a841f6SBarry Smith	-@echo "   libs - build (update) the PETSc and related libraries"
45740a841f6SBarry Smith	-@echo "   check - run a basic check that the libraries are built correctly and can be used"
45840a841f6SBarry Smith	-@echo "   "
459fb8b7a66SBarry Smith	-@echo "   getversion - print the PETSc version, or $PETSC_DIR/lib/petsc/bin/petscversion"
46091746516SBarry Smith	-@echo "   getmpiexec - print the mpiexec to use to run PETSc programs"
46140a841f6SBarry Smith	-@echo "   getlinklibs - print the libraries that a PETSc application must link against"
46240a841f6SBarry Smith	-@echo "   getincludedirs - print the include directories that a PETSc application must be compiled against"
46340a841f6SBarry Smith	-@echo "   getcflags - print the C compiler flags PETSc is using"
46440a841f6SBarry Smith	-@echo "   getcxxflags - print the C++ compiler flags PETSc is using"
46540a841f6SBarry Smith	-@echo "   getfortranflags - print the Fortran compiler flags PETSc is using"
46640a841f6SBarry Smith	-@echo "   "
467ea34bbbbSJose E. Roman	-@echo "   petsc4pytest - run the entire petsc4py test suite"
46840a841f6SBarry Smith	-@echo "   alltests - run the entire PETSc test suite"
4694c512586SBarry Smith	-@echo "   test - use \"make help-test\" for help on running the extensive tests"
47049da0fa4SScott Kruger	-@echo
47140a841f6SBarry Smith	-@echo "Developer rules:"
4724c512586SBarry Smith	-@echo "   docs - build all the PETSc documentation locally as a website"
47393583aefSBarry Smith	-@echo "   clean - delete libraries and Fortran module files (used in $PETSC_DIR)"
474145b44c9SPierre Jolivet	-@echo "           delete compiled examples, .o and related files (used in tutorials or test directories)"
47540a841f6SBarry Smith	-@echo "   clangformat - run clangformat on the PETSc C/C++ source code"
4764015d3b1SBarry Smith	-@echo "   clang-tidy - run clang-tidy on the PETSc C code"
477ce78bad3SBarry Smith	-@echo "   fortranbindings - regenerate Fortran stubs/interface definitions, needed after git pulls or source code changes"
478ce78bad3SBarry Smith	-@echo "   deletefortranbindings - delete the generated Fortran stubs/interface definitions"
47940a841f6SBarry Smith	-@echo "   checkbadSource - check the source code for violations of coding standards"
48040a841f6SBarry Smith	-@echo "   abitest - Compare ABI/API of two versions of PETSc library with the old one defined by PETSC_{DIR,ARCH}_ABI_OLD"
48140a841f6SBarry Smith	-@echo "   reconfigure - delete libraries and Fortran module files and run the previously run configure again"
48286a7890dSBarry Smith	-@echo "   lint - run lint on the source code, including its embedded documentation"
483fff3f5faSBarry Smith	-@echo "     Run \"${OMAKE} help-lint\" for lint options"
48486a7890dSBarry Smith	-@echo "   "
48586a7890dSBarry Smith	-@echo "Building website: (run in the doc directory)"
48686a7890dSBarry Smith	-@cd doc; ${OMAKE} help
48740a841f6SBarry Smith	-@echo "   "
48849da0fa4SScott Kruger
48949da0fa4SScott Krugerhelp-test:
49040a841f6SBarry Smith	-@echo "Test usage:"
491fff3f5faSBarry Smith	-@echo "   ${OMAKE} test <options>"
49249da0fa4SScott Kruger	-@echo
49349da0fa4SScott Kruger	-@echo "Options:"
49449da0fa4SScott Kruger	-@echo "  NO_RM=1           Do not remove the executables after running"
495f50802fbSScott Kruger	-@echo "  REPLACE=1         Replace the output in PETSC_DIR source tree (-m to test scripts)"
4965e361860SScott Kruger	-@echo "  OUTPUT=1          Show only the errors on stdout"
497f50802fbSScott Kruger	-@echo "  ALT=1             Replace 'alt' output in PETSC_DIR source tree (-M to test scripts)"
49849da0fa4SScott Kruger	-@echo "  DIFF_NUMBERS=1    Diff the numbers in the output (-j to test scripts and petscdiff)"
49974df5e01SJunchao Zhang	-@echo "  CUDAMEMCHECK=1    Execute the tests using CUDA 'compute-sanitizer --tool memcheck' (-U to test scripts)"
500636bfc99SJacob Faibussowitsch	-@echo "                    Use PETSC_CUDAMEMCHECK_COMMAND to change the executable to run and"
501636bfc99SJacob Faibussowitsch	-@echo "                    PETSC_CUDAMEMCHECK_ARGS to change the arguments (note: both"
502636bfc99SJacob Faibussowitsch	-@echo "                    cuda-memcheck and compute-sanitizer are supported)"
50349da0fa4SScott Kruger	-@echo "  VALGRIND=1        Execute the tests using valgrind (-V to test scripts)"
50485bc9deeSScott Kruger	-@echo "  DEBUG=1           Launch tests in the debugger (-d to the scripts)"
505142b82d2SScott Kruger	-@echo "  NP=<num proc>     Set a number of processors to pass to scripts."
506142b82d2SScott Kruger	-@echo "  FORCE=1           Force SKIP or TODO tests to run"
507dbd7ba57SBarry Smith	-@echo "  PRINTONLY=1       Compile the tests but do not run, print the command to run. For loops print first command"
508142b82d2SScott Kruger	-@echo "  TIMEOUT=<time>    Test timeout limit in seconds (default in config/petsc_harness.sh)"
509f50802fbSScott Kruger	-@echo "  TESTDIR='tests'   Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}"
51049da0fa4SScott Kruger	-@echo "                    or $${PREFIX_DIR}/$${TESTDIR}"
51149da0fa4SScott Kruger	-@echo "                    or $${PREFIX_DIR}/share/petsc/examples/$${TESTDIR})"
5124ff3c6a1SScott Kruger	-@echo "  TESTBASE='tests'   Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}"
51349da0fa4SScott Kruger	-@echo "  OPTIONS='<args>'  Override options to scripts (-a to test scripts)"
514c1139c55SMatthew Knepley	-@echo "  EXTRA_OPTIONS_INITIAL='<args>' Add initial options to scripts (-e to test scripts)"
515c1139c55SMatthew Knepley	-@echo "  EXTRA_OPTIONS='<args>' Add final options to scripts (-E to test scripts)"
51649da0fa4SScott Kruger	-@echo
5170b148140SVaclav Hapla	-@echo "Special options for macOS:"
5180b148140SVaclav 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"
5190b148140SVaclav Hapla	-@echo
52063cf4119SScott Kruger	-@echo "Tests can be generated by searching with multiple methods"
5212869a97aSJose E. Roman	-@echo "  For general searching (using config/query_tests.py):"
522fff3f5faSBarry Smith	-@echo "    ${OMAKE} test search='sys*ex2*'"
52363cf4119SScott Kruger	-@echo "   or the shortcut using s"
524fff3f5faSBarry Smith	-@echo "    ${OMAKE} test s='sys*ex2*'"
52585bc9deeSScott Kruger	-@echo "  You can also use the full path to a file directory"
526fff3f5faSBarry Smith	-@echo "    ${OMAKE} test s='src/sys/tests/'"
52784533492SBarry Smith	-@echo "   or a file"
52884533492SBarry Smith	-@echo "    ${OMAKE} test s='src/sys/tests/ex1.c'"
529feeaa4f6SScott Kruger	-@echo
5306f5e9bd5SScott Kruger	-@echo "  To search for fields from the original test definitions:"
531fff3f5faSBarry Smith	-@echo "    ${OMAKE} test query='requires' queryval='*MPI_PROCESS_SHARED_MEMORY*'"
53285bc9deeSScott Kruger	-@echo "   or the shortcut using q and qv"
533fff3f5faSBarry Smith	-@echo "    ${OMAKE} test q='requires' qv='*MPI_PROCESS_SHARED_MEMORY*'"
53485bc9deeSScott Kruger	-@echo "  To filter results from other searches, use searchin"
535fff3f5faSBarry Smith	-@echo "    ${OMAKE} test s='src/sys/tests/' searchin='*options*'"
53663cf4119SScott Kruger	-@echo
53763cf4119SScott Kruger	-@echo "  To re-run the last tests which failed:"
538fff3f5faSBarry Smith	-@echo "    ${OMAKE} test test-fail='1'"
53963cf4119SScott Kruger	-@echo
54049da0fa4SScott Kruger	-@echo "  To see which targets match a given pattern (useful for doing a specific target):"
541fff3f5faSBarry Smith	-@echo "    ${OMAKE} print-test search=sys*"
54249da0fa4SScott Kruger	-@echo
54349da0fa4SScott Kruger	-@echo "  To build an executable, give full path to location:"
544fff3f5faSBarry Smith	-@echo '    ${OMAKE} $${PETSC_ARCH}/tests/sys/tests/ex1'
54549da0fa4SScott Kruger	-@echo "  or make the test with NO_RM=1"
54649da0fa4SScott Kruger	-@echo
54740a841f6SBarry Smith
54840a841f6SBarry Smithhelp-targets:
54940a841f6SBarry Smith	-@echo "All makefile targets and their dependencies:"
55040a841f6SBarry Smith	-@grep ^[a-z] ${makefile} | grep : | grep -v =
55140a841f6SBarry Smith	-@echo
552