149da0fa4SScott Kruger# -*- mode: makefile-gmake -*- 2fca490e6SSatish Balay-include petscdir.mk 349da0fa4SScott Kruger 4239b4db5SPatrick Sanan.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 5c0558f20SBarry Smith 637ed16bcSStefano ZampiniCONFIGDIR := $(PETSC_DIR)/config 749da0fa4SScott Kruger 8fc46264cSScott Kruger# TESTSRCDIR is always relative to gmakefile.test 9fc46264cSScott Kruger# This must be before includes 105b5a9be8SJed Brownmkfile_path := $(abspath $(lastword $(MAKEFILE_LIST))) 115b5a9be8SJed BrownTESTSRCDIR := $(dir $(mkfile_path))src 12fc46264cSScott Kruger 130e03b746SBarry Smith-include $(PETSC_DIR)/$(PETSC_ARCH)/lib/petsc/conf/petscvariables 140e03b746SBarry Smith-include $(PETSC_DIR)/lib/petsc/conf/variables 1549da0fa4SScott Kruger 168e69c5ecSJed BrownTESTDIR ?= ./$(PETSC_ARCH)/tests 174ff3c6a1SScott KrugerMODDIR := $(PETSC_DIR)/$(PETSC_ARCH)/include 18e73aa2c6SSatish BalayTESTLOGTAPFILE ?= $(TESTDIR)/test_$(PETSC_ARCH)_tap.log 19e73aa2c6SSatish BalayTESTLOGERRFILE ?= $(TESTDIR)/test_$(PETSC_ARCH)_err.log 2094666443SJed BrownEXAMPLESDIR := $(TESTSRCDIR) 2149da0fa4SScott Kruger 2249da0fa4SScott Krugerpkgs := sys vec mat dm ksp snes ts tao 2349da0fa4SScott Kruger 244ff3c6a1SScott Krugerpetscconf := $(PETSC_DIR)/$(PETSC_ARCH)/include/petscconf.h 254ff3c6a1SScott Krugerpetscvariables := $(PETSC_DIR)/$(PETSC_ARCH)/lib/petsc/conf/petscvariables 268e69c5ecSJed Browngeneratedtest := $(TESTDIR)/testfiles 2749da0fa4SScott Kruger 2849da0fa4SScott Kruger.SECONDEXPANSION: # to expand $$(@D)/.DIR 2949da0fa4SScott Kruger 3049da0fa4SScott KrugerTESTFLAGS := # Initialize as simple variable 3149da0fa4SScott Kruger 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 994f08eaf7SJed Brownifneq ($(filter-out clean check info,$(MAKECMDGOALS:clean%=clean)),) 100336d78f1SSatish Balayinclude $(generatedtest) 101535b694aSJed Brownendif 10249da0fa4SScott Kruger 10349da0fa4SScott Krugerifeq ($(PETSC_LANGUAGE),CXXONLY) 10449da0fa4SScott Kruger cc_name := CXX 10549da0fa4SScott Krugerelse 10649da0fa4SScott Kruger cc_name := CC 10749da0fa4SScott Krugerendif 10849da0fa4SScott Kruger 1093761b06dSJed BrownPETSC_COMPILE.c = $(call quiet,$(cc_name)) -c $(PCC_FLAGS) $($(CLANGUAGE)FLAGS) $(CCPPFLAGS) $(C_DEPFLAGS) 1100b119762SSatish BalayPETSC_COMPILE.cxx = $(call quiet,CXX) -c $(CXX_FLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(CXX_DEPFLAGS) 111042217e8SBarry SmithPETSC_COMPILE.cu = $(call quiet,CUDAC) -c $(MPICXX_INCLUDES) $(CUDAC_FLAGS) $(CUFLAGS) --compiler-options="${PETSC_CCPPFLAGS} $(CUDACPPFLAGS) $(CUDA_CXXFLAGS)" 112042217e8SBarry SmithPETSC_COMPILE.hip.cpp = $(call quiet,HIPC) -c $(MPICXX_INCLUDES) $(HIPC_FLAGS) $(HIPPP_FLAGS) $(HIPFLAGS) $(HIPPPFLAGS) $(HIPOPTFLAGS) $(HIPC_DEPFLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(CXX_DEPFLAGS) 113042217e8SBarry SmithPETSC_COMPILE.sycl.cpp = $(call quiet,SYCLCPP) -c $(MPICXX_INCLUDES) $(SYCLCPP_FLAGS) $(SYCLCPPFLAGS) $(SYCLCPPCPPFLAGS) $(SYCLCPP_DEPFLAGS) 114042217e8SBarry SmithPETSC_GENDEPS.cu = $(call quiet,CUDAC,.dep) --generate-dependencies --output-directory=$(@D) $(MPICXX_INCLUDES) $(CUDAC_FLAGS) $(CUFLAGS) --compiler-options="${PETSC_CCPPFLAGS} $(CUDA_CXXFLAGS)" 11549da0fa4SScott KrugerPETSC_COMPILE.F = $(call quiet,FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) 11649da0fa4SScott Kruger 117600dc890SJunchao Zhangifneq ($(KOKKOS_USE_CUDA_COMPILER),) 118600dc890SJunchao Zhang # Kokkos requires nvcc to be in PATH and the C++ compiler to be given in an environmental variable 119*3013de45SJunchao Zhang PETSC_COMPILE.kokkos.cxx = PATH=`dirname $(CUDAC)`:$(PATH) NVCC_WRAPPER_DEFAULT_COMPILER="$(CUDA_CXX)" $(KOKKOS_BIN)/nvcc_wrapper --expt-extended-lambda -c $(CUDAC_FLAGS) ${PETSC_CCPPFLAGS} $(CUDACPPFLAGS) $(CUDA_CXXFLAGS) $(MPICXX_INCLUDES) 120*3013de45SJunchao Zhang PETSC_LINK.kokkos.cxx = PATH=`dirname $(CUDAC)`:$(PATH) NVCC_WRAPPER_DEFAULT_COMPILER="$(CUDA_CXX)" $(KOKKOS_BIN)/nvcc_wrapper --expt-extended-lambda $(CUDAC_FLAGS) $(MPICXX_INCLUDES) ${PETSC_CCPPFLAGS} $(CUDA_CXXFLAGS) $(CUDA_CXXLIBS) $(MPICXX_LIBS) $(LDFLAGS) 121600dc890SJunchao Zhangelse ifneq ($(KOKKOS_USE_HIP_COMPILER),) 122600dc890SJunchao Zhang PETSC_COMPILE.kokkos.cxx = $(PETSC_COMPILE.hip.cpp) 1238bc43e58SJunchao Zhang PETSC_LINK.kokkos.cxx = $(HIPC) $(HIPFLAGS) $(CXXFLAGS) $(PETSC_CCPPFLAGS) $(CPPFLAGS) $(LDFLAGS) $(MPICXX_INCLUDES) $(MPICXX_LIBS) 124600dc890SJunchao Zhangelse 125600dc890SJunchao Zhang PETSC_COMPILE.kokkos.cxx = $(PETSC_COMPILE.cxx) 126600dc890SJunchao Zhang PETSC_LINK.kokkos.cxx = $(CXXLINKER) $(CXXFLAGS) $(PETSC_CCPPFLAGS) $(CPPFLAGS) $(LDFLAGS) 127600dc890SJunchao Zhangendif 128600dc890SJunchao Zhang 129c0558f20SBarry Smithtestlangs := c cu cxx F F90 kokkos.cxx hip.cpp sycl.cpp 130513d7a9cSJed Brown$(foreach lang, $(testlangs), $(eval \ 131513d7a9cSJed Brown testexe.$(lang) = $(foreach pkg, $(pkgs), $(testsrcs-$(pkg).$(lang):%.$(lang)=$(TESTDIR)/%)))) 13249da0fa4SScott Krugerconcattestlang = $(foreach lang, $(2), $(testsrcs-$(1).$(lang):%.$(lang)=$(TESTDIR)/%.o)) 13349da0fa4SScott Krugertestsrcs.o := $(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),$(testlangs))) 134fc46264cSScott Krugertestsrcs-rel := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), $(testsrcs-$(pkg).$(lang)))) 135fc46264cSScott Krugertestsrcs := $(foreach sfile, $(testsrcs-rel), $(TESTSRCDIR)/$(sfile)) 13649da0fa4SScott Kruger 13706fe1a63SSatish Balay# workaround win32fe failure 13806fe1a63SSatish Balayifneq (,$(findstring win32fe,$(call quiet,$(cc_name)))) 13906fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex6: | $(TESTDIR)/ts/tutorials/multirate/ex5 14006fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex8: | $(TESTDIR)/ts/tutorials/multirate/ex6 14106fe1a63SSatish Balayendif 14206fe1a63SSatish Balay 14349da0fa4SScott Kruger# Refresh testfiles when sources change, but don't balk if the source file is nonexistent (deleted) 14449da0fa4SScott Kruger$(generatedtest) : $(testsrcs) 14549da0fa4SScott Kruger$(testsrcs) : 14649da0fa4SScott Kruger 1474ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.c | $$(@D)/.DIR 14849da0fa4SScott Kruger $(PETSC_COMPILE.c) $(abspath $<) -o $@ 14949da0fa4SScott Kruger 150c0558f20SBarry Smith$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.kokkos.cxx | $$(@D)/.DIR 151c0558f20SBarry Smith $(PETSC_COMPILE.kokkos.cxx) $(abspath $<) -o $@ 152c0558f20SBarry Smith 1534ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cxx | $$(@D)/.DIR 15449da0fa4SScott Kruger $(PETSC_COMPILE.cxx) $(abspath $<) -o $@ 15549da0fa4SScott Kruger 1564ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cu | $$(@D)/.DIR 15749da0fa4SScott Kruger $(PETSC_COMPILE.cu) $(abspath $<) -o $@ # Compile first so that if there is an error, it comes from a normal compile 15849da0fa4SScott Kruger @$(PETSC_GENDEPS.cu) $(abspath $<) -o $(@:%.o=%.d) # Generate the dependencies for later 15949da0fa4SScott Kruger 160a55d2495SJed Brown# Test modules go in the same directory as the target *.o 161a55d2495SJed BrownTESTMODDIR = $(@D) 16249da0fa4SScott KrugerFCMOD = cd 1634ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F | $$(@D)/.DIR 16449da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),) 165a55d2495SJed Brown $(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@) 16649da0fa4SScott Krugerelse 167a55d2495SJed Brown $(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR) 16849da0fa4SScott Krugerendif 1690266c241SJed Brown -@$(GFORTRAN_DEP_CLEANUP) 17049da0fa4SScott Kruger 1714ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F90 | $$(@D)/.DIR 17249da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),) 173a55d2495SJed Brown $(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@) 17449da0fa4SScott Krugerelse 175a55d2495SJed Brown $(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR) 17649da0fa4SScott Krugerendif 1770266c241SJed Brown -@$(GFORTRAN_DEP_CLEANUP) 1780266c241SJed Brown 179cf7d3547SScott Kruger# This is a hack to fix a broken gfortran. 1800266c241SJed Browndefine GFORTRAN_DEP_CLEANUP 1810266c241SJed Brown if test -e "$(@:%.o=%.d)" && head -1 "$(@:%.o=%.d)" | fgrep -q -v : ; then\ 1824f45eea9SScott Kruger echo "$(@): \\" > $(@:%.o=%.dtemp) ; \ 1830266c241SJed Brown tr '\n' '@' < $(@:%.o=%.d) | cut -d: -f2- | tr '@' '\n' >> $(@:%.o=%.dtemp) ; \ 1840266c241SJed Brown mv $(@:%.o=%.dtemp) $(@:%.o=%.d); \ 1854f45eea9SScott Kruger fi 1860266c241SJed Brownendef 18749da0fa4SScott Kruger 18820844ca6SSatish Balay# link line constructed differently for gmakefile vs gmakefile.test invocation 18920844ca6SSatish Balayifeq ($(libpetscall),) 19020844ca6SSatish BalayPETSC_TEST_LIB = $(PETSC_LIB) 19120844ca6SSatish Balayelse 19220844ca6SSatish BalayPETSC_TEST_LIB = $(C_SH_LIB_PATH) $(PETSC_EXTERNAL_LIB_BASIC) 19320844ca6SSatish Balayendif 19420844ca6SSatish Balay 195bde159b7SSatish Balay# manually list some some library dependencies to check for circular dependencies 196c4762a1bSJed Brown$(TESTDIR)/sys/tests/ex9: PETSC_TEST_LIB = $(PETSC_SYS_LIB) 197c4762a1bSJed Brown$(TESTDIR)/vec/vec/tests/ex1: PETSC_TEST_LIB = $(PETSC_VEC_LIB) 198c4762a1bSJed Brown$(TESTDIR)/mat/tests/ex1: PETSC_TEST_LIB = $(PETSC_MAT_LIB) 199c4762a1bSJed Brown$(TESTDIR)/dm/tests/ex1: PETSC_TEST_LIB = $(PETSC_DM_LIB) 200c4762a1bSJed Brown$(TESTDIR)/ksp/ksp/tests/ex1: PETSC_TEST_LIB = $(PETSC_KSP_LIB) 201c4762a1bSJed Brown$(TESTDIR)/snes/tests/ex1: PETSC_TEST_LIB = $(PETSC_SNES_LIB) 202c4762a1bSJed Brown$(TESTDIR)/ts/tests/ex2: PETSC_TEST_LIB = $(PETSC_TS_LIB) 203c4762a1bSJed Brown$(TESTDIR)/tao/tutorials/ex1: PETSC_TEST_LIB = $(PETSC_TAO_LIB) 204bde159b7SSatish Balay 2057cb68e74SVaclav Hapla# MACOS FIREWALL HANDLING 2067cb68e74SVaclav Hapla# - if run with MACOS_FIREWALL=1 2077cb68e74SVaclav Hapla# (automatically set in $PETSC_ARCH/lib/petsc/conf/petscvariables if configured --with-macos-firewall-rules), 2087cb68e74SVaclav Hapla# ensure mpiexec and test executable is on firewall list 2097cb68e74SVaclav Hapla# 2100b148140SVaclav Haplaifeq ($(MACOS_FIREWALL),1) 2110b148140SVaclav HaplaFW := /usr/libexec/ApplicationFirewall/socketfilterfw 2127cb68e74SVaclav Hapla# There is no reliable realpath command in macOS without need for 3rd party tools like homebrew coreutils 2137cb68e74SVaclav Hapla# Using Python's realpath seems like the most robust way here 2147cb68e74SVaclav Haplarealpath-py = $(shell $(PYTHON) -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' $(1)) 2157cb68e74SVaclav Hapla# 2161dcdb15bSVaclav Hapladefine macos-firewall-register 2177cb68e74SVaclav Hapla @APP=$(call realpath-py, $(1)); \ 2181855f086SVaclav Hapla if ! sudo -n true 2>/dev/null; then printf "Asking for sudo password to add new firewall rule for\n $$APP\n"; fi; \ 2197cb68e74SVaclav Hapla sudo $(FW) --remove $$APP --add $$APP --blockapp $$APP 2201dcdb15bSVaclav Haplaendef 2210b148140SVaclav Haplaendif 2227cb68e74SVaclav Hapla# 2237cb68e74SVaclav Haplamacos-firewall-register-mpiexec: 2247cb68e74SVaclav Hapla -$(call macos-firewall-register, $(MPIEXECEXECUTABLE)) 2251dcdb15bSVaclav Hapla 22649da0fa4SScott Kruger# Test executables 227513d7a9cSJed Brown$(testexe.F) $(testexe.F90) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 22820844ca6SSatish Balay $(call quiet,FLINKER) -o $@ $^ $(PETSC_TEST_LIB) 2297cb68e74SVaclav Hapla -$(call macos-firewall-register,$@) 23049da0fa4SScott Kruger 231513d7a9cSJed Brown$(testexe.c) $(testexe.cu) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 23220844ca6SSatish Balay $(call quiet,CLINKER) -o $@ $^ $(PETSC_TEST_LIB) 2337cb68e74SVaclav Hapla -$(call macos-firewall-register,$@) 23449da0fa4SScott Kruger 235c0558f20SBarry Smith$(testexe.kokkos.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 236c0558f20SBarry Smith $(call quiet,PETSC_LINK.kokkos.cxx) -o $@ $^ $(PETSC_TEST_LIB) 2377cb68e74SVaclav Hapla -$(call macos-firewall-register,$@) 238c0558f20SBarry Smith 239513d7a9cSJed Brown$(testexe.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 2402f4326f3SSatish Balay $(call quiet,CXXLINKER) -o $@ $^ $(PETSC_TEST_LIB) 2417cb68e74SVaclav Hapla -$(call macos-firewall-register,$@) 242513d7a9cSJed Brown 24349da0fa4SScott Kruger# Fortran source files need petsc*.mod, which isn't explicitly managed in the makefile. 24449da0fa4SScott Kruger$(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),F F90)) : $(libpetscall) 24549da0fa4SScott Kruger 24649da0fa4SScott Kruger# Testing convenience targets 247c173c275SScott Kruger.PHONY: test pre-clean 248c173c275SScott Kruger 249ff7b3809SScott Krugertest: report_tests 250c173c275SScott Kruger 25149da0fa4SScott Krugerpre-clean: 2525e361860SScott Kruger @$(RM) -rf $(TESTDIR)/counts $(TESTLOGTAPFILE) $(TESTLOGERRFILE) 2535e361860SScott Kruger @touch $(TESTLOGTAPFILE) $(TESTLOGERRFILE) 25427d73d1fSBarry Smith @echo "Using MAKEFLAGS:" ${MAKEFLAGS} 25549da0fa4SScott Kruger 2564d9d3ee5SSatish Balaycheck-test-errors: 2575e361860SScott Kruger @grep '^not ok' $(TESTLOGTAPFILE) | grep -v 'Exceeded timeout' | tee $(TESTDIR)/allgtests-tap-err.log 2584d9d3ee5SSatish Balay @test ! -s $(TESTDIR)/allgtests-tap-err.log 2594d9d3ee5SSatish Balay 26049da0fa4SScott Kruger.PHONY: $(foreach pkg, $(pkgs), test-$(pkg) $(foreach lang, $(testlangs), test-$(pkg).$(lang) test-rm-$(pkg).$(lang))) 26149da0fa4SScott Krugertestpkgs := $(foreach pkg, $(pkgs), test-$(pkg)) 26249da0fa4SScott Kruger# Targets to run tests in test-$pkg.$lang and delete the executables, language by language 26349da0fa4SScott Kruger$(testpkgs) : test-% : $(foreach lang, $(testlangs), test-rm-%.$(lang)) 26449da0fa4SScott Kruger# List of raw test run targets 26549da0fa4SScott Krugeralltesttargets := $(foreach tp, $(testpkgs), $(foreach lang, $(testlangs), $($(tp).$(lang)))) 26649da0fa4SScott Kruger 26749da0fa4SScott Kruger# Run targets 26849da0fa4SScott Kruger$(alltesttargets) : % : $(TESTDIR)/counts/%.counts 26949da0fa4SScott Kruger.PHONY: $(alltesttargets) 27049da0fa4SScott Kruger 27149da0fa4SScott Kruger$(TESTDIR)/counts/%.counts : 27249da0fa4SScott Kruger $(quiettest) $< $(TESTFLAGS) 27349da0fa4SScott Kruger 27449da0fa4SScott Kruger# Targets to run tests and remove executables, by package-lang pairs. 27549da0fa4SScott Kruger# Run the tests in each batch using recursive invocation of make because 27649da0fa4SScott Kruger# we need all of them to complete before removing the executables. Make 27749da0fa4SScott Kruger# doesn't guarantee an exploration order for the graph. Only recursive 27849da0fa4SScott Kruger# if there is something to be done. 27949da0fa4SScott Krugeralltest-rm := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), test-rm-$(pkg).$(lang))) 28049da0fa4SScott Kruger$(alltest-rm) : test-rm-% : test-% 28149da0fa4SScott Krugerifneq ($(NO_RM),1) 28249da0fa4SScott Kruger $(call quiet,RM) $(addprefix $(TESTDIR)/,$(basename $($(@:test-rm-%=testsrcs-%)))) 28349da0fa4SScott Krugerendif 28449da0fa4SScott Kruger 28549da0fa4SScott Kruger# Remove intermediate .o files 28649da0fa4SScott Kruger# This only removes the files at the end which is insufficient 28749da0fa4SScott Kruger#.INTERMEDIATE: $(testsrcs.o:%.o=%) 28849da0fa4SScott Kruger 28949da0fa4SScott Kruger# all sources should get recompiled when petscvariables changes (i.e when configure is rerun or when petscvariables is manually edited.) 29049da0fa4SScott Kruger$(testsrcs.o) : $(petscvariables) 29149da0fa4SScott Kruger 29249da0fa4SScott Kruger%/.DIR : 29349da0fa4SScott Kruger @mkdir -p $(@D) 29449da0fa4SScott Kruger @touch $@ 29549da0fa4SScott Kruger 29649da0fa4SScott Kruger.PRECIOUS: %/.DIR 29749da0fa4SScott Kruger 29849da0fa4SScott Kruger.SUFFIXES: # Clear .SUFFIXES because we don't use implicit rules 29949da0fa4SScott Kruger.DELETE_ON_ERROR: # Delete likely-corrupt target file if rule fails 30049da0fa4SScott Kruger 30137ed16bcSStefano Zampini.PHONY: clean cleantest all 30249da0fa4SScott Kruger 30349da0fa4SScott Krugercleantest: 30449da0fa4SScott Kruger ${RM} -r $(TESTDIR) $(generatedtest) 30549da0fa4SScott Kruger 30649da0fa4SScott Krugerclean: cleantest 30749da0fa4SScott Kruger 30849da0fa4SScott Krugeralltest.d := $(testsrcs.o:%.o=%.d) 30949da0fa4SScott Kruger# Tell make that alltest.d are all up to date. Without this, the include 31049da0fa4SScott Kruger# below has quadratic complexity, taking more than one second for a 31149da0fa4SScott Kruger# do-nothing build of PETSc (much worse for larger projects) 31249da0fa4SScott Kruger$(alltest.d) : ; 31349da0fa4SScott Kruger 31449da0fa4SScott Kruger-include $(alltest.d) 31549da0fa4SScott Kruger 31663cf4119SScott Kruger# Tests can be generated by searching -- see documentation below 317c9625024SScott Krugershowreport= 31885bc9deeSScott Krugerifndef searchin 31985bc9deeSScott Kruger searchin = " " 32085bc9deeSScott Krugerendif 32185bc9deeSScott Krugerifdef i 32285bc9deeSScott Kruger searchin = $(i) 32385bc9deeSScott Krugerendif 32463cf4119SScott Krugerifdef gmakesearch 325848cfe54SJed Brown TESTTARGETS := $(filter $(gmakesearch),$(alltesttargets)) 32685bc9deeSScott Kruger ifdef gmakesearchin 32785bc9deeSScott Kruger TESTTARGETS2 := $(foreach v,$(TESTTARGETS),$(if $(findstring $(gmakesearchin),$(v)),$(v))) 32849da0fa4SScott Kruger TESTTARGETS := $(TESTTARGETS2) 32949da0fa4SScott Kruger endif 33085bc9deeSScott Krugerelse ifdef gmakesearchin 33185bc9deeSScott Kruger TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(gmakesearchin),$(v)),$(v))) 33249da0fa4SScott Krugerelse ifdef argsearch 33349da0fa4SScott Kruger TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(argsearch),$($(v)_ARGS)),$(v))) 33463cf4119SScott Krugerelse ifdef search 33558780e5dSStefano Zampini TESTTARGETS := $(shell $(PYTHON) config/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) 'name' '$(search)') 33663cf4119SScott Krugerelse ifdef s 33758780e5dSStefano Zampini TESTTARGETS := $(shell $(PYTHON) config/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) 'name' '$(s)') 338feeaa4f6SScott Krugerelse ifdef test-fail 339f1f6c4e6SStefano Zampini TESTTARGETS := $(shell $(TESTDIR)/echofailures.sh) 3406f5e9bd5SScott Krugerelse ifdef query 34158780e5dSStefano Zampini TESTTARGETS := $(shell $(PYTHON) config/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) '$(query)' '$(queryval)') 34285bc9deeSScott Krugerelse ifdef q 34358780e5dSStefano Zampini TESTTARGETS := $(shell $(PYTHON) config/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) '$(q)' '$(qv)') 34449da0fa4SScott Krugerelse # No filter - run them all, but delete the executables as we go 34549da0fa4SScott Kruger TESTTARGETS := $(testpkgs) 346f42deef9SScott Kruger ifneq ($(PRINTONLY),1) 347c9625024SScott Kruger showreport = "-s" # Only show full report when all tests are run 348f42deef9SScott Kruger endif 34949da0fa4SScott Krugerendif 35049da0fa4SScott Kruger 35149da0fa4SScott Kruger.PHONY: report_tests print-test 35249da0fa4SScott Kruger 35349da0fa4SScott Krugerprint-test: 3545b6dee57SScott Kruger $(info $(TESTTARGETS)) 3555b6dee57SScott Kruger @true 35649da0fa4SScott Kruger 3576e5deea7SScott Krugershow-fail: 358b711b6a4SScott Kruger -@$(PYTHON) $(CONFIGDIR)/report_tests.py -d $(TESTDIR)/counts -f 359b711b6a4SScott Kruger 3606e5deea7SScott Kruger 3616e5deea7SScott Kruger 362c01c7e64SJed Brown# Don't start running tests until starttime has completed 363c01c7e64SJed Brown$(alltesttargets:%=$(TESTDIR)/counts/%.counts) : starttime 364c01c7e64SJed Brown 365c01c7e64SJed Brown# Ensure that libpetsc (if it is a prerequisite) has been built and clean the counts/logs before starting timer 3667cb68e74SVaclav Haplastarttime: pre-clean $(libpetscall) macos-firewall-register-mpiexec 36727d73d1fSBarry Smith @$(eval STARTTIME := $(shell date +%s)) 36827d73d1fSBarry Smith 36927d73d1fSBarry Smithreport_tests: starttime $(TESTTARGETS) 37032f4009dSScott Kruger @$(eval ENDTIME := $(shell date +%s)) 371c9625024SScott Kruger -@ elapsed_time=$$(($(ENDTIME)- $(STARTTIME))) && \ 372c9625024SScott Kruger $(PYTHON) $(CONFIGDIR)/report_tests.py -m $(MAKE) -d $(TESTDIR)/counts -t 5 -e $${elapsed_time} $(showreport) 37349da0fa4SScott Kruger 3745e361860SScott Krugercheck_output: 3755e361860SScott Kruger $(PYTHON) $(CONFIGDIR)/gmakegentest.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --testdir=$(TESTDIR) --check-output 3765e361860SScott Kruger 37749da0fa4SScott Kruger# Do not how how to invoke test from makefile 37849da0fa4SScott KrugerHASGMAKEFILE := $(filter gmakefile,$(MAKEFILE_LIST)) 37949da0fa4SScott Krugerifeq ($(HASGMAKEFILE),gmakefile) 38049da0fa4SScott Krugerhelpdeps:=help-make help-targets 38149da0fa4SScott Krugermakefile="gmakefile" 382142b82d2SScott Krugerother_help="To see full test help: make -f gmakefile.test help" 38349da0fa4SScott Krugerelse 38449da0fa4SScott Krugerhelpdeps:=help-make help-targets help-test 38549da0fa4SScott Krugermakefile="gmakefile.test" 386142b82d2SScott Krugerother_help="" 38749da0fa4SScott Krugerendif 38849da0fa4SScott Kruger 38949da0fa4SScott Krugerhelp: ${helpdeps} 39049da0fa4SScott Kruger -@echo "Above is from: ${helpdeps}" 391142b82d2SScott Kruger -@echo "${other_help}" 39249da0fa4SScott Kruger 39349da0fa4SScott Krugerhelp-make: 39449da0fa4SScott Kruger -@echo 39549da0fa4SScott Kruger -@echo "Basic build usage:" 39649da0fa4SScott Kruger -@echo " make -f ${makefile} <options>" 39749da0fa4SScott Kruger -@echo 39849da0fa4SScott Kruger -@echo "Options:" 39949da0fa4SScott Kruger -@echo " V=0 Very quiet builds" 40049da0fa4SScott Kruger -@echo " V=1 Verbose builds" 40149da0fa4SScott Kruger -@echo 40249da0fa4SScott Kruger 40349da0fa4SScott Krugerhelp-targets: 40449da0fa4SScott Kruger -@echo "All makefile targets and their dependencies:" 40549da0fa4SScott Kruger -@grep ^[a-z] ${makefile} | grep : | grep -v = 40649da0fa4SScott Kruger -@echo 40749da0fa4SScott Kruger -@echo 40849da0fa4SScott Kruger 40949da0fa4SScott Krugerhelp-test: 41049da0fa4SScott Kruger -@echo "Basic test usage:" 41149da0fa4SScott Kruger -@echo " make -f ${makefile} test <options>" 41249da0fa4SScott Kruger -@echo 41349da0fa4SScott Kruger -@echo "Options:" 41485bc9deeSScott Kruger -@echo " V=1 Verbose output (-v to scripts)" 41549da0fa4SScott Kruger -@echo " NO_RM=1 Do not remove the executables after running" 416f50802fbSScott Kruger -@echo " REPLACE=1 Replace the output in PETSC_DIR source tree (-m to test scripts)" 4175e361860SScott Kruger -@echo " OUTPUT=1 Show only the errors on stdout" 418f50802fbSScott Kruger -@echo " ALT=1 Replace 'alt' output in PETSC_DIR source tree (-M to test scripts)" 41949da0fa4SScott Kruger -@echo " DIFF_NUMBERS=1 Diff the numbers in the output (-j to test scripts and petscdiff)" 420baa5c0f4SScott Kruger -@echo " CUDAMEMCHECK=1 Execute the tests using cuda-memcheck (-U to test scripts)" 42149da0fa4SScott Kruger -@echo " VALGRIND=1 Execute the tests using valgrind (-V to test scripts)" 42285bc9deeSScott Kruger -@echo " DEBUG=1 Launch tests in the debugger (-d to the scripts)" 423142b82d2SScott Kruger -@echo " NP=<num proc> Set a number of processors to pass to scripts." 424142b82d2SScott Kruger -@echo " FORCE=1 Force SKIP or TODO tests to run" 425a6f3f80dSScott Kruger -@echo " PRINTONLY=1 Print the command, but do not run. For loops print first command" 426142b82d2SScott Kruger -@echo " TIMEOUT=<time> Test timeout limit in seconds (default in config/petsc_harness.sh)" 427f50802fbSScott Kruger -@echo " TESTDIR='tests' Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}" 42849da0fa4SScott Kruger -@echo " or $${PREFIX_DIR}/$${TESTDIR}" 42949da0fa4SScott Kruger -@echo " or $${PREFIX_DIR}/share/petsc/examples/$${TESTDIR})" 4304ff3c6a1SScott Kruger -@echo " TESTBASE='tests' Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}" 43149da0fa4SScott Kruger -@echo " OPTIONS='<args>' Override options to scripts (-a to test scripts)" 43249da0fa4SScott Kruger -@echo " EXTRA_OPTIONS='<args>' Add options to scripts (-e to test scripts)" 43349da0fa4SScott Kruger -@echo 4340b148140SVaclav Hapla -@echo "Special options for macOS:" 4350b148140SVaclav 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" 4360b148140SVaclav Hapla -@echo 43763cf4119SScott Kruger -@echo "Tests can be generated by searching with multiple methods" 43863cf4119SScott Kruger -@echo " For general searching (using config/query_test.py):" 43963cf4119SScott Kruger -@echo " make -f ${makefile} test search='sys*ex2*'" 44063cf4119SScott Kruger -@echo " or the shortcut using s" 44163cf4119SScott Kruger -@echo " make -f ${makefile} test s='sys*ex2*'" 44285bc9deeSScott Kruger -@echo " You can also use the full path to a file directory" 44385bc9deeSScott Kruger -@echo " make -f ${makefile} test s='src/sys/tests/'" 444feeaa4f6SScott Kruger -@echo 4456f5e9bd5SScott Kruger -@echo " To search for fields from the original test definitions:" 4466f5e9bd5SScott Kruger -@echo " make -f ${makefile} test query='requires' queryval='*MPI_PROCESS_SHARED_MEMORY*'" 44785bc9deeSScott Kruger -@echo " or the shortcut using q and qv" 44885bc9deeSScott Kruger -@echo " make -f ${makefile} test q='requires' qv='*MPI_PROCESS_SHARED_MEMORY*'" 44985bc9deeSScott Kruger -@echo " To filter results from other searches, use searchin" 45085bc9deeSScott Kruger -@echo " make -f ${makefile} test s='src/sys/tests/' searchin='*options*'" 45163cf4119SScott Kruger -@echo 45263cf4119SScott Kruger -@echo " To re-run the last tests which failed:" 45363cf4119SScott Kruger -@echo " make -f ${makefile} test test-fail='1'" 45463cf4119SScott Kruger -@echo 45549da0fa4SScott Kruger -@echo " To see which targets match a given pattern (useful for doing a specific target):" 45663cf4119SScott Kruger -@echo " make -f ${makefile} print-test search=sys*" 45749da0fa4SScott Kruger -@echo 45849da0fa4SScott Kruger -@echo " To build an executable, give full path to location:" 459c4762a1bSJed Brown -@echo ' make -f ${makefile} $${PETSC_ARCH}/tests/sys/tests/ex1' 46049da0fa4SScott Kruger -@echo " or make the test with NO_RM=1" 46149da0fa4SScott Kruger -@echo 462