149da0fa4SScott Kruger# -*- mode: makefile-gmake -*- 2fca490e6SSatish Balay-include petscdir.mk 349da0fa4SScott Kruger 4c0558f20SBarry Smith.SUFFIXES: .F .F90 .f90 ${SUFFIXES} .PETSc .C .cc .cpp .cxx .r .rm .so .html .ad .m .tex .mtex .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 3249da0fa4SScott Kruger#workarround 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 99fca490e6SSatish Balayifneq ($(filter-out clean check,$(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 1090b119762SSatish BalayPETSC_COMPILE.c = $(call quiet,$(cc_name)) -c $(PCC_FLAGS) $(PFLAGS) $(CCPPFLAGS) $(C_DEPFLAGS) 1100b119762SSatish BalayPETSC_COMPILE.cxx = $(call quiet,CXX) -c $(CXX_FLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(CXX_DEPFLAGS) 111c0558f20SBarry Smithifneq ($(KOKKOS_BIN),) 112c0558f20SBarry Smith# Kokkos requires nvcc to be in PATH and the C++ compiler to be given in an environmental variable 113c0558f20SBarry SmithPETSC_COMPILE.kokkos.cxx = PATH=$(PATH):`dirname $(CUDAC)` NVCC_WRAPPER_DEFAULT_COMPILER=$(CXX_LINKER) $(KOKKOS_BIN)/nvcc_wrapper --expt-extended-lambda -c $(CXX_FLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) 114c0558f20SBarry SmithPETSC_LINK.kokkos.cxx = PATH=$(PATH):`dirname $(CUDAC)` NVCC_WRAPPER_DEFAULT_COMPILER=$(CXX_LINKER) $(KOKKOS_BIN)/nvcc_wrapper --expt-extended-lambda $(CXX_LINKER_FLAGS) $(PETSC_CCPPFLAGS) $(CPPFLAGS) $(LDFLAGS) 115c0558f20SBarry Smithelse 116c0558f20SBarry SmithPETSC_COMPILE.kokkos.cxx = $(call quiet,CXX) -c $(CXX_FLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(CXX_DEPFLAGS) 117c0558f20SBarry SmithPETSC_LINK.kokkos.cxx = $(CXXLINKER) $(CXX_LINKER_FLAGS) $(CXXFLAGS) $(PETSC_CCPPFLAGS) $(CPPFLAGS) $(LDFLAGS) 118c0558f20SBarry Smithendif 11982707f21SStefano ZampiniPETSC_COMPILE.cu = $(call quiet,CUDAC) -c $(CUDAC_FLAGS) $(CUFLAGS) --compiler-options="$(PCC_FLAGS) $(CXXFLAGS) $(CCPPFLAGS)" 12028f796eaSScott KrugerPETSC_COMPILE.hip.cpp = $(call quiet,HIPCC) -c $(HIPCC_FLAGS) $(HIPCCFLAGS) $(HIPCCPPFLAGS) $(HIPCC_DEPFLAGS) 12128f796eaSScott KrugerPETSC_COMPILE.sycl.cpp = $(call quiet,SYCLCPP) -c $(SYCLCPP_FLAGS) $(SYCLCPPFLAGS) $(SYCLCPPCPPFLAGS) $(SYCLCPP_DEPFLAGS) 12282707f21SStefano ZampiniPETSC_GENDEPS.cu = $(call quiet,CUDAC,.dep) --generate-dependencies --output-directory=$(@D) $(CUDAC_FLAGS) $(CUFLAGS) --compiler-options="$(PCC_FLAGS) $(CXXFLAGS) $(CCPPFLAGS)" 12349da0fa4SScott KrugerPETSC_COMPILE.F = $(call quiet,FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) 12449da0fa4SScott Kruger 125c0558f20SBarry Smithtestlangs := c cu cxx F F90 kokkos.cxx hip.cpp sycl.cpp 126513d7a9cSJed Brown$(foreach lang, $(testlangs), $(eval \ 127513d7a9cSJed Brown testexe.$(lang) = $(foreach pkg, $(pkgs), $(testsrcs-$(pkg).$(lang):%.$(lang)=$(TESTDIR)/%)))) 12849da0fa4SScott Krugerconcattestlang = $(foreach lang, $(2), $(testsrcs-$(1).$(lang):%.$(lang)=$(TESTDIR)/%.o)) 12949da0fa4SScott Krugertestsrcs.o := $(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),$(testlangs))) 130fc46264cSScott Krugertestsrcs-rel := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), $(testsrcs-$(pkg).$(lang)))) 131fc46264cSScott Krugertestsrcs := $(foreach sfile, $(testsrcs-rel), $(TESTSRCDIR)/$(sfile)) 13249da0fa4SScott Kruger 13306fe1a63SSatish Balay# workaround win32fe failure 13406fe1a63SSatish Balayifneq (,$(findstring win32fe,$(call quiet,$(cc_name)))) 13506fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex6: | $(TESTDIR)/ts/tutorials/multirate/ex5 13606fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex8: | $(TESTDIR)/ts/tutorials/multirate/ex6 13706fe1a63SSatish Balayendif 13806fe1a63SSatish Balay 13949da0fa4SScott Kruger# Refresh testfiles when sources change, but don't balk if the source file is nonexistent (deleted) 14049da0fa4SScott Kruger$(generatedtest) : $(testsrcs) 14149da0fa4SScott Kruger$(testsrcs) : 14249da0fa4SScott Kruger 1434ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.c | $$(@D)/.DIR 14449da0fa4SScott Kruger $(PETSC_COMPILE.c) $(abspath $<) -o $@ 14549da0fa4SScott Kruger 146c0558f20SBarry Smith$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.kokkos.cxx | $$(@D)/.DIR 147c0558f20SBarry Smith $(PETSC_COMPILE.kokkos.cxx) $(abspath $<) -o $@ 148c0558f20SBarry Smith 1494ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cxx | $$(@D)/.DIR 15049da0fa4SScott Kruger $(PETSC_COMPILE.cxx) $(abspath $<) -o $@ 15149da0fa4SScott Kruger 1524ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cu | $$(@D)/.DIR 15349da0fa4SScott Kruger $(PETSC_COMPILE.cu) $(abspath $<) -o $@ # Compile first so that if there is an error, it comes from a normal compile 15449da0fa4SScott Kruger @$(PETSC_GENDEPS.cu) $(abspath $<) -o $(@:%.o=%.d) # Generate the dependencies for later 15549da0fa4SScott Kruger 156a55d2495SJed Brown# Test modules go in the same directory as the target *.o 157a55d2495SJed BrownTESTMODDIR = $(@D) 15849da0fa4SScott KrugerFCMOD = cd 1594ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F | $$(@D)/.DIR 16049da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),) 161a55d2495SJed Brown $(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@) 16249da0fa4SScott Krugerelse 163a55d2495SJed Brown $(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR) 16449da0fa4SScott Krugerendif 1650266c241SJed Brown -@$(GFORTRAN_DEP_CLEANUP) 16649da0fa4SScott Kruger 1674ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F90 | $$(@D)/.DIR 16849da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),) 169a55d2495SJed Brown $(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@) 17049da0fa4SScott Krugerelse 171a55d2495SJed Brown $(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR) 17249da0fa4SScott Krugerendif 1730266c241SJed Brown -@$(GFORTRAN_DEP_CLEANUP) 1740266c241SJed Brown 175cf7d3547SScott Kruger# This is a hack to fix a broken gfortran. 1760266c241SJed Browndefine GFORTRAN_DEP_CLEANUP 1770266c241SJed Brown if test -e "$(@:%.o=%.d)" && head -1 "$(@:%.o=%.d)" | fgrep -q -v : ; then\ 1784f45eea9SScott Kruger echo "$(@): \\" > $(@:%.o=%.dtemp) ; \ 1790266c241SJed Brown tr '\n' '@' < $(@:%.o=%.d) | cut -d: -f2- | tr '@' '\n' >> $(@:%.o=%.dtemp) ; \ 1800266c241SJed Brown mv $(@:%.o=%.dtemp) $(@:%.o=%.d); \ 1814f45eea9SScott Kruger fi 1820266c241SJed Brownendef 18349da0fa4SScott Kruger 18420844ca6SSatish Balay# link line constructed differently for gmakefile vs gmakefile.test invocation 18520844ca6SSatish Balayifeq ($(libpetscall),) 18620844ca6SSatish BalayPETSC_TEST_LIB = $(PETSC_LIB) 18720844ca6SSatish Balayelse 18820844ca6SSatish BalayPETSC_TEST_LIB = $(C_SH_LIB_PATH) $(PETSC_EXTERNAL_LIB_BASIC) 18920844ca6SSatish Balayendif 19020844ca6SSatish Balay 191bde159b7SSatish Balay# manually list some some library dependencies to check for circular dependencies 192c4762a1bSJed Brown$(TESTDIR)/sys/tests/ex9: PETSC_TEST_LIB = $(PETSC_SYS_LIB) 193c4762a1bSJed Brown$(TESTDIR)/vec/vec/tests/ex1: PETSC_TEST_LIB = $(PETSC_VEC_LIB) 194c4762a1bSJed Brown$(TESTDIR)/mat/tests/ex1: PETSC_TEST_LIB = $(PETSC_MAT_LIB) 195c4762a1bSJed Brown$(TESTDIR)/dm/tests/ex1: PETSC_TEST_LIB = $(PETSC_DM_LIB) 196c4762a1bSJed Brown$(TESTDIR)/ksp/ksp/tests/ex1: PETSC_TEST_LIB = $(PETSC_KSP_LIB) 197c4762a1bSJed Brown$(TESTDIR)/snes/tests/ex1: PETSC_TEST_LIB = $(PETSC_SNES_LIB) 198c4762a1bSJed Brown$(TESTDIR)/ts/tests/ex2: PETSC_TEST_LIB = $(PETSC_TS_LIB) 199c4762a1bSJed Brown$(TESTDIR)/tao/tutorials/ex1: PETSC_TEST_LIB = $(PETSC_TAO_LIB) 200bde159b7SSatish Balay 201*0b148140SVaclav Hapla# if run with MACOS_FIREWALL=1 or MACOS_FIREWALL_REFRESH=1, ensure mpiexec.hydra and test executable is on firewall list 202*0b148140SVaclav Haplaifeq ($(MACOS_FIREWALL_REFRESH),1) 203*0b148140SVaclav Hapla# MACOS_FIREWALL_REFRESH=1 imply MACOS_FIREWALL=1 204*0b148140SVaclav HaplaMACOS_FIREWALL := 1 205*0b148140SVaclav Haplaendif 206*0b148140SVaclav Hapla 207*0b148140SVaclav Haplaifeq ($(MACOS_FIREWALL),1) 208*0b148140SVaclav HaplaMACOS_FIREWALL_MPIEXEC := $(shell $(PYTHON) -c "import os; print(os.path.realpath('$(MPIEXEC)'))") 209*0b148140SVaclav HaplaFW := /usr/libexec/ApplicationFirewall/socketfilterfw 210*0b148140SVaclav Haplaifeq ($(MACOS_FIREWALL_REFRESH),1) 2111dcdb15bSVaclav Hapladefine macos-firewall-register 2121dcdb15bSVaclav Hapla @APP=$(call abspath, $(1)); \ 213*0b148140SVaclav Hapla echo "MACOS_FIREWALL_REFRESH set => refresh firewall rule"; \ 214*0b148140SVaclav Hapla if ! sudo -n true 2>/dev/null; then echo "Asking for sudo password to add new firewall rule for\n $$APP:"; fi; \ 215*0b148140SVaclav Hapla sudo $(FW) --remove $$APP && \ 216*0b148140SVaclav Hapla sudo $(FW) --add $$APP && \ 217*0b148140SVaclav Hapla sudo $(FW) --blockapp $$APP 218*0b148140SVaclav Haplaendef 219*0b148140SVaclav Haplaelse 220*0b148140SVaclav Hapladefine macos-firewall-register 221*0b148140SVaclav Hapla @APP=$(call abspath, $(1)); \ 222*0b148140SVaclav Hapla ANS=`$(FW) --getappblocked $$APP`; \ 2231dcdb15bSVaclav Hapla if ! echo $$ANS | grep "$$APP" &> /dev/null; then \ 2241dcdb15bSVaclav Hapla if ! sudo -n true 2>/dev/null; then echo "Asking for sudo password to add new firewall rule for\n $$APP:"; fi; \ 225*0b148140SVaclav Hapla sudo $(FW) --add $$APP && \ 226*0b148140SVaclav Hapla sudo $(FW) --blockapp $$APP; \ 2271dcdb15bSVaclav Hapla else \ 2281dcdb15bSVaclav Hapla echo $$ANS; \ 2291dcdb15bSVaclav Hapla fi 2301dcdb15bSVaclav Haplaendef 231*0b148140SVaclav Haplaendif 2321dcdb15bSVaclav Hapladefine macos-firewall-fix 2331dcdb15bSVaclav Hapla $(call macos-firewall-register, $(MACOS_FIREWALL_MPIEXEC)) 2341dcdb15bSVaclav Hapla $(call macos-firewall-register, $(1)) 2351dcdb15bSVaclav Haplaendef 2361dcdb15bSVaclav Haplaendif 2371dcdb15bSVaclav Hapla 23849da0fa4SScott Kruger# Test executables 239513d7a9cSJed Brown$(testexe.F) $(testexe.F90) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 24020844ca6SSatish Balay $(call quiet,FLINKER) -o $@ $^ $(PETSC_TEST_LIB) 2411dcdb15bSVaclav Hapla -$(call macos-firewall-fix,$@) 24249da0fa4SScott Kruger 243513d7a9cSJed Brown$(testexe.c) $(testexe.cu) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 24420844ca6SSatish Balay $(call quiet,CLINKER) -o $@ $^ $(PETSC_TEST_LIB) 2451dcdb15bSVaclav Hapla -$(call macos-firewall-fix,$@) 24649da0fa4SScott Kruger 247c0558f20SBarry Smith$(testexe.kokkos.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 248c0558f20SBarry Smith $(call quiet,PETSC_LINK.kokkos.cxx) -o $@ $^ $(PETSC_TEST_LIB) 2491dcdb15bSVaclav Hapla -$(call macos-firewall-fix,$@) 250c0558f20SBarry Smith 251513d7a9cSJed Brown$(testexe.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 2522f4326f3SSatish Balay $(call quiet,CXXLINKER) -o $@ $^ $(PETSC_TEST_LIB) 2531dcdb15bSVaclav Hapla -$(call macos-firewall-fix,$@) 254513d7a9cSJed Brown 25549da0fa4SScott Kruger# Fortran source files need petsc*.mod, which isn't explicitly managed in the makefile. 25649da0fa4SScott Kruger$(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),F F90)) : $(libpetscall) 25749da0fa4SScott Kruger 25849da0fa4SScott Kruger# Testing convenience targets 259c173c275SScott Kruger.PHONY: test pre-clean 260c173c275SScott Kruger 261ff7b3809SScott Krugertest: report_tests 262c173c275SScott Kruger 26349da0fa4SScott Krugerpre-clean: 2645e361860SScott Kruger @$(RM) -rf $(TESTDIR)/counts $(TESTLOGTAPFILE) $(TESTLOGERRFILE) 2655e361860SScott Kruger @touch $(TESTLOGTAPFILE) $(TESTLOGERRFILE) 26627d73d1fSBarry Smith @echo "Using MAKEFLAGS:" ${MAKEFLAGS} 26749da0fa4SScott Kruger 2684d9d3ee5SSatish Balaycheck-test-errors: 2695e361860SScott Kruger @grep '^not ok' $(TESTLOGTAPFILE) | grep -v 'Exceeded timeout' | tee $(TESTDIR)/allgtests-tap-err.log 2704d9d3ee5SSatish Balay @test ! -s $(TESTDIR)/allgtests-tap-err.log 2714d9d3ee5SSatish Balay 27249da0fa4SScott Kruger.PHONY: $(foreach pkg, $(pkgs), test-$(pkg) $(foreach lang, $(testlangs), test-$(pkg).$(lang) test-rm-$(pkg).$(lang))) 27349da0fa4SScott Krugertestpkgs := $(foreach pkg, $(pkgs), test-$(pkg)) 27449da0fa4SScott Kruger# Targets to run tests in test-$pkg.$lang and delete the executables, language by language 27549da0fa4SScott Kruger$(testpkgs) : test-% : $(foreach lang, $(testlangs), test-rm-%.$(lang)) 27649da0fa4SScott Kruger# List of raw test run targets 27749da0fa4SScott Krugeralltesttargets := $(foreach tp, $(testpkgs), $(foreach lang, $(testlangs), $($(tp).$(lang)))) 27849da0fa4SScott Kruger 27949da0fa4SScott Kruger# Run targets 28049da0fa4SScott Kruger$(alltesttargets) : % : $(TESTDIR)/counts/%.counts 28149da0fa4SScott Kruger.PHONY: $(alltesttargets) 28249da0fa4SScott Kruger 28349da0fa4SScott Kruger$(TESTDIR)/counts/%.counts : 28449da0fa4SScott Kruger $(quiettest) $< $(TESTFLAGS) 28549da0fa4SScott Kruger 28649da0fa4SScott Kruger# Targets to run tests and remove executables, by package-lang pairs. 28749da0fa4SScott Kruger# Run the tests in each batch using recursive invocation of make because 28849da0fa4SScott Kruger# we need all of them to complete before removing the executables. Make 28949da0fa4SScott Kruger# doesn't guarantee an exploration order for the graph. Only recursive 29049da0fa4SScott Kruger# if there is something to be done. 29149da0fa4SScott Krugeralltest-rm := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), test-rm-$(pkg).$(lang))) 29249da0fa4SScott Kruger$(alltest-rm) : test-rm-% : test-% 29349da0fa4SScott Krugerifneq ($(NO_RM),1) 29449da0fa4SScott Kruger $(call quiet,RM) $(addprefix $(TESTDIR)/,$(basename $($(@:test-rm-%=testsrcs-%)))) 29549da0fa4SScott Krugerendif 29649da0fa4SScott Kruger 29749da0fa4SScott Kruger# Remove intermediate .o files 29849da0fa4SScott Kruger# This only removes the files at the end which is insufficient 29949da0fa4SScott Kruger#.INTERMEDIATE: $(testsrcs.o:%.o=%) 30049da0fa4SScott Kruger 30149da0fa4SScott Kruger# all sources should get recompiled when petscvariables changes (i.e when configure is rerun or when petscvariables is manually edited.) 30249da0fa4SScott Kruger$(testsrcs.o) : $(petscvariables) 30349da0fa4SScott Kruger 30449da0fa4SScott Kruger%/.DIR : 30549da0fa4SScott Kruger @mkdir -p $(@D) 30649da0fa4SScott Kruger @touch $@ 30749da0fa4SScott Kruger 30849da0fa4SScott Kruger.PRECIOUS: %/.DIR 30949da0fa4SScott Kruger 31049da0fa4SScott Kruger.SUFFIXES: # Clear .SUFFIXES because we don't use implicit rules 31149da0fa4SScott Kruger.DELETE_ON_ERROR: # Delete likely-corrupt target file if rule fails 31249da0fa4SScott Kruger 31337ed16bcSStefano Zampini.PHONY: clean cleantest all 31449da0fa4SScott Kruger 31549da0fa4SScott Krugercleantest: 31649da0fa4SScott Kruger ${RM} -r $(TESTDIR) $(generatedtest) 31749da0fa4SScott Kruger 31849da0fa4SScott Krugerclean: cleantest 31949da0fa4SScott Kruger 32049da0fa4SScott Krugeralltest.d := $(testsrcs.o:%.o=%.d) 32149da0fa4SScott Kruger# Tell make that alltest.d are all up to date. Without this, the include 32249da0fa4SScott Kruger# below has quadratic complexity, taking more than one second for a 32349da0fa4SScott Kruger# do-nothing build of PETSc (much worse for larger projects) 32449da0fa4SScott Kruger$(alltest.d) : ; 32549da0fa4SScott Kruger 32649da0fa4SScott Kruger-include $(alltest.d) 32749da0fa4SScott Kruger 32863cf4119SScott Kruger# Tests can be generated by searching -- see documentation below 32985bc9deeSScott Krugerifndef searchin 33085bc9deeSScott Kruger searchin = " " 33185bc9deeSScott Krugerendif 33285bc9deeSScott Krugerifdef i 33385bc9deeSScott Kruger searchin = $(i) 33485bc9deeSScott Krugerendif 33563cf4119SScott Krugerifdef gmakesearch 33649da0fa4SScott Kruger TESTTARGETS := $(filter $(search),$(alltesttargets)) 33785bc9deeSScott Kruger ifdef gmakesearchin 33885bc9deeSScott Kruger TESTTARGETS2 := $(foreach v,$(TESTTARGETS),$(if $(findstring $(gmakesearchin),$(v)),$(v))) 33949da0fa4SScott Kruger TESTTARGETS := $(TESTTARGETS2) 34049da0fa4SScott Kruger endif 34185bc9deeSScott Krugerelse ifdef gmakesearchin 34285bc9deeSScott Kruger TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(gmakesearchin),$(v)),$(v))) 34349da0fa4SScott Krugerelse ifdef argsearch 34449da0fa4SScott Kruger TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(argsearch),$($(v)_ARGS)),$(v))) 34563cf4119SScott Krugerelse ifdef search 34685bc9deeSScott Kruger TESTTARGETS := $(shell $(PYTHON) config/query_tests.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) 'name' '$(search)') 34763cf4119SScott Krugerelse ifdef s 34885bc9deeSScott Kruger TESTTARGETS := $(shell $(PYTHON) config/query_tests.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) 'name' '$(s)') 349feeaa4f6SScott Krugerelse ifdef test-fail 350feeaa4f6SScott Kruger TESTTARGETS := $(shell $(PETSC_ARCH)/tests/echofailures.sh) 3516f5e9bd5SScott Krugerelse ifdef query 35285bc9deeSScott Kruger TESTTARGETS := $(shell $(PYTHON) config/query_tests.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) '$(query)' '$(queryval)') 35385bc9deeSScott Krugerelse ifdef q 35485bc9deeSScott Kruger TESTTARGETS := $(shell $(PYTHON) config/query_tests.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) '$(q)' '$(qv)') 35549da0fa4SScott Krugerelse # No filter - run them all, but delete the executables as we go 35649da0fa4SScott Kruger TESTTARGETS := $(testpkgs) 35749da0fa4SScott Krugerendif 35849da0fa4SScott Kruger 35949da0fa4SScott Kruger.PHONY: report_tests print-test 36049da0fa4SScott Kruger 36149da0fa4SScott Krugerprint-test: 3625b6dee57SScott Kruger $(info $(TESTTARGETS)) 3635b6dee57SScott Kruger @true 36449da0fa4SScott Kruger 3656e5deea7SScott Krugershow-fail: 366b711b6a4SScott Kruger -@$(PYTHON) $(CONFIGDIR)/report_tests.py -d $(TESTDIR)/counts -f 367b711b6a4SScott Kruger 3686e5deea7SScott Kruger 3696e5deea7SScott Kruger 370c01c7e64SJed Brown# Don't start running tests until starttime has completed 371c01c7e64SJed Brown$(alltesttargets:%=$(TESTDIR)/counts/%.counts) : starttime 372c01c7e64SJed Brown 373c01c7e64SJed Brown# Ensure that libpetsc (if it is a prerequisite) has been built and clean the counts/logs before starting timer 374c01c7e64SJed Brownstarttime: pre-clean $(libpetscall) 37527d73d1fSBarry Smith @$(eval STARTTIME := $(shell date +%s)) 37627d73d1fSBarry Smith 37727d73d1fSBarry Smithreport_tests: starttime $(TESTTARGETS) 37832f4009dSScott Kruger @$(eval ENDTIME := $(shell date +%s)) 379a6f3f80dSScott Kruger -@if test ${PRINTONLY} -ne 1; then elapsed_time=$$(($(ENDTIME)- $(STARTTIME))) && \ 380a6f3f80dSScott Kruger $(PYTHON) $(CONFIGDIR)/report_tests.py -m $(MAKE) -d $(TESTDIR)/counts -t 5 -e $${elapsed_time};\ 381a6f3f80dSScott Kruger fi 38249da0fa4SScott Kruger 3835e361860SScott Krugercheck_output: 3845e361860SScott Kruger $(PYTHON) $(CONFIGDIR)/gmakegentest.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --testdir=$(TESTDIR) --check-output 3855e361860SScott Kruger 38649da0fa4SScott Kruger# Do not how how to invoke test from makefile 38749da0fa4SScott KrugerHASGMAKEFILE := $(filter gmakefile,$(MAKEFILE_LIST)) 38849da0fa4SScott Krugerifeq ($(HASGMAKEFILE),gmakefile) 38949da0fa4SScott Krugerhelpdeps:=help-make help-targets 39049da0fa4SScott Krugermakefile="gmakefile" 391142b82d2SScott Krugerother_help="To see full test help: make -f gmakefile.test help" 39249da0fa4SScott Krugerelse 39349da0fa4SScott Krugerhelpdeps:=help-make help-targets help-test 39449da0fa4SScott Krugermakefile="gmakefile.test" 395142b82d2SScott Krugerother_help="" 39649da0fa4SScott Krugerendif 39749da0fa4SScott Kruger 39849da0fa4SScott Krugerhelp: ${helpdeps} 39949da0fa4SScott Kruger -@echo "Above is from: ${helpdeps}" 400142b82d2SScott Kruger -@echo "${other_help}" 40149da0fa4SScott Kruger 40249da0fa4SScott Krugerhelp-make: 40349da0fa4SScott Kruger -@echo 40449da0fa4SScott Kruger -@echo "Basic build usage:" 40549da0fa4SScott Kruger -@echo " make -f ${makefile} <options>" 40649da0fa4SScott Kruger -@echo 40749da0fa4SScott Kruger -@echo "Options:" 40849da0fa4SScott Kruger -@echo " V=0 Very quiet builds" 40949da0fa4SScott Kruger -@echo " V=1 Verbose builds" 41049da0fa4SScott Kruger -@echo 41149da0fa4SScott Kruger 41249da0fa4SScott Krugerhelp-targets: 41349da0fa4SScott Kruger -@echo "All makefile targets and their dependencies:" 41449da0fa4SScott Kruger -@grep ^[a-z] ${makefile} | grep : | grep -v = 41549da0fa4SScott Kruger -@echo 41649da0fa4SScott Kruger -@echo 41749da0fa4SScott Kruger 41849da0fa4SScott Krugerhelp-test: 41949da0fa4SScott Kruger -@echo "Basic test usage:" 42049da0fa4SScott Kruger -@echo " make -f ${makefile} test <options>" 42149da0fa4SScott Kruger -@echo 42249da0fa4SScott Kruger -@echo "Options:" 42385bc9deeSScott Kruger -@echo " V=1 Verbose output (-v to scripts)" 42449da0fa4SScott Kruger -@echo " NO_RM=1 Do not remove the executables after running" 425f50802fbSScott Kruger -@echo " REPLACE=1 Replace the output in PETSC_DIR source tree (-m to test scripts)" 4265e361860SScott Kruger -@echo " OUTPUT=1 Show only the errors on stdout" 427f50802fbSScott Kruger -@echo " ALT=1 Replace 'alt' output in PETSC_DIR source tree (-M to test scripts)" 42849da0fa4SScott Kruger -@echo " DIFF_NUMBERS=1 Diff the numbers in the output (-j to test scripts and petscdiff)" 429baa5c0f4SScott Kruger -@echo " CUDAMEMCHECK=1 Execute the tests using cuda-memcheck (-U to test scripts)" 43049da0fa4SScott Kruger -@echo " VALGRIND=1 Execute the tests using valgrind (-V to test scripts)" 43185bc9deeSScott Kruger -@echo " DEBUG=1 Launch tests in the debugger (-d to the scripts)" 432142b82d2SScott Kruger -@echo " NP=<num proc> Set a number of processors to pass to scripts." 433142b82d2SScott Kruger -@echo " FORCE=1 Force SKIP or TODO tests to run" 434a6f3f80dSScott Kruger -@echo " PRINTONLY=1 Print the command, but do not run. For loops print first command" 435142b82d2SScott Kruger -@echo " TIMEOUT=<time> Test timeout limit in seconds (default in config/petsc_harness.sh)" 436f50802fbSScott Kruger -@echo " TESTDIR='tests' Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}" 43749da0fa4SScott Kruger -@echo " or $${PREFIX_DIR}/$${TESTDIR}" 43849da0fa4SScott Kruger -@echo " or $${PREFIX_DIR}/share/petsc/examples/$${TESTDIR})" 4394ff3c6a1SScott Kruger -@echo " TESTBASE='tests' Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}" 44049da0fa4SScott Kruger -@echo " OPTIONS='<args>' Override options to scripts (-a to test scripts)" 44149da0fa4SScott Kruger -@echo " EXTRA_OPTIONS='<args>' Add options to scripts (-e to test scripts)" 44249da0fa4SScott Kruger -@echo 443*0b148140SVaclav Hapla -@echo "Special options for macOS:" 444*0b148140SVaclav 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" 445*0b148140SVaclav Hapla -@echo " MACOS_FIREWALL_REFRESH=1 The same, but force re-addition to the list. You need to do cleantest first" 446*0b148140SVaclav Hapla -@echo 44763cf4119SScott Kruger -@echo "Tests can be generated by searching with multiple methods" 44863cf4119SScott Kruger -@echo " For general searching (using config/query_test.py):" 44963cf4119SScott Kruger -@echo " make -f ${makefile} test search='sys*ex2*'" 45063cf4119SScott Kruger -@echo " or the shortcut using s" 45163cf4119SScott Kruger -@echo " make -f ${makefile} test s='sys*ex2*'" 45285bc9deeSScott Kruger -@echo " You can also use the full path to a file directory" 45385bc9deeSScott Kruger -@echo " make -f ${makefile} test s='src/sys/tests/'" 454feeaa4f6SScott Kruger -@echo 4556f5e9bd5SScott Kruger -@echo " To search for fields from the original test definitions:" 4566f5e9bd5SScott Kruger -@echo " make -f ${makefile} test query='requires' queryval='*MPI_PROCESS_SHARED_MEMORY*'" 45785bc9deeSScott Kruger -@echo " or the shortcut using q and qv" 45885bc9deeSScott Kruger -@echo " make -f ${makefile} test q='requires' qv='*MPI_PROCESS_SHARED_MEMORY*'" 45985bc9deeSScott Kruger -@echo " To filter results from other searches, use searchin" 46085bc9deeSScott Kruger -@echo " make -f ${makefile} test s='src/sys/tests/' searchin='*options*'" 46163cf4119SScott Kruger -@echo 46263cf4119SScott Kruger -@echo " To re-run the last tests which failed:" 46363cf4119SScott Kruger -@echo " make -f ${makefile} test test-fail='1'" 46463cf4119SScott Kruger -@echo 46549da0fa4SScott Kruger -@echo " To see which targets match a given pattern (useful for doing a specific target):" 46663cf4119SScott Kruger -@echo " make -f ${makefile} print-test search=sys*" 46749da0fa4SScott Kruger -@echo 46849da0fa4SScott Kruger -@echo " To build an executable, give full path to location:" 469c4762a1bSJed Brown -@echo ' make -f ${makefile} $${PETSC_ARCH}/tests/sys/tests/ex1' 47049da0fa4SScott Kruger -@echo " or make the test with NO_RM=1" 47149da0fa4SScott Kruger -@echo 472