xref: /petsc/gmakefile.test (revision ef93a428435fcf4b30c78b2b761c3cd1ee3385e9)
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
38*ef93a428SToby Isaac# gmake should turn '-s', '--silent', and '--quiet' into an 's' in the first word of MAKEFLAGS
39*ef93a428SToby IsaacMAKEFLAGS_FW=$(firstword $(MAKEFLAGS))
40*ef93a428SToby Isaac# ignore first work if it starts with -, because then there are no shortoptions
41*ef93a428SToby IsaacMAKEFLAGS_SHORT=$(patsubst -%,,$(MAKEFLAGS_FW))
42*ef93a428SToby IsaacMAKEFLAGS_SILENT=$(findstring s,$(MAKEFLAGS_SHORT))
43*ef93a428SToby 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)
62baa5c0f4SScott Kruger  TESTFLAGS += -U    # Add cuda-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)
6885bc9deeSScott Kruger  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
8949da0fa4SScott Krugerifdef EXTRA_OPTIONS
9049da0fa4SScott Kruger  TESTFLAGS += -e '$(EXTRA_OPTIONS)'  # add extra arguments
9149da0fa4SScott Krugerendif
9249da0fa4SScott Krugerifdef NP
9349da0fa4SScott Kruger  TESTFLAGS += -n $(NP)  # set number of processes
9449da0fa4SScott Krugerendif
9549da0fa4SScott Kruger# Override the default timeout that may be found at the top of config/petsc_harness.sh
9649da0fa4SScott Kruger# This must be an integer.  It is given in seconds.
9749da0fa4SScott Krugerifdef TIMEOUT
9849da0fa4SScott Kruger  TESTFLAGS += -t $(TIMEOUT)  # Override the default timeout
9949da0fa4SScott Krugerendif
10049da0fa4SScott Kruger
101fc46264cSScott Kruger$(generatedtest) : $(petscconf) $(petscvariables) $(CONFIGDIR)/gmakegentest.py $(TESTDIR)/.DIR | $$(@D)/.DIR
1028e69c5ecSJed Brown	$(PYTHON) $(CONFIGDIR)/gmakegentest.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --testdir=$(TESTDIR)
10349da0fa4SScott Kruger
1042869a97aSJose E. Romanifneq ($(filter-out help clean check info libs all install install-lib checkbadSource checkbadFileChange allfortranstubs alletags clangformat checkclangformat get%,$(MAKECMDGOALS:clean%=clean)),)
105336d78f1SSatish Balayinclude $(generatedtest)
106535b694aSJed Brownendif
10749da0fa4SScott Kruger
10849da0fa4SScott Krugerifeq ($(PETSC_LANGUAGE),CXXONLY)
10949da0fa4SScott Kruger  cc_name := CXX
11049da0fa4SScott Krugerelse
11149da0fa4SScott Kruger  cc_name := CC
11249da0fa4SScott Krugerendif
11349da0fa4SScott Kruger
1143761b06dSJed BrownPETSC_COMPILE.c = $(call quiet,$(cc_name)) -c $(PCC_FLAGS) $($(CLANGUAGE)FLAGS) $(CCPPFLAGS) $(C_DEPFLAGS)
1150b119762SSatish BalayPETSC_COMPILE.cxx = $(call quiet,CXX) -c $(CXX_FLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(CXX_DEPFLAGS)
116de364511SSatish BalayPETSC_COMPILE.cu = $(call quiet,CUDAC) -c $(MPICXX_INCLUDES) $(CUDAC_FLAGS) $(CUDAPP_FLAGS) $(CUDAFLAGS) $(CUDA_HOSTFLAGS)
11750dcbc5aSJunchao ZhangPETSC_COMPILE.hip.cpp = $(call quiet,HIPC) -c $(MPICXX_INCLUDES) $(HIPC_FLAGS) $(HIPPP_FLAGS) $(HIPFLAGS) $(HIPPPFLAGS) $(HIPOPTFLAGS) $(HIPC_DEPFLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(HIP_DEPFLAGS)
11850dcbc5aSJunchao ZhangPETSC_COMPILE.sycl.cxx = $(call quiet,SYCLC) -c $(MPICXX_INCLUDES) $(SYCLC_FLAGS) $(SYCLPP_FLAGS) $(SYCLFLAGS) $(SYCLPPFLAGS) $(SYCLOPTFLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(SYCL_DEPFLAGS)
1198a4d847aSStefano ZampiniPETSC_GENDEPS.cu = ${CUDA_PETSC_GENDEPS}
12049da0fa4SScott KrugerPETSC_COMPILE.F = $(call quiet,FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS)
12149da0fa4SScott Kruger
122600dc890SJunchao Zhangifneq ($(KOKKOS_USE_CUDA_COMPILER),)
123600dc890SJunchao Zhang  # Kokkos requires nvcc to be in PATH and the C++ compiler to be given in an environmental variable
12464cfe48dSJed Brown  KOKC = PATH=`dirname $(CUDAC)`:$(PATH) NVCC_WRAPPER_DEFAULT_COMPILER="$(CUDA_CXX)" $(KOKKOS_BIN)/nvcc_wrapper --expt-extended-lambda
12555bc12c6SJunchao Zhang  KOKKOS_COMPILE = $(call quiet,KOKC) -c $(CUDAC_FLAGS) ${PETSC_CXXCPPFLAGS} $(CUDACPPFLAGS) $(CUDA_CXXFLAGS) $(MPICXX_INCLUDES)
1268a4d847aSStefano Zampinielse ifneq ($(KOKKOS_USE_CUDACLANG_COMPILER),)
1278a4d847aSStefano Zampini  KOKKOS_COMPILE = $(PETSC_COMPILE.cu)
128600dc890SJunchao Zhangelse ifneq ($(KOKKOS_USE_HIP_COMPILER),)
12955bc12c6SJunchao Zhang  KOKKOS_COMPILE = $(PETSC_COMPILE.hip.cpp)
13050dcbc5aSJunchao Zhangelse ifneq ($(KOKKOS_USE_SYCL_COMPILER),)
13155bc12c6SJunchao Zhang  KOKKOS_COMPILE = $(PETSC_COMPILE.sycl.cxx)
132600dc890SJunchao Zhangelse
13355bc12c6SJunchao Zhang  KOKKOS_COMPILE = $(PETSC_COMPILE.cxx)
134600dc890SJunchao Zhangendif
13555bc12c6SJunchao Zhang# https://github.com/kokkos/kokkos/pull/5473 used a C++17 feature, inline static variables.
13655bc12c6SJunchao Zhang# We found -fvisibility=hidden could hide these variables such that the supposed globally unique
13755bc12c6SJunchao Zhang# variables become local to each file including them and thus have multiple copies (see an example
13855bc12c6SJunchao 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
13955bc12c6SJunchao Zhang# See also an older bug report related to visibility, https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59693
14055bc12c6SJunchao Zhang#
14155bc12c6SJunchao Zhang# Our workaround here is to git rid of -fvisibility=hidden from Kokkos compiler options, so that petsc
14255bc12c6SJunchao Zhang# files including Kokkos headers won't be affected by this flag.
14355bc12c6SJunchao Zhang#
14455bc12c6SJunchao Zhang# The solution is not ideal in the sense we have to duplicate the same workaround to any external libraries
14555bc12c6SJunchao Zhang# using C++17 inline static variables. We have to wait for GNU to clarify this issue.
14655bc12c6SJunchao ZhangPETSC_COMPILE.kokkos.cxx = $(filter-out -fvisibility=hidden,$(KOKKOS_COMPILE))
147600dc890SJunchao Zhang
148d23021a0SBarry Smithifneq ($(RAJA_USE_CUDA_COMPILER),)
149f09347e2SJunchao 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
150d23021a0SBarry Smithelse
151d23021a0SBarry Smith  PETSC_COMPILE.raja.cxx = ${CXX} -o $*.o -c ${CXX_FLAGS} ${CXXFLAGS} ${CXXCPPFLAGS}
152d23021a0SBarry Smithendif
153d23021a0SBarry Smith
15450dcbc5aSJunchao Zhangtestlangs := c cu cxx F F90 kokkos.cxx hip.cpp sycl.cxx raja.cxx
155513d7a9cSJed Brown$(foreach lang, $(testlangs), $(eval \
156513d7a9cSJed Brown  testexe.$(lang) = $(foreach pkg, $(pkgs), $(testsrcs-$(pkg).$(lang):%.$(lang)=$(TESTDIR)/%))))
15749da0fa4SScott Krugerconcattestlang = $(foreach lang, $(2), $(testsrcs-$(1).$(lang):%.$(lang)=$(TESTDIR)/%.o))
15849da0fa4SScott Krugertestsrcs.o := $(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),$(testlangs)))
159fc46264cSScott Krugertestsrcs-rel := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), $(testsrcs-$(pkg).$(lang))))
160fc46264cSScott Krugertestsrcs := $(foreach sfile, $(testsrcs-rel), $(TESTSRCDIR)/$(sfile))
16149da0fa4SScott Kruger
16206fe1a63SSatish Balay# workaround win32fe failure
16333a1b2deSBarry Smithifneq (,$(findstring win_,$(call quiet,$(cc_name))))
16406fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex6: | $(TESTDIR)/ts/tutorials/multirate/ex5
16506fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex8: | $(TESTDIR)/ts/tutorials/multirate/ex6
16606fe1a63SSatish Balayendif
16706fe1a63SSatish Balay
16849da0fa4SScott Kruger# Refresh testfiles when sources change, but don't balk if the source file is nonexistent (deleted)
16949da0fa4SScott Kruger$(generatedtest) : $(testsrcs)
17049da0fa4SScott Kruger$(testsrcs) :
17149da0fa4SScott Kruger
1724ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.c | $$(@D)/.DIR
17349da0fa4SScott Kruger	$(PETSC_COMPILE.c) $(abspath $<) -o $@
17449da0fa4SScott Kruger
175c0558f20SBarry Smith$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.kokkos.cxx | $$(@D)/.DIR
176c0558f20SBarry Smith	$(PETSC_COMPILE.kokkos.cxx) $(abspath $<) -o $@
177c0558f20SBarry Smith
17850dcbc5aSJunchao Zhang$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.sycl.cxx | $$(@D)/.DIR
17950dcbc5aSJunchao Zhang	$(PETSC_COMPILE.sycl.cxx) $(abspath $<) -o $@
18050dcbc5aSJunchao Zhang
181d23021a0SBarry Smith$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.raja.cxx | $$(@D)/.DIR
182d23021a0SBarry Smith	$(PETSC_COMPILE.raja.cxx) $(abspath $<) -o $@
183d23021a0SBarry Smith
1844ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cxx | $$(@D)/.DIR
18549da0fa4SScott Kruger	$(PETSC_COMPILE.cxx) $(abspath $<) -o $@
18649da0fa4SScott Kruger
1874ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cu | $$(@D)/.DIR
18849da0fa4SScott Kruger	$(PETSC_COMPILE.cu) $(abspath $<) -o $@ # Compile first so that if there is an error, it comes from a normal compile
18949da0fa4SScott Kruger	@$(PETSC_GENDEPS.cu) $(abspath $<) -o $(@:%.o=%.d) # Generate the dependencies for later
19049da0fa4SScott Kruger
1911a5aed34SJunchao Zhang$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.hip.cpp | $$(@D)/.DIR
1921a5aed34SJunchao Zhang	$(PETSC_COMPILE.hip.cpp) $(abspath $<) -o $@
1931a5aed34SJunchao Zhang
194a55d2495SJed Brown# Test modules go in the same directory as the target *.o
195a55d2495SJed BrownTESTMODDIR = $(@D)
19649da0fa4SScott KrugerFCMOD = cd
1974ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F | $$(@D)/.DIR
19849da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),)
199a55d2495SJed Brown	$(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@)
20049da0fa4SScott Krugerelse
201a55d2495SJed Brown	$(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR)
20249da0fa4SScott Krugerendif
2030266c241SJed Brown	-@$(GFORTRAN_DEP_CLEANUP)
20449da0fa4SScott Kruger
2054ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F90 | $$(@D)/.DIR
20649da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),)
207a55d2495SJed Brown	$(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@)
20849da0fa4SScott Krugerelse
209a55d2495SJed Brown	$(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR)
21049da0fa4SScott Krugerendif
2110266c241SJed Brown	-@$(GFORTRAN_DEP_CLEANUP)
2120266c241SJed Brown
213cf7d3547SScott Kruger#   This is a hack to fix a broken gfortran.
2140266c241SJed Browndefine GFORTRAN_DEP_CLEANUP
215ef0d7cd8SPierre Jolivet  if test -e "$(@:%.o=%.d)" && head -1 "$(@:%.o=%.d)" | grep -F -q -v : ; then\
2164f45eea9SScott Kruger    echo "$(@): \\" > $(@:%.o=%.dtemp) ; \
2170266c241SJed Brown    tr '\n' '@' < $(@:%.o=%.d) | cut -d: -f2- | tr '@' '\n' >> $(@:%.o=%.dtemp) ; \
2180266c241SJed Brown    mv $(@:%.o=%.dtemp) $(@:%.o=%.d); \
2194f45eea9SScott Kruger  fi
2200266c241SJed Brownendef
22149da0fa4SScott Kruger
22220844ca6SSatish Balay# link line constructed differently for gmakefile vs gmakefile.test invocation
22320844ca6SSatish Balayifeq ($(libpetscall),)
22420844ca6SSatish BalayPETSC_TEST_LIB = $(PETSC_LIB)
22520844ca6SSatish Balayelse
22620844ca6SSatish BalayPETSC_TEST_LIB = $(C_SH_LIB_PATH) $(PETSC_EXTERNAL_LIB_BASIC)
22720844ca6SSatish Balayendif
22820844ca6SSatish Balay
229bde159b7SSatish Balay# manually list some some library dependencies to check for circular dependencies
230c4762a1bSJed Brown$(TESTDIR)/sys/tests/ex9: PETSC_TEST_LIB = $(PETSC_SYS_LIB)
231c4762a1bSJed Brown$(TESTDIR)/vec/vec/tests/ex1: PETSC_TEST_LIB = $(PETSC_VEC_LIB)
232c4762a1bSJed Brown$(TESTDIR)/mat/tests/ex1: PETSC_TEST_LIB = $(PETSC_MAT_LIB)
233c4762a1bSJed Brown$(TESTDIR)/dm/tests/ex1: PETSC_TEST_LIB = $(PETSC_DM_LIB)
234c4762a1bSJed Brown$(TESTDIR)/ksp/ksp/tests/ex1: PETSC_TEST_LIB = $(PETSC_KSP_LIB)
235c4762a1bSJed Brown$(TESTDIR)/snes/tests/ex1: PETSC_TEST_LIB = $(PETSC_SNES_LIB)
236c4762a1bSJed Brown$(TESTDIR)/ts/tests/ex2: PETSC_TEST_LIB = $(PETSC_TS_LIB)
237c4762a1bSJed Brown$(TESTDIR)/tao/tutorials/ex1: PETSC_TEST_LIB = $(PETSC_TAO_LIB)
238bde159b7SSatish Balay
2397cb68e74SVaclav Hapla# MACOS FIREWALL HANDLING
2407cb68e74SVaclav Hapla# - if run with MACOS_FIREWALL=1
2417cb68e74SVaclav Hapla#   (automatically set in $PETSC_ARCH/lib/petsc/conf/petscvariables if configured --with-macos-firewall-rules),
2427cb68e74SVaclav Hapla#   ensure mpiexec and test executable is on firewall list
2437cb68e74SVaclav Hapla#
2440b148140SVaclav Haplaifeq ($(MACOS_FIREWALL),1)
2450b148140SVaclav HaplaFW := /usr/libexec/ApplicationFirewall/socketfilterfw
2467cb68e74SVaclav Hapla# There is no reliable realpath command in macOS without need for 3rd party tools like homebrew coreutils
2477cb68e74SVaclav Hapla# Using Python's realpath seems like the most robust way here
2487cb68e74SVaclav Haplarealpath-py = $(shell $(PYTHON) -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' $(1))
2497cb68e74SVaclav Hapla#
2501dcdb15bSVaclav Hapladefine macos-firewall-register
2517cb68e74SVaclav Hapla  @APP=$(call realpath-py, $(1)); \
2521855f086SVaclav Hapla    if ! sudo -n true 2>/dev/null; then printf "Asking for sudo password to add new firewall rule for\n  $$APP\n"; fi; \
2537cb68e74SVaclav Hapla    sudo $(FW) --remove $$APP --add $$APP --blockapp $$APP
2541dcdb15bSVaclav Haplaendef
2550b148140SVaclav Haplaendif
2567cb68e74SVaclav Hapla#
2577cb68e74SVaclav Haplamacos-firewall-register-mpiexec:
258961fb248SStefano Zampini	-$(call macos-firewall-register, $(MPIEXEC))
2591dcdb15bSVaclav Hapla
26049da0fa4SScott Kruger# Test executables
261513d7a9cSJed Brown$(testexe.F) $(testexe.F90) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
26220844ca6SSatish Balay	$(call quiet,FLINKER) -o $@ $^ $(PETSC_TEST_LIB)
2637cb68e74SVaclav Hapla	-$(call macos-firewall-register,$@)
26449da0fa4SScott Kruger
265accbd18bSBarry Smithifneq (,$(findstring emcc,$(CC)))
266accbd18bSBarry Smith$(testexe.c) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
267accbd18bSBarry 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)
268accbd18bSBarry Smith	-@printf '#!/usr/bin/env sh\nnode --redirect-warnings=/dev/null  $$0.js $$*  | grep -v "Heap resize call from"'  > $@
269accbd18bSBarry Smith	-@chmod u+x $@
270accbd18bSBarry Smithelse
271513d7a9cSJed Brown$(testexe.c) $(testexe.cu) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
2721c6715b8SMatthew G. Knepley	$(call quiet,CLINKER) $(EXEFLAGS) -o $@ $^ $(PETSC_TEST_LIB)
2737cb68e74SVaclav Hapla	-$(call macos-firewall-register,$@)
27449da0fa4SScott Kruger
275accbd18bSBarry Smithendif
276accbd18bSBarry Smith
2771a5aed34SJunchao Zhang$(testexe.hip.cpp) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
2781a5aed34SJunchao Zhang	$(call quiet,CLINKER) -o $@ $^ $(PETSC_TEST_LIB)
2791a5aed34SJunchao Zhang	-$(call macos-firewall-register,$@)
2801a5aed34SJunchao Zhang
281c0558f20SBarry Smith$(testexe.kokkos.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
282672b70e8SJunchao Zhang	$(call quiet,CLINKER) $(EXEFLAGS) -o $@ $^ $(PETSC_TEST_LIB)
2837cb68e74SVaclav Hapla	-$(call macos-firewall-register,$@)
284c0558f20SBarry Smith
285d23021a0SBarry Smith$(testexe.raja.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
286d23021a0SBarry Smith	$(call quiet,CLINKER) -o $@ $^ $(PETSC_TEST_LIB)
287d23021a0SBarry Smith	-$(call macos-firewall-register,$@)
288d23021a0SBarry Smith
289513d7a9cSJed Brown$(testexe.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
2902f4326f3SSatish Balay	$(call quiet,CXXLINKER) -o $@ $^ $(PETSC_TEST_LIB)
2917cb68e74SVaclav Hapla	-$(call macos-firewall-register,$@)
292513d7a9cSJed Brown
29349da0fa4SScott Kruger# Fortran source files need petsc*.mod, which isn't explicitly managed in the makefile.
29449da0fa4SScott Kruger$(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),F F90)) : $(libpetscall)
29549da0fa4SScott Kruger
29649da0fa4SScott Kruger# Testing convenience targets
297c173c275SScott Kruger.PHONY: test pre-clean
298c173c275SScott Kruger
299ff7b3809SScott Krugertest: report_tests
300c173c275SScott Kruger
30149da0fa4SScott Krugerpre-clean:
3025e361860SScott Kruger	@$(RM) -rf $(TESTDIR)/counts $(TESTLOGTAPFILE) $(TESTLOGERRFILE)
3035e361860SScott Kruger	@touch $(TESTLOGTAPFILE) $(TESTLOGERRFILE)
30427d73d1fSBarry Smith	@echo "Using MAKEFLAGS:" ${MAKEFLAGS}
30549da0fa4SScott Kruger
3064d9d3ee5SSatish Balaycheck-test-errors:
3075e361860SScott Kruger	@grep '^not ok' $(TESTLOGTAPFILE) | grep -v 'Exceeded timeout' | tee $(TESTDIR)/allgtests-tap-err.log
3084d9d3ee5SSatish Balay	@test ! -s $(TESTDIR)/allgtests-tap-err.log
3094d9d3ee5SSatish Balay
31049da0fa4SScott Kruger.PHONY: $(foreach pkg, $(pkgs), test-$(pkg) $(foreach lang, $(testlangs), test-$(pkg).$(lang) test-rm-$(pkg).$(lang)))
31149da0fa4SScott Krugertestpkgs := $(foreach pkg, $(pkgs), test-$(pkg))
31249da0fa4SScott Kruger# Targets to run tests in test-$pkg.$lang and delete the executables, language by language
31349da0fa4SScott Kruger$(testpkgs) : test-% : $(foreach lang, $(testlangs), test-rm-%.$(lang))
31449da0fa4SScott Kruger# List of raw test run targets
31549da0fa4SScott Krugeralltesttargets := $(foreach tp, $(testpkgs), $(foreach lang, $(testlangs), $($(tp).$(lang))))
31649da0fa4SScott Kruger
31749da0fa4SScott Kruger# Run targets
31849da0fa4SScott Kruger$(alltesttargets) : % : $(TESTDIR)/counts/%.counts
31949da0fa4SScott Kruger.PHONY: $(alltesttargets)
32049da0fa4SScott Kruger
32149da0fa4SScott Kruger$(TESTDIR)/counts/%.counts :
32249da0fa4SScott Kruger	$(quiettest) $< $(TESTFLAGS)
32349da0fa4SScott Kruger
32449da0fa4SScott Kruger# Targets to run tests and remove executables, by package-lang pairs.
32549da0fa4SScott Kruger# Run the tests in each batch using recursive invocation of make because
32649da0fa4SScott Kruger# we need all of them to complete before removing the executables.  Make
32749da0fa4SScott Kruger# doesn't guarantee an exploration order for the graph.  Only recursive
32849da0fa4SScott Kruger# if there is something to be done.
32949da0fa4SScott Krugeralltest-rm := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), test-rm-$(pkg).$(lang)))
33049da0fa4SScott Kruger$(alltest-rm) : test-rm-% : test-%
33149da0fa4SScott Krugerifneq ($(NO_RM),1)
33249da0fa4SScott Kruger	$(call quiet,RM) $(addprefix $(TESTDIR)/,$(basename $($(@:test-rm-%=testsrcs-%))))
33349da0fa4SScott Krugerendif
33449da0fa4SScott Kruger
33549da0fa4SScott Kruger# Remove intermediate .o files
33649da0fa4SScott Kruger# This only removes the files at the end which is insufficient
33749da0fa4SScott Kruger#.INTERMEDIATE: $(testsrcs.o:%.o=%)
33849da0fa4SScott Kruger
33949da0fa4SScott Kruger# all sources should get recompiled when petscvariables changes (i.e when configure is rerun or when petscvariables is manually edited.)
34049da0fa4SScott Kruger$(testsrcs.o) : $(petscvariables)
34149da0fa4SScott Kruger
34249da0fa4SScott Kruger%/.DIR :
34349da0fa4SScott Kruger	@mkdir -p $(@D)
34449da0fa4SScott Kruger	@touch $@
34549da0fa4SScott Kruger
34649da0fa4SScott Kruger.PRECIOUS: %/.DIR
34749da0fa4SScott Kruger
34849da0fa4SScott Kruger.SUFFIXES: # Clear .SUFFIXES because we don't use implicit rules
34949da0fa4SScott Kruger.DELETE_ON_ERROR:               # Delete likely-corrupt target file if rule fails
35049da0fa4SScott Kruger
35137ed16bcSStefano Zampini.PHONY: clean cleantest all
35249da0fa4SScott Kruger
35349da0fa4SScott Krugercleantest:
35449da0fa4SScott Kruger	${RM} -r $(TESTDIR) $(generatedtest)
35549da0fa4SScott Kruger
35649da0fa4SScott Krugerclean: cleantest
35749da0fa4SScott Kruger
35849da0fa4SScott Krugeralltest.d := $(testsrcs.o:%.o=%.d)
35949da0fa4SScott Kruger# Tell make that alltest.d are all up to date.  Without this, the include
36049da0fa4SScott Kruger# below has quadratic complexity, taking more than one second for a
36149da0fa4SScott Kruger# do-nothing build of PETSc (much worse for larger projects)
36249da0fa4SScott Kruger$(alltest.d) : ;
36349da0fa4SScott Kruger
36449da0fa4SScott Kruger-include $(alltest.d)
36549da0fa4SScott Kruger
36663cf4119SScott Kruger# Tests can be generated by searching -- see documentation below
367c9625024SScott Krugershowreport=
36885bc9deeSScott Krugerifndef searchin
36985bc9deeSScott Kruger   searchin = " "
37085bc9deeSScott Krugerendif
37185bc9deeSScott Krugerifdef i
37285bc9deeSScott Kruger   searchin = $(i)
37385bc9deeSScott Krugerendif
37458da34e9SJed Brownifdef gs
37558da34e9SJed Brown  gmakesearch = $(gs)
37658da34e9SJed Brownendif
37763cf4119SScott Krugerifdef gmakesearch
378848cfe54SJed Brown  TESTTARGETS := $(filter $(gmakesearch),$(alltesttargets))
37985bc9deeSScott Kruger  ifdef gmakesearchin
38085bc9deeSScott Kruger    TESTTARGETS2 := $(foreach v,$(TESTTARGETS),$(if $(findstring $(gmakesearchin),$(v)),$(v)))
38149da0fa4SScott Kruger    TESTTARGETS := $(TESTTARGETS2)
38249da0fa4SScott Kruger  endif
38385bc9deeSScott Krugerelse ifdef gmakesearchin
38485bc9deeSScott Kruger  TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(gmakesearchin),$(v)),$(v)))
38549da0fa4SScott Krugerelse ifdef argsearch
38649da0fa4SScott Kruger  TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(argsearch),$($(v)_ARGS)),$(v)))
38763cf4119SScott Krugerelse ifdef search
3889ea87190SJacob Faibussowitsch  TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) 'name' '$(search)')
38963cf4119SScott Krugerelse ifdef s
3909ea87190SJacob Faibussowitsch  TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) 'name' '$(s)')
391feeaa4f6SScott Krugerelse ifdef test-fail
392f1f6c4e6SStefano Zampini  TESTTARGETS := $(shell $(TESTDIR)/echofailures.sh)
3936f5e9bd5SScott Krugerelse ifdef query
3949ea87190SJacob Faibussowitsch  TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) '$(query)' '$(queryval)')
39585bc9deeSScott Krugerelse ifdef q
3969ea87190SJacob Faibussowitsch  TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) '$(q)' '$(qv)')
39749da0fa4SScott Krugerelse                            # No filter - run them all, but delete the executables as we go
39849da0fa4SScott Kruger  TESTTARGETS := $(testpkgs)
399f42deef9SScott Kruger  ifneq ($(PRINTONLY),1)
400c9625024SScott Kruger    showreport = "-s"  # Only show full report when all tests are run
401f42deef9SScott Kruger  endif
40249da0fa4SScott Krugerendif
40349da0fa4SScott Kruger
40449da0fa4SScott Kruger.PHONY: report_tests print-test
40549da0fa4SScott Kruger
40649da0fa4SScott Krugerprint-test:
4075b6dee57SScott Kruger	$(info $(TESTTARGETS))
4085b6dee57SScott Kruger	@true
40949da0fa4SScott Kruger
4106e5deea7SScott Krugershow-fail:
411b711b6a4SScott Kruger	-@$(PYTHON) $(CONFIGDIR)/report_tests.py -d $(TESTDIR)/counts -f
412b711b6a4SScott Kruger
4136e5deea7SScott Kruger
4146e5deea7SScott Kruger
415c01c7e64SJed Brown# Don't start running tests until starttime has completed
416c01c7e64SJed Brown$(alltesttargets:%=$(TESTDIR)/counts/%.counts) : starttime
417c01c7e64SJed Brown
418c01c7e64SJed Brown# Ensure that libpetsc (if it is a prerequisite) has been built and clean the counts/logs before starting timer
4197cb68e74SVaclav Haplastarttime: pre-clean $(libpetscall) macos-firewall-register-mpiexec
42027d73d1fSBarry Smith	@$(eval STARTTIME := $(shell date +%s))
42127d73d1fSBarry Smith
42227d73d1fSBarry Smithreport_tests: starttime $(TESTTARGETS)
42332f4009dSScott Kruger	@$(eval ENDTIME := $(shell date +%s))
424c9625024SScott Kruger	-@ elapsed_time=$$(($(ENDTIME)- $(STARTTIME))) && \
425c9625024SScott Kruger	$(PYTHON) $(CONFIGDIR)/report_tests.py -m $(MAKE) -d $(TESTDIR)/counts -t 5 -e $${elapsed_time} $(showreport)
42649da0fa4SScott Kruger
4275e361860SScott Krugercheck_output:
4285e361860SScott Kruger	$(PYTHON) $(CONFIGDIR)/gmakegentest.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --testdir=$(TESTDIR) --check-output
4295e361860SScott Kruger
43040a841f6SBarry Smith# If users make is a gnumake then these messages are provided even if the user does not do make -f gmakefile.test
43149da0fa4SScott KrugerHASGMAKEFILE := $(filter gmakefile,$(MAKEFILE_LIST))
43249da0fa4SScott Krugerifeq ($(HASGMAKEFILE),gmakefile)
43340a841f6SBarry Smithhelpdeps:= help-nontest
43449da0fa4SScott Krugerelse
43540a841f6SBarry Smithhelpdeps:= help-test
43649da0fa4SScott Krugerendif
43749da0fa4SScott Kruger
43840a841f6SBarry Smithhelp: help-make ${helpdeps}
43940a841f6SBarry Smith	-@echo ""
44049da0fa4SScott Kruger
44149da0fa4SScott Krugerhelp-make:
44249da0fa4SScott Kruger	-@echo
44386a7890dSBarry Smith	-@echo "PETSc makefile Basic usage:"
444fff3f5faSBarry Smith	-@echo "  ${OMAKE} rule <V=1 for verbose output> <other options>"
44549da0fa4SScott Kruger	-@echo
44649da0fa4SScott Kruger
44740a841f6SBarry Smithhelp-nontest:
44840a841f6SBarry Smith	-@echo "Available rules:"
44940a841f6SBarry Smith	-@echo "   all - build (update) the PETSc and related libraries in parallel"
45040a841f6SBarry Smith	-@echo "   libs - build (update) the PETSc and related libraries"
45140a841f6SBarry Smith	-@echo "   check - run a basic check that the libraries are built correctly and can be used"
45240a841f6SBarry Smith	-@echo "   "
45340a841f6SBarry Smith	-@echo "   getlinklibs - print the libraries that a PETSc application must link against"
45440a841f6SBarry Smith	-@echo "   getincludedirs - print the include directories that a PETSc application must be compiled against"
45540a841f6SBarry Smith	-@echo "   getcflags - print the C compiler flags PETSc is using"
45640a841f6SBarry Smith	-@echo "   getcxxflags - print the C++ compiler flags PETSc is using"
45740a841f6SBarry Smith	-@echo "   getfortranflags - print the Fortran compiler flags PETSc is using"
45840a841f6SBarry Smith	-@echo "   "
459ea34bbbbSJose E. Roman	-@echo "   petsc4pytest - run the entire petsc4py test suite"
46040a841f6SBarry Smith	-@echo "   alltests - run the entire PETSc test suite"
4614c512586SBarry Smith	-@echo "   test - use \"make help-test\" for help on running the extensive tests"
46249da0fa4SScott Kruger	-@echo
46340a841f6SBarry Smith	-@echo "Developer rules:"
4644c512586SBarry Smith	-@echo "   docs - build all the PETSc documentation locally as a website"
46540a841f6SBarry Smith	-@echo "   clean - delete libraries and Fortran module files"
46640a841f6SBarry Smith	-@echo "   clangformat - run clangformat on the PETSc C/C++ source code"
46740a841f6SBarry Smith	-@echo "   allfortranstubs - regenerate Fortran stubs/interface definitions, needed after git pulls or source code changes"
46840a841f6SBarry Smith	-@echo "   deletefortranstubs - delete the generated Fortran stubs/interface definitions"
46940a841f6SBarry Smith	-@echo "   checkbadSource - check the source code for violations of coding standards"
47040a841f6SBarry Smith	-@echo "   abitest - Compare ABI/API of two versions of PETSc library with the old one defined by PETSC_{DIR,ARCH}_ABI_OLD"
47140a841f6SBarry Smith	-@echo "   reconfigure - delete libraries and Fortran module files and run the previously run configure again"
47286a7890dSBarry Smith	-@echo "   lint - run lint on the source code, including its embedded documentation"
473fff3f5faSBarry Smith	-@echo "     Run \"${OMAKE} help-lint\" for lint options"
47486a7890dSBarry Smith	-@echo "   "
47586a7890dSBarry Smith	-@echo "Building website: (run in the doc directory)"
47686a7890dSBarry Smith	-@cd doc; ${OMAKE} help
47740a841f6SBarry Smith	-@echo "   "
47849da0fa4SScott Kruger
47949da0fa4SScott Krugerhelp-test:
48040a841f6SBarry Smith	-@echo "Test usage:"
481fff3f5faSBarry Smith	-@echo "   ${OMAKE} test <options>"
48249da0fa4SScott Kruger	-@echo
48349da0fa4SScott Kruger	-@echo "Options:"
48449da0fa4SScott Kruger	-@echo "  NO_RM=1           Do not remove the executables after running"
485f50802fbSScott Kruger	-@echo "  REPLACE=1         Replace the output in PETSC_DIR source tree (-m to test scripts)"
4865e361860SScott Kruger	-@echo "  OUTPUT=1          Show only the errors on stdout"
487f50802fbSScott Kruger	-@echo "  ALT=1             Replace 'alt' output in PETSC_DIR source tree (-M to test scripts)"
48849da0fa4SScott Kruger	-@echo "  DIFF_NUMBERS=1    Diff the numbers in the output (-j to test scripts and petscdiff)"
489baa5c0f4SScott Kruger	-@echo "  CUDAMEMCHECK=1    Execute the tests using cuda-memcheck (-U to test scripts)"
490636bfc99SJacob Faibussowitsch	-@echo "                    Use PETSC_CUDAMEMCHECK_COMMAND to change the executable to run and"
491636bfc99SJacob Faibussowitsch	-@echo "                    PETSC_CUDAMEMCHECK_ARGS to change the arguments (note: both"
492636bfc99SJacob Faibussowitsch	-@echo "                    cuda-memcheck and compute-sanitizer are supported)"
49349da0fa4SScott Kruger	-@echo "  VALGRIND=1        Execute the tests using valgrind (-V to test scripts)"
49485bc9deeSScott Kruger	-@echo "  DEBUG=1           Launch tests in the debugger (-d to the scripts)"
495142b82d2SScott Kruger	-@echo "  NP=<num proc>     Set a number of processors to pass to scripts."
496142b82d2SScott Kruger	-@echo "  FORCE=1           Force SKIP or TODO tests to run"
497a6f3f80dSScott Kruger	-@echo "  PRINTONLY=1       Print the command, but do not run.  For loops print first command"
498142b82d2SScott Kruger	-@echo "  TIMEOUT=<time>    Test timeout limit in seconds (default in config/petsc_harness.sh)"
499f50802fbSScott Kruger	-@echo "  TESTDIR='tests'   Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}"
50049da0fa4SScott Kruger	-@echo "                    or $${PREFIX_DIR}/$${TESTDIR}"
50149da0fa4SScott Kruger	-@echo "                    or $${PREFIX_DIR}/share/petsc/examples/$${TESTDIR})"
5024ff3c6a1SScott Kruger	-@echo "  TESTBASE='tests'   Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}"
50349da0fa4SScott Kruger	-@echo "  OPTIONS='<args>'  Override options to scripts (-a to test scripts)"
50449da0fa4SScott Kruger	-@echo "  EXTRA_OPTIONS='<args>'  Add options to scripts (-e to test scripts)"
50549da0fa4SScott Kruger	-@echo
5060b148140SVaclav Hapla	-@echo "Special options for macOS:"
5070b148140SVaclav 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"
5080b148140SVaclav Hapla	-@echo
50963cf4119SScott Kruger	-@echo "Tests can be generated by searching with multiple methods"
5102869a97aSJose E. Roman	-@echo "  For general searching (using config/query_tests.py):"
511fff3f5faSBarry Smith	-@echo "    ${OMAKE} test search='sys*ex2*'"
51263cf4119SScott Kruger	-@echo "   or the shortcut using s"
513fff3f5faSBarry Smith	-@echo "    ${OMAKE} test s='sys*ex2*'"
51485bc9deeSScott Kruger	-@echo "  You can also use the full path to a file directory"
515fff3f5faSBarry Smith	-@echo "    ${OMAKE} test s='src/sys/tests/'"
516feeaa4f6SScott Kruger	-@echo
5176f5e9bd5SScott Kruger	-@echo "  To search for fields from the original test definitions:"
518fff3f5faSBarry Smith	-@echo "    ${OMAKE} test query='requires' queryval='*MPI_PROCESS_SHARED_MEMORY*'"
51985bc9deeSScott Kruger	-@echo "   or the shortcut using q and qv"
520fff3f5faSBarry Smith	-@echo "    ${OMAKE} test q='requires' qv='*MPI_PROCESS_SHARED_MEMORY*'"
52185bc9deeSScott Kruger	-@echo "  To filter results from other searches, use searchin"
522fff3f5faSBarry Smith	-@echo "    ${OMAKE} test s='src/sys/tests/' searchin='*options*'"
52363cf4119SScott Kruger	-@echo
52463cf4119SScott Kruger	-@echo "  To re-run the last tests which failed:"
525fff3f5faSBarry Smith	-@echo "    ${OMAKE} test test-fail='1'"
52663cf4119SScott Kruger	-@echo
52749da0fa4SScott Kruger	-@echo "  To see which targets match a given pattern (useful for doing a specific target):"
528fff3f5faSBarry Smith	-@echo "    ${OMAKE} print-test search=sys*"
52949da0fa4SScott Kruger	-@echo
53049da0fa4SScott Kruger	-@echo "  To build an executable, give full path to location:"
531fff3f5faSBarry Smith	-@echo '    ${OMAKE} $${PETSC_ARCH}/tests/sys/tests/ex1'
53249da0fa4SScott Kruger	-@echo "  or make the test with NO_RM=1"
53349da0fa4SScott Kruger	-@echo
53440a841f6SBarry Smith
53540a841f6SBarry Smithhelp-targets:
53640a841f6SBarry Smith	-@echo "All makefile targets and their dependencies:"
53740a841f6SBarry Smith	-@grep ^[a-z] ${makefile} | grep : | grep -v =
53840a841f6SBarry Smith	-@echo
539