xref: /petsc/gmakefile.test (revision ea34bbbb7a844d00b39ca1aa0f873fed7737d7e9)
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
99e09b7dbfSBarry Smithifneq ($(filter-out clean check info libs all checkbadSource checkbadFileChange allfortranstubs alletags clangformat checkclangformat get%,$(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)
1118a4d847aSStefano ZampiniPETSC_COMPILE.cu = $(call quiet,CUDAC) -c $(MPICXX_INCLUDES) $(CUDAC_FLAGS) $(CUDAPP_FLAGS) $(CUDA_HOSTFLAGS)
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)
1148a4d847aSStefano ZampiniPETSC_GENDEPS.cu = ${CUDA_PETSC_GENDEPS}
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
12055bc12c6SJunchao Zhang  KOKKOS_COMPILE = $(call quiet,KOKC) -c $(CUDAC_FLAGS) ${PETSC_CXXCPPFLAGS} $(CUDACPPFLAGS) $(CUDA_CXXFLAGS) $(MPICXX_INCLUDES)
1218a4d847aSStefano Zampinielse ifneq ($(KOKKOS_USE_CUDACLANG_COMPILER),)
1228a4d847aSStefano Zampini  KOKKOS_COMPILE = $(PETSC_COMPILE.cu)
123600dc890SJunchao Zhangelse ifneq ($(KOKKOS_USE_HIP_COMPILER),)
12455bc12c6SJunchao Zhang  KOKKOS_COMPILE = $(PETSC_COMPILE.hip.cpp)
12550dcbc5aSJunchao Zhangelse ifneq ($(KOKKOS_USE_SYCL_COMPILER),)
12655bc12c6SJunchao Zhang  KOKKOS_COMPILE = $(PETSC_COMPILE.sycl.cxx)
127600dc890SJunchao Zhangelse
12855bc12c6SJunchao Zhang  KOKKOS_COMPILE = $(PETSC_COMPILE.cxx)
129600dc890SJunchao Zhangendif
13055bc12c6SJunchao Zhang# https://github.com/kokkos/kokkos/pull/5473 used a C++17 feature, inline static variables.
13155bc12c6SJunchao Zhang# We found -fvisibility=hidden could hide these variables such that the supposed globally unique
13255bc12c6SJunchao Zhang# variables become local to each file including them and thus have multiple copies (see an example
13355bc12c6SJunchao 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
13455bc12c6SJunchao Zhang# See also an older bug report related to visibility, https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59693
13555bc12c6SJunchao Zhang#
13655bc12c6SJunchao Zhang# Our workaround here is to git rid of -fvisibility=hidden from Kokkos compiler options, so that petsc
13755bc12c6SJunchao Zhang# files including Kokkos headers won't be affected by this flag.
13855bc12c6SJunchao Zhang#
13955bc12c6SJunchao Zhang# The solution is not ideal in the sense we have to duplicate the same workaround to any external libraries
14055bc12c6SJunchao Zhang# using C++17 inline static variables. We have to wait for GNU to clarify this issue.
14155bc12c6SJunchao ZhangPETSC_COMPILE.kokkos.cxx = $(filter-out -fvisibility=hidden,$(KOKKOS_COMPILE))
142600dc890SJunchao Zhang
143d23021a0SBarry Smithifneq ($(RAJA_USE_CUDA_COMPILER),)
144f09347e2SJunchao 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
145d23021a0SBarry Smithelse
146d23021a0SBarry Smith  PETSC_COMPILE.raja.cxx = ${CXX} -o $*.o -c ${CXX_FLAGS} ${CXXFLAGS} ${CXXCPPFLAGS}
147d23021a0SBarry Smithendif
148d23021a0SBarry Smith
14950dcbc5aSJunchao Zhangtestlangs := c cu cxx F F90 kokkos.cxx hip.cpp sycl.cxx raja.cxx
150513d7a9cSJed Brown$(foreach lang, $(testlangs), $(eval \
151513d7a9cSJed Brown  testexe.$(lang) = $(foreach pkg, $(pkgs), $(testsrcs-$(pkg).$(lang):%.$(lang)=$(TESTDIR)/%))))
15249da0fa4SScott Krugerconcattestlang = $(foreach lang, $(2), $(testsrcs-$(1).$(lang):%.$(lang)=$(TESTDIR)/%.o))
15349da0fa4SScott Krugertestsrcs.o := $(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),$(testlangs)))
154fc46264cSScott Krugertestsrcs-rel := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), $(testsrcs-$(pkg).$(lang))))
155fc46264cSScott Krugertestsrcs := $(foreach sfile, $(testsrcs-rel), $(TESTSRCDIR)/$(sfile))
15649da0fa4SScott Kruger
15706fe1a63SSatish Balay# workaround win32fe failure
15833a1b2deSBarry Smithifneq (,$(findstring win_,$(call quiet,$(cc_name))))
15906fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex6: | $(TESTDIR)/ts/tutorials/multirate/ex5
16006fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex8: | $(TESTDIR)/ts/tutorials/multirate/ex6
16106fe1a63SSatish Balayendif
16206fe1a63SSatish Balay
16349da0fa4SScott Kruger# Refresh testfiles when sources change, but don't balk if the source file is nonexistent (deleted)
16449da0fa4SScott Kruger$(generatedtest) : $(testsrcs)
16549da0fa4SScott Kruger$(testsrcs) :
16649da0fa4SScott Kruger
1674ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.c | $$(@D)/.DIR
16849da0fa4SScott Kruger	$(PETSC_COMPILE.c) $(abspath $<) -o $@
16949da0fa4SScott Kruger
170c0558f20SBarry Smith$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.kokkos.cxx | $$(@D)/.DIR
171c0558f20SBarry Smith	$(PETSC_COMPILE.kokkos.cxx) $(abspath $<) -o $@
172c0558f20SBarry Smith
17350dcbc5aSJunchao Zhang$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.sycl.cxx | $$(@D)/.DIR
17450dcbc5aSJunchao Zhang	$(PETSC_COMPILE.sycl.cxx) $(abspath $<) -o $@
17550dcbc5aSJunchao Zhang
176d23021a0SBarry Smith$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.raja.cxx | $$(@D)/.DIR
177d23021a0SBarry Smith	$(PETSC_COMPILE.raja.cxx) $(abspath $<) -o $@
178d23021a0SBarry Smith
1794ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cxx | $$(@D)/.DIR
18049da0fa4SScott Kruger	$(PETSC_COMPILE.cxx) $(abspath $<) -o $@
18149da0fa4SScott Kruger
1824ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cu | $$(@D)/.DIR
18349da0fa4SScott Kruger	$(PETSC_COMPILE.cu) $(abspath $<) -o $@ # Compile first so that if there is an error, it comes from a normal compile
18449da0fa4SScott Kruger	@$(PETSC_GENDEPS.cu) $(abspath $<) -o $(@:%.o=%.d) # Generate the dependencies for later
18549da0fa4SScott Kruger
1861a5aed34SJunchao Zhang$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.hip.cpp | $$(@D)/.DIR
1871a5aed34SJunchao Zhang	$(PETSC_COMPILE.hip.cpp) $(abspath $<) -o $@
1881a5aed34SJunchao Zhang
189a55d2495SJed Brown# Test modules go in the same directory as the target *.o
190a55d2495SJed BrownTESTMODDIR = $(@D)
19149da0fa4SScott KrugerFCMOD = cd
1924ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F | $$(@D)/.DIR
19349da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),)
194a55d2495SJed Brown	$(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@)
19549da0fa4SScott Krugerelse
196a55d2495SJed Brown	$(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR)
19749da0fa4SScott Krugerendif
1980266c241SJed Brown	-@$(GFORTRAN_DEP_CLEANUP)
19949da0fa4SScott Kruger
2004ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F90 | $$(@D)/.DIR
20149da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),)
202a55d2495SJed Brown	$(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@)
20349da0fa4SScott Krugerelse
204a55d2495SJed Brown	$(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR)
20549da0fa4SScott Krugerendif
2060266c241SJed Brown	-@$(GFORTRAN_DEP_CLEANUP)
2070266c241SJed Brown
208cf7d3547SScott Kruger#   This is a hack to fix a broken gfortran.
2090266c241SJed Browndefine GFORTRAN_DEP_CLEANUP
210ef0d7cd8SPierre Jolivet  if test -e "$(@:%.o=%.d)" && head -1 "$(@:%.o=%.d)" | grep -F -q -v : ; then\
2114f45eea9SScott Kruger    echo "$(@): \\" > $(@:%.o=%.dtemp) ; \
2120266c241SJed Brown    tr '\n' '@' < $(@:%.o=%.d) | cut -d: -f2- | tr '@' '\n' >> $(@:%.o=%.dtemp) ; \
2130266c241SJed Brown    mv $(@:%.o=%.dtemp) $(@:%.o=%.d); \
2144f45eea9SScott Kruger  fi
2150266c241SJed Brownendef
21649da0fa4SScott Kruger
21720844ca6SSatish Balay# link line constructed differently for gmakefile vs gmakefile.test invocation
21820844ca6SSatish Balayifeq ($(libpetscall),)
21920844ca6SSatish BalayPETSC_TEST_LIB = $(PETSC_LIB)
22020844ca6SSatish Balayelse
22120844ca6SSatish BalayPETSC_TEST_LIB = $(C_SH_LIB_PATH) $(PETSC_EXTERNAL_LIB_BASIC)
22220844ca6SSatish Balayendif
22320844ca6SSatish Balay
224bde159b7SSatish Balay# manually list some some library dependencies to check for circular dependencies
225c4762a1bSJed Brown$(TESTDIR)/sys/tests/ex9: PETSC_TEST_LIB = $(PETSC_SYS_LIB)
226c4762a1bSJed Brown$(TESTDIR)/vec/vec/tests/ex1: PETSC_TEST_LIB = $(PETSC_VEC_LIB)
227c4762a1bSJed Brown$(TESTDIR)/mat/tests/ex1: PETSC_TEST_LIB = $(PETSC_MAT_LIB)
228c4762a1bSJed Brown$(TESTDIR)/dm/tests/ex1: PETSC_TEST_LIB = $(PETSC_DM_LIB)
229c4762a1bSJed Brown$(TESTDIR)/ksp/ksp/tests/ex1: PETSC_TEST_LIB = $(PETSC_KSP_LIB)
230c4762a1bSJed Brown$(TESTDIR)/snes/tests/ex1: PETSC_TEST_LIB = $(PETSC_SNES_LIB)
231c4762a1bSJed Brown$(TESTDIR)/ts/tests/ex2: PETSC_TEST_LIB = $(PETSC_TS_LIB)
232c4762a1bSJed Brown$(TESTDIR)/tao/tutorials/ex1: PETSC_TEST_LIB = $(PETSC_TAO_LIB)
233bde159b7SSatish Balay
2347cb68e74SVaclav Hapla# MACOS FIREWALL HANDLING
2357cb68e74SVaclav Hapla# - if run with MACOS_FIREWALL=1
2367cb68e74SVaclav Hapla#   (automatically set in $PETSC_ARCH/lib/petsc/conf/petscvariables if configured --with-macos-firewall-rules),
2377cb68e74SVaclav Hapla#   ensure mpiexec and test executable is on firewall list
2387cb68e74SVaclav Hapla#
2390b148140SVaclav Haplaifeq ($(MACOS_FIREWALL),1)
2400b148140SVaclav HaplaFW := /usr/libexec/ApplicationFirewall/socketfilterfw
2417cb68e74SVaclav Hapla# There is no reliable realpath command in macOS without need for 3rd party tools like homebrew coreutils
2427cb68e74SVaclav Hapla# Using Python's realpath seems like the most robust way here
2437cb68e74SVaclav Haplarealpath-py = $(shell $(PYTHON) -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' $(1))
2447cb68e74SVaclav Hapla#
2451dcdb15bSVaclav Hapladefine macos-firewall-register
2467cb68e74SVaclav Hapla  @APP=$(call realpath-py, $(1)); \
2471855f086SVaclav Hapla    if ! sudo -n true 2>/dev/null; then printf "Asking for sudo password to add new firewall rule for\n  $$APP\n"; fi; \
2487cb68e74SVaclav Hapla    sudo $(FW) --remove $$APP --add $$APP --blockapp $$APP
2491dcdb15bSVaclav Haplaendef
2500b148140SVaclav Haplaendif
2517cb68e74SVaclav Hapla#
2527cb68e74SVaclav Haplamacos-firewall-register-mpiexec:
253961fb248SStefano Zampini	-$(call macos-firewall-register, $(MPIEXEC))
2541dcdb15bSVaclav Hapla
25549da0fa4SScott Kruger# Test executables
256513d7a9cSJed Brown$(testexe.F) $(testexe.F90) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
25720844ca6SSatish Balay	$(call quiet,FLINKER) -o $@ $^ $(PETSC_TEST_LIB)
2587cb68e74SVaclav Hapla	-$(call macos-firewall-register,$@)
25949da0fa4SScott Kruger
260accbd18bSBarry Smithifneq (,$(findstring emcc,$(CC)))
261accbd18bSBarry Smith$(testexe.c) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
262accbd18bSBarry 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)
263accbd18bSBarry Smith	-@printf '#!/usr/bin/env sh\nnode --redirect-warnings=/dev/null  $$0.js $$*  | grep -v "Heap resize call from"'  > $@
264accbd18bSBarry Smith	-@chmod u+x $@
265accbd18bSBarry Smithelse
266513d7a9cSJed Brown$(testexe.c) $(testexe.cu) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
2671c6715b8SMatthew G. Knepley	$(call quiet,CLINKER) $(EXEFLAGS) -o $@ $^ $(PETSC_TEST_LIB)
2687cb68e74SVaclav Hapla	-$(call macos-firewall-register,$@)
26949da0fa4SScott Kruger
270accbd18bSBarry Smithendif
271accbd18bSBarry Smith
2721a5aed34SJunchao Zhang$(testexe.hip.cpp) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
2731a5aed34SJunchao Zhang	$(call quiet,CLINKER) -o $@ $^ $(PETSC_TEST_LIB)
2741a5aed34SJunchao Zhang	-$(call macos-firewall-register,$@)
2751a5aed34SJunchao Zhang
276c0558f20SBarry Smith$(testexe.kokkos.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
277672b70e8SJunchao Zhang	$(call quiet,CLINKER) $(EXEFLAGS) -o $@ $^ $(PETSC_TEST_LIB)
2787cb68e74SVaclav Hapla	-$(call macos-firewall-register,$@)
279c0558f20SBarry Smith
280d23021a0SBarry Smith$(testexe.raja.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
281d23021a0SBarry Smith	$(call quiet,CLINKER) -o $@ $^ $(PETSC_TEST_LIB)
282d23021a0SBarry Smith	-$(call macos-firewall-register,$@)
283d23021a0SBarry Smith
284513d7a9cSJed Brown$(testexe.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
2852f4326f3SSatish Balay	$(call quiet,CXXLINKER) -o $@ $^ $(PETSC_TEST_LIB)
2867cb68e74SVaclav Hapla	-$(call macos-firewall-register,$@)
287513d7a9cSJed Brown
28849da0fa4SScott Kruger# Fortran source files need petsc*.mod, which isn't explicitly managed in the makefile.
28949da0fa4SScott Kruger$(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),F F90)) : $(libpetscall)
29049da0fa4SScott Kruger
29149da0fa4SScott Kruger# Testing convenience targets
292c173c275SScott Kruger.PHONY: test pre-clean
293c173c275SScott Kruger
294ff7b3809SScott Krugertest: report_tests
295c173c275SScott Kruger
29649da0fa4SScott Krugerpre-clean:
2975e361860SScott Kruger	@$(RM) -rf $(TESTDIR)/counts $(TESTLOGTAPFILE) $(TESTLOGERRFILE)
2985e361860SScott Kruger	@touch $(TESTLOGTAPFILE) $(TESTLOGERRFILE)
29927d73d1fSBarry Smith	@echo "Using MAKEFLAGS:" ${MAKEFLAGS}
30049da0fa4SScott Kruger
3014d9d3ee5SSatish Balaycheck-test-errors:
3025e361860SScott Kruger	@grep '^not ok' $(TESTLOGTAPFILE) | grep -v 'Exceeded timeout' | tee $(TESTDIR)/allgtests-tap-err.log
3034d9d3ee5SSatish Balay	@test ! -s $(TESTDIR)/allgtests-tap-err.log
3044d9d3ee5SSatish Balay
30549da0fa4SScott Kruger.PHONY: $(foreach pkg, $(pkgs), test-$(pkg) $(foreach lang, $(testlangs), test-$(pkg).$(lang) test-rm-$(pkg).$(lang)))
30649da0fa4SScott Krugertestpkgs := $(foreach pkg, $(pkgs), test-$(pkg))
30749da0fa4SScott Kruger# Targets to run tests in test-$pkg.$lang and delete the executables, language by language
30849da0fa4SScott Kruger$(testpkgs) : test-% : $(foreach lang, $(testlangs), test-rm-%.$(lang))
30949da0fa4SScott Kruger# List of raw test run targets
31049da0fa4SScott Krugeralltesttargets := $(foreach tp, $(testpkgs), $(foreach lang, $(testlangs), $($(tp).$(lang))))
31149da0fa4SScott Kruger
31249da0fa4SScott Kruger# Run targets
31349da0fa4SScott Kruger$(alltesttargets) : % : $(TESTDIR)/counts/%.counts
31449da0fa4SScott Kruger.PHONY: $(alltesttargets)
31549da0fa4SScott Kruger
31649da0fa4SScott Kruger$(TESTDIR)/counts/%.counts :
31749da0fa4SScott Kruger	$(quiettest) $< $(TESTFLAGS)
31849da0fa4SScott Kruger
31949da0fa4SScott Kruger# Targets to run tests and remove executables, by package-lang pairs.
32049da0fa4SScott Kruger# Run the tests in each batch using recursive invocation of make because
32149da0fa4SScott Kruger# we need all of them to complete before removing the executables.  Make
32249da0fa4SScott Kruger# doesn't guarantee an exploration order for the graph.  Only recursive
32349da0fa4SScott Kruger# if there is something to be done.
32449da0fa4SScott Krugeralltest-rm := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), test-rm-$(pkg).$(lang)))
32549da0fa4SScott Kruger$(alltest-rm) : test-rm-% : test-%
32649da0fa4SScott Krugerifneq ($(NO_RM),1)
32749da0fa4SScott Kruger	$(call quiet,RM) $(addprefix $(TESTDIR)/,$(basename $($(@:test-rm-%=testsrcs-%))))
32849da0fa4SScott Krugerendif
32949da0fa4SScott Kruger
33049da0fa4SScott Kruger# Remove intermediate .o files
33149da0fa4SScott Kruger# This only removes the files at the end which is insufficient
33249da0fa4SScott Kruger#.INTERMEDIATE: $(testsrcs.o:%.o=%)
33349da0fa4SScott Kruger
33449da0fa4SScott Kruger# all sources should get recompiled when petscvariables changes (i.e when configure is rerun or when petscvariables is manually edited.)
33549da0fa4SScott Kruger$(testsrcs.o) : $(petscvariables)
33649da0fa4SScott Kruger
33749da0fa4SScott Kruger%/.DIR :
33849da0fa4SScott Kruger	@mkdir -p $(@D)
33949da0fa4SScott Kruger	@touch $@
34049da0fa4SScott Kruger
34149da0fa4SScott Kruger.PRECIOUS: %/.DIR
34249da0fa4SScott Kruger
34349da0fa4SScott Kruger.SUFFIXES: # Clear .SUFFIXES because we don't use implicit rules
34449da0fa4SScott Kruger.DELETE_ON_ERROR:               # Delete likely-corrupt target file if rule fails
34549da0fa4SScott Kruger
34637ed16bcSStefano Zampini.PHONY: clean cleantest all
34749da0fa4SScott Kruger
34849da0fa4SScott Krugercleantest:
34949da0fa4SScott Kruger	${RM} -r $(TESTDIR) $(generatedtest)
35049da0fa4SScott Kruger
35149da0fa4SScott Krugerclean: cleantest
35249da0fa4SScott Kruger
35349da0fa4SScott Krugeralltest.d := $(testsrcs.o:%.o=%.d)
35449da0fa4SScott Kruger# Tell make that alltest.d are all up to date.  Without this, the include
35549da0fa4SScott Kruger# below has quadratic complexity, taking more than one second for a
35649da0fa4SScott Kruger# do-nothing build of PETSc (much worse for larger projects)
35749da0fa4SScott Kruger$(alltest.d) : ;
35849da0fa4SScott Kruger
35949da0fa4SScott Kruger-include $(alltest.d)
36049da0fa4SScott Kruger
36163cf4119SScott Kruger# Tests can be generated by searching -- see documentation below
362c9625024SScott Krugershowreport=
36385bc9deeSScott Krugerifndef searchin
36485bc9deeSScott Kruger   searchin = " "
36585bc9deeSScott Krugerendif
36685bc9deeSScott Krugerifdef i
36785bc9deeSScott Kruger   searchin = $(i)
36885bc9deeSScott Krugerendif
36958da34e9SJed Brownifdef gs
37058da34e9SJed Brown  gmakesearch = $(gs)
37158da34e9SJed Brownendif
37263cf4119SScott Krugerifdef gmakesearch
373848cfe54SJed Brown  TESTTARGETS := $(filter $(gmakesearch),$(alltesttargets))
37485bc9deeSScott Kruger  ifdef gmakesearchin
37585bc9deeSScott Kruger    TESTTARGETS2 := $(foreach v,$(TESTTARGETS),$(if $(findstring $(gmakesearchin),$(v)),$(v)))
37649da0fa4SScott Kruger    TESTTARGETS := $(TESTTARGETS2)
37749da0fa4SScott Kruger  endif
37885bc9deeSScott Krugerelse ifdef gmakesearchin
37985bc9deeSScott Kruger  TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(gmakesearchin),$(v)),$(v)))
38049da0fa4SScott Krugerelse ifdef argsearch
38149da0fa4SScott Kruger  TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(argsearch),$($(v)_ARGS)),$(v)))
38263cf4119SScott Krugerelse ifdef search
3839ea87190SJacob Faibussowitsch  TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) 'name' '$(search)')
38463cf4119SScott Krugerelse ifdef s
3859ea87190SJacob Faibussowitsch  TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) 'name' '$(s)')
386feeaa4f6SScott Krugerelse ifdef test-fail
387f1f6c4e6SStefano Zampini  TESTTARGETS := $(shell $(TESTDIR)/echofailures.sh)
3886f5e9bd5SScott Krugerelse ifdef query
3899ea87190SJacob Faibussowitsch  TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) '$(query)' '$(queryval)')
39085bc9deeSScott Krugerelse ifdef q
3919ea87190SJacob Faibussowitsch  TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) '$(q)' '$(qv)')
39249da0fa4SScott Krugerelse                            # No filter - run them all, but delete the executables as we go
39349da0fa4SScott Kruger  TESTTARGETS := $(testpkgs)
394f42deef9SScott Kruger  ifneq ($(PRINTONLY),1)
395c9625024SScott Kruger    showreport = "-s"  # Only show full report when all tests are run
396f42deef9SScott Kruger  endif
39749da0fa4SScott Krugerendif
39849da0fa4SScott Kruger
39949da0fa4SScott Kruger.PHONY: report_tests print-test
40049da0fa4SScott Kruger
40149da0fa4SScott Krugerprint-test:
4025b6dee57SScott Kruger	$(info $(TESTTARGETS))
4035b6dee57SScott Kruger	@true
40449da0fa4SScott Kruger
4056e5deea7SScott Krugershow-fail:
406b711b6a4SScott Kruger	-@$(PYTHON) $(CONFIGDIR)/report_tests.py -d $(TESTDIR)/counts -f
407b711b6a4SScott Kruger
4086e5deea7SScott Kruger
4096e5deea7SScott Kruger
410c01c7e64SJed Brown# Don't start running tests until starttime has completed
411c01c7e64SJed Brown$(alltesttargets:%=$(TESTDIR)/counts/%.counts) : starttime
412c01c7e64SJed Brown
413c01c7e64SJed Brown# Ensure that libpetsc (if it is a prerequisite) has been built and clean the counts/logs before starting timer
4147cb68e74SVaclav Haplastarttime: pre-clean $(libpetscall) macos-firewall-register-mpiexec
41527d73d1fSBarry Smith	@$(eval STARTTIME := $(shell date +%s))
41627d73d1fSBarry Smith
41727d73d1fSBarry Smithreport_tests: starttime $(TESTTARGETS)
41832f4009dSScott Kruger	@$(eval ENDTIME := $(shell date +%s))
419c9625024SScott Kruger	-@ elapsed_time=$$(($(ENDTIME)- $(STARTTIME))) && \
420c9625024SScott Kruger	$(PYTHON) $(CONFIGDIR)/report_tests.py -m $(MAKE) -d $(TESTDIR)/counts -t 5 -e $${elapsed_time} $(showreport)
42149da0fa4SScott Kruger
4225e361860SScott Krugercheck_output:
4235e361860SScott Kruger	$(PYTHON) $(CONFIGDIR)/gmakegentest.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --testdir=$(TESTDIR) --check-output
4245e361860SScott Kruger
42540a841f6SBarry Smith# If users make is a gnumake then these messages are provided even if the user does not do make -f gmakefile.test
42649da0fa4SScott KrugerHASGMAKEFILE := $(filter gmakefile,$(MAKEFILE_LIST))
42749da0fa4SScott Krugerifeq ($(HASGMAKEFILE),gmakefile)
42840a841f6SBarry Smithhelpdeps:= help-nontest
42949da0fa4SScott Krugerelse
43040a841f6SBarry Smithhelpdeps:= help-test
43149da0fa4SScott Krugerendif
43249da0fa4SScott Kruger
43340a841f6SBarry Smithhelp: help-make ${helpdeps}
43440a841f6SBarry Smith	-@echo ""
43549da0fa4SScott Kruger
43649da0fa4SScott Krugerhelp-make:
43749da0fa4SScott Kruger	-@echo
43840a841f6SBarry Smith	-@echo "Basic usage:"
43940a841f6SBarry Smith	-@echo "   make  rule <V=1 for verbose output> <other options>"
44049da0fa4SScott Kruger	-@echo
44149da0fa4SScott Kruger
44240a841f6SBarry Smithhelp-nontest:
44340a841f6SBarry Smith	-@echo "Available rules:"
44440a841f6SBarry Smith	-@echo "   all - build (update) the PETSc and related libraries in parallel"
44540a841f6SBarry Smith	-@echo "   libs - build (update) the PETSc and related libraries"
44640a841f6SBarry Smith	-@echo "   check - run a basic check that the libraries are built correctly and can be used"
44740a841f6SBarry Smith	-@echo "   "
44840a841f6SBarry Smith	-@echo "   getlinklibs - print the libraries that a PETSc application must link against"
44940a841f6SBarry Smith	-@echo "   getincludedirs - print the include directories that a PETSc application must be compiled against"
45040a841f6SBarry Smith	-@echo "   getcflags - print the C compiler flags PETSc is using"
45140a841f6SBarry Smith	-@echo "   getcxxflags - print the C++ compiler flags PETSc is using"
45240a841f6SBarry Smith	-@echo "   getfortranflags - print the Fortran compiler flags PETSc is using"
45340a841f6SBarry Smith	-@echo "   "
454*ea34bbbbSJose E. Roman	-@echo "   petsc4pytest - run the entire petsc4py test suite"
45540a841f6SBarry Smith	-@echo "   alltests - run the entire PETSc test suite"
45640a841f6SBarry Smith	-@echo "   test - use \"make -f gmakefile.test help\" for help on running the extensive tests"
45749da0fa4SScott Kruger	-@echo
45840a841f6SBarry Smith	-@echo "Developer rules:"
45940a841f6SBarry Smith	-@echo "   clean - delete libraries and Fortran module files"
46040a841f6SBarry Smith	-@echo "   lint - run lint on the source code, including its embedded documentation"
46140a841f6SBarry Smith	-@echo "   clangformat - run clangformat on the PETSc C/C++ source code"
46240a841f6SBarry Smith	-@echo "   allfortranstubs - regenerate Fortran stubs/interface definitions, needed after git pulls or source code changes"
46340a841f6SBarry Smith	-@echo "   deletefortranstubs - delete the generated Fortran stubs/interface definitions"
46440a841f6SBarry Smith	-@echo "   checkbadSource - check the source code for violations of coding standards"
46540a841f6SBarry Smith	-@echo "   abitest - Compare ABI/API of two versions of PETSc library with the old one defined by PETSC_{DIR,ARCH}_ABI_OLD"
46640a841f6SBarry Smith	-@echo "   reconfigure - delete libraries and Fortran module files and run the previously run configure again"
46740a841f6SBarry Smith	-@echo "   "
46849da0fa4SScott Kruger
46949da0fa4SScott Krugerhelp-test:
47040a841f6SBarry Smith	-@echo "Test usage:"
47140a841f6SBarry Smith	-@echo "   make -f gmakefile.test test <options>"
47249da0fa4SScott Kruger	-@echo
47349da0fa4SScott Kruger	-@echo "Options:"
47449da0fa4SScott Kruger	-@echo "  NO_RM=1           Do not remove the executables after running"
475f50802fbSScott Kruger	-@echo "  REPLACE=1         Replace the output in PETSC_DIR source tree (-m to test scripts)"
4765e361860SScott Kruger	-@echo "  OUTPUT=1          Show only the errors on stdout"
477f50802fbSScott Kruger	-@echo "  ALT=1             Replace 'alt' output in PETSC_DIR source tree (-M to test scripts)"
47849da0fa4SScott Kruger	-@echo "  DIFF_NUMBERS=1    Diff the numbers in the output (-j to test scripts and petscdiff)"
479baa5c0f4SScott Kruger	-@echo "  CUDAMEMCHECK=1    Execute the tests using cuda-memcheck (-U to test scripts)"
480636bfc99SJacob Faibussowitsch	-@echo "                    Use PETSC_CUDAMEMCHECK_COMMAND to change the executable to run and"
481636bfc99SJacob Faibussowitsch	-@echo "                    PETSC_CUDAMEMCHECK_ARGS to change the arguments (note: both"
482636bfc99SJacob Faibussowitsch	-@echo "                    cuda-memcheck and compute-sanitizer are supported)"
48349da0fa4SScott Kruger	-@echo "  VALGRIND=1        Execute the tests using valgrind (-V to test scripts)"
48485bc9deeSScott Kruger	-@echo "  DEBUG=1           Launch tests in the debugger (-d to the scripts)"
485142b82d2SScott Kruger	-@echo "  NP=<num proc>     Set a number of processors to pass to scripts."
486142b82d2SScott Kruger	-@echo "  FORCE=1           Force SKIP or TODO tests to run"
487a6f3f80dSScott Kruger	-@echo "  PRINTONLY=1       Print the command, but do not run.  For loops print first command"
488142b82d2SScott Kruger	-@echo "  TIMEOUT=<time>    Test timeout limit in seconds (default in config/petsc_harness.sh)"
489f50802fbSScott Kruger	-@echo "  TESTDIR='tests'   Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}"
49049da0fa4SScott Kruger	-@echo "                    or $${PREFIX_DIR}/$${TESTDIR}"
49149da0fa4SScott Kruger	-@echo "                    or $${PREFIX_DIR}/share/petsc/examples/$${TESTDIR})"
4924ff3c6a1SScott Kruger	-@echo "  TESTBASE='tests'   Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}"
49349da0fa4SScott Kruger	-@echo "  OPTIONS='<args>'  Override options to scripts (-a to test scripts)"
49449da0fa4SScott Kruger	-@echo "  EXTRA_OPTIONS='<args>'  Add options to scripts (-e to test scripts)"
49549da0fa4SScott Kruger	-@echo
4960b148140SVaclav Hapla	-@echo "Special options for macOS:"
4970b148140SVaclav 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"
4980b148140SVaclav Hapla	-@echo
49963cf4119SScott Kruger	-@echo "Tests can be generated by searching with multiple methods"
50063cf4119SScott Kruger	-@echo "  For general searching (using config/query_test.py):"
50163cf4119SScott Kruger	-@echo "    make -f ${makefile} test search='sys*ex2*'"
50263cf4119SScott Kruger	-@echo "   or the shortcut using s"
50363cf4119SScott Kruger	-@echo "    make -f ${makefile} test s='sys*ex2*'"
50485bc9deeSScott Kruger	-@echo "  You can also use the full path to a file directory"
50585bc9deeSScott Kruger	-@echo "    make -f ${makefile} test s='src/sys/tests/'"
506feeaa4f6SScott Kruger	-@echo
5076f5e9bd5SScott Kruger	-@echo "  To search for fields from the original test definitions:"
5086f5e9bd5SScott Kruger	-@echo "    make -f ${makefile} test query='requires' queryval='*MPI_PROCESS_SHARED_MEMORY*'"
50985bc9deeSScott Kruger	-@echo "   or the shortcut using q and qv"
51085bc9deeSScott Kruger	-@echo "    make -f ${makefile} test q='requires' qv='*MPI_PROCESS_SHARED_MEMORY*'"
51185bc9deeSScott Kruger	-@echo "  To filter results from other searches, use searchin"
51285bc9deeSScott Kruger	-@echo "    make -f ${makefile} test s='src/sys/tests/' searchin='*options*'"
51363cf4119SScott Kruger	-@echo
51463cf4119SScott Kruger	-@echo "  To re-run the last tests which failed:"
51563cf4119SScott Kruger	-@echo "    make -f ${makefile} test test-fail='1'"
51663cf4119SScott Kruger	-@echo
51749da0fa4SScott Kruger	-@echo "  To see which targets match a given pattern (useful for doing a specific target):"
51863cf4119SScott Kruger	-@echo "    make -f ${makefile} print-test search=sys*"
51949da0fa4SScott Kruger	-@echo
52049da0fa4SScott Kruger	-@echo "  To build an executable, give full path to location:"
521c4762a1bSJed Brown	-@echo '    make -f ${makefile} $${PETSC_ARCH}/tests/sys/tests/ex1'
52249da0fa4SScott Kruger	-@echo "  or make the test with NO_RM=1"
52349da0fa4SScott Kruger	-@echo
52440a841f6SBarry Smith
52540a841f6SBarry Smithhelp-targets:
52640a841f6SBarry Smith	-@echo "All makefile targets and their dependencies:"
52740a841f6SBarry Smith	-@grep ^[a-z] ${makefile} | grep : | grep -v =
52840a841f6SBarry Smith	-@echo
529