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 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)" 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) 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 1193013de45SJunchao 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) 1203013de45SJunchao 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) 12450dcbc5aSJunchao Zhangelse ifneq ($(KOKKOS_USE_SYCL_COMPILER),) 12550dcbc5aSJunchao Zhang PETSC_COMPILE.kokkos.cxx = $(PETSC_COMPILE.sycl.cxx) 12650dcbc5aSJunchao Zhang PETSC_LINK.kokkos.cxx = $(SYCLC) $(SYCLFLAGS) $(CXXFLAGS) $(PETSC_CCPPFLAGS) $(CPPFLAGS) $(LDFLAGS) $(MPICXX_INCLUDES) $(MPICXX_LIBS) 127600dc890SJunchao Zhangelse 128600dc890SJunchao Zhang PETSC_COMPILE.kokkos.cxx = $(PETSC_COMPILE.cxx) 129600dc890SJunchao Zhang PETSC_LINK.kokkos.cxx = $(CXXLINKER) $(CXXFLAGS) $(PETSC_CCPPFLAGS) $(CPPFLAGS) $(LDFLAGS) 130600dc890SJunchao Zhangendif 131600dc890SJunchao Zhang 132d23021a0SBarry Smithifneq ($(RAJA_USE_CUDA_COMPILER),) 133d23021a0SBarry Smith PETSC_COMPILE.raja.cxx = ${CUDAC} $(MPICXX_INCLUDES) ${CUDAC_FLAGS} ${CUFLAGS} -x cu -Xcudafe "--display_error_number" -c --compiler-options="${PETSC_CCPPFLAGS} ${PETSC_CC_INCLUDES} ${CUDA_CXXFLAGS}" --expt-extended-lambda --expt-relaxed-constexpr 134d23021a0SBarry Smithelse 135d23021a0SBarry Smith PETSC_COMPILE.raja.cxx = ${CXX} -o $*.o -c ${CXX_FLAGS} ${CXXFLAGS} ${CXXCPPFLAGS} 136d23021a0SBarry Smithendif 137d23021a0SBarry Smith 13850dcbc5aSJunchao Zhangtestlangs := c cu cxx F F90 kokkos.cxx hip.cpp sycl.cxx raja.cxx 139513d7a9cSJed Brown$(foreach lang, $(testlangs), $(eval \ 140513d7a9cSJed Brown testexe.$(lang) = $(foreach pkg, $(pkgs), $(testsrcs-$(pkg).$(lang):%.$(lang)=$(TESTDIR)/%)))) 14149da0fa4SScott Krugerconcattestlang = $(foreach lang, $(2), $(testsrcs-$(1).$(lang):%.$(lang)=$(TESTDIR)/%.o)) 14249da0fa4SScott Krugertestsrcs.o := $(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),$(testlangs))) 143fc46264cSScott Krugertestsrcs-rel := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), $(testsrcs-$(pkg).$(lang)))) 144fc46264cSScott Krugertestsrcs := $(foreach sfile, $(testsrcs-rel), $(TESTSRCDIR)/$(sfile)) 14549da0fa4SScott Kruger 14606fe1a63SSatish Balay# workaround win32fe failure 14706fe1a63SSatish Balayifneq (,$(findstring win32fe,$(call quiet,$(cc_name)))) 14806fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex6: | $(TESTDIR)/ts/tutorials/multirate/ex5 14906fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex8: | $(TESTDIR)/ts/tutorials/multirate/ex6 15006fe1a63SSatish Balayendif 15106fe1a63SSatish Balay 15249da0fa4SScott Kruger# Refresh testfiles when sources change, but don't balk if the source file is nonexistent (deleted) 15349da0fa4SScott Kruger$(generatedtest) : $(testsrcs) 15449da0fa4SScott Kruger$(testsrcs) : 15549da0fa4SScott Kruger 1564ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.c | $$(@D)/.DIR 15749da0fa4SScott Kruger $(PETSC_COMPILE.c) $(abspath $<) -o $@ 15849da0fa4SScott Kruger 159c0558f20SBarry Smith$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.kokkos.cxx | $$(@D)/.DIR 160c0558f20SBarry Smith $(PETSC_COMPILE.kokkos.cxx) $(abspath $<) -o $@ 161c0558f20SBarry Smith 16250dcbc5aSJunchao Zhang$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.sycl.cxx | $$(@D)/.DIR 16350dcbc5aSJunchao Zhang $(PETSC_COMPILE.sycl.cxx) $(abspath $<) -o $@ 16450dcbc5aSJunchao Zhang 165d23021a0SBarry Smith$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.raja.cxx | $$(@D)/.DIR 166d23021a0SBarry Smith $(PETSC_COMPILE.raja.cxx) $(abspath $<) -o $@ 167d23021a0SBarry Smith 1684ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cxx | $$(@D)/.DIR 16949da0fa4SScott Kruger $(PETSC_COMPILE.cxx) $(abspath $<) -o $@ 17049da0fa4SScott Kruger 1714ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cu | $$(@D)/.DIR 17249da0fa4SScott Kruger $(PETSC_COMPILE.cu) $(abspath $<) -o $@ # Compile first so that if there is an error, it comes from a normal compile 17349da0fa4SScott Kruger @$(PETSC_GENDEPS.cu) $(abspath $<) -o $(@:%.o=%.d) # Generate the dependencies for later 17449da0fa4SScott Kruger 175*1a5aed34SJunchao Zhang$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.hip.cpp | $$(@D)/.DIR 176*1a5aed34SJunchao Zhang $(PETSC_COMPILE.hip.cpp) $(abspath $<) -o $@ 177*1a5aed34SJunchao Zhang 178a55d2495SJed Brown# Test modules go in the same directory as the target *.o 179a55d2495SJed BrownTESTMODDIR = $(@D) 18049da0fa4SScott KrugerFCMOD = cd 1814ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F | $$(@D)/.DIR 18249da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),) 183a55d2495SJed Brown $(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@) 18449da0fa4SScott Krugerelse 185a55d2495SJed Brown $(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR) 18649da0fa4SScott Krugerendif 1870266c241SJed Brown -@$(GFORTRAN_DEP_CLEANUP) 18849da0fa4SScott Kruger 1894ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F90 | $$(@D)/.DIR 19049da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),) 191a55d2495SJed Brown $(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@) 19249da0fa4SScott Krugerelse 193a55d2495SJed Brown $(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR) 19449da0fa4SScott Krugerendif 1950266c241SJed Brown -@$(GFORTRAN_DEP_CLEANUP) 1960266c241SJed Brown 197cf7d3547SScott Kruger# This is a hack to fix a broken gfortran. 1980266c241SJed Browndefine GFORTRAN_DEP_CLEANUP 1990266c241SJed Brown if test -e "$(@:%.o=%.d)" && head -1 "$(@:%.o=%.d)" | fgrep -q -v : ; then\ 2004f45eea9SScott Kruger echo "$(@): \\" > $(@:%.o=%.dtemp) ; \ 2010266c241SJed Brown tr '\n' '@' < $(@:%.o=%.d) | cut -d: -f2- | tr '@' '\n' >> $(@:%.o=%.dtemp) ; \ 2020266c241SJed Brown mv $(@:%.o=%.dtemp) $(@:%.o=%.d); \ 2034f45eea9SScott Kruger fi 2040266c241SJed Brownendef 20549da0fa4SScott Kruger 20620844ca6SSatish Balay# link line constructed differently for gmakefile vs gmakefile.test invocation 20720844ca6SSatish Balayifeq ($(libpetscall),) 20820844ca6SSatish BalayPETSC_TEST_LIB = $(PETSC_LIB) 20920844ca6SSatish Balayelse 21020844ca6SSatish BalayPETSC_TEST_LIB = $(C_SH_LIB_PATH) $(PETSC_EXTERNAL_LIB_BASIC) 21120844ca6SSatish Balayendif 21220844ca6SSatish Balay 213bde159b7SSatish Balay# manually list some some library dependencies to check for circular dependencies 214c4762a1bSJed Brown$(TESTDIR)/sys/tests/ex9: PETSC_TEST_LIB = $(PETSC_SYS_LIB) 215c4762a1bSJed Brown$(TESTDIR)/vec/vec/tests/ex1: PETSC_TEST_LIB = $(PETSC_VEC_LIB) 216c4762a1bSJed Brown$(TESTDIR)/mat/tests/ex1: PETSC_TEST_LIB = $(PETSC_MAT_LIB) 217c4762a1bSJed Brown$(TESTDIR)/dm/tests/ex1: PETSC_TEST_LIB = $(PETSC_DM_LIB) 218c4762a1bSJed Brown$(TESTDIR)/ksp/ksp/tests/ex1: PETSC_TEST_LIB = $(PETSC_KSP_LIB) 219c4762a1bSJed Brown$(TESTDIR)/snes/tests/ex1: PETSC_TEST_LIB = $(PETSC_SNES_LIB) 220c4762a1bSJed Brown$(TESTDIR)/ts/tests/ex2: PETSC_TEST_LIB = $(PETSC_TS_LIB) 221c4762a1bSJed Brown$(TESTDIR)/tao/tutorials/ex1: PETSC_TEST_LIB = $(PETSC_TAO_LIB) 222bde159b7SSatish Balay 2237cb68e74SVaclav Hapla# MACOS FIREWALL HANDLING 2247cb68e74SVaclav Hapla# - if run with MACOS_FIREWALL=1 2257cb68e74SVaclav Hapla# (automatically set in $PETSC_ARCH/lib/petsc/conf/petscvariables if configured --with-macos-firewall-rules), 2267cb68e74SVaclav Hapla# ensure mpiexec and test executable is on firewall list 2277cb68e74SVaclav Hapla# 2280b148140SVaclav Haplaifeq ($(MACOS_FIREWALL),1) 2290b148140SVaclav HaplaFW := /usr/libexec/ApplicationFirewall/socketfilterfw 2307cb68e74SVaclav Hapla# There is no reliable realpath command in macOS without need for 3rd party tools like homebrew coreutils 2317cb68e74SVaclav Hapla# Using Python's realpath seems like the most robust way here 2327cb68e74SVaclav Haplarealpath-py = $(shell $(PYTHON) -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' $(1)) 2337cb68e74SVaclav Hapla# 2341dcdb15bSVaclav Hapladefine macos-firewall-register 2357cb68e74SVaclav Hapla @APP=$(call realpath-py, $(1)); \ 2361855f086SVaclav Hapla if ! sudo -n true 2>/dev/null; then printf "Asking for sudo password to add new firewall rule for\n $$APP\n"; fi; \ 2377cb68e74SVaclav Hapla sudo $(FW) --remove $$APP --add $$APP --blockapp $$APP 2381dcdb15bSVaclav Haplaendef 2390b148140SVaclav Haplaendif 2407cb68e74SVaclav Hapla# 2417cb68e74SVaclav Haplamacos-firewall-register-mpiexec: 242961fb248SStefano Zampini -$(call macos-firewall-register, $(MPIEXEC)) 2431dcdb15bSVaclav Hapla 24449da0fa4SScott Kruger# Test executables 245513d7a9cSJed Brown$(testexe.F) $(testexe.F90) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 24620844ca6SSatish Balay $(call quiet,FLINKER) -o $@ $^ $(PETSC_TEST_LIB) 2477cb68e74SVaclav Hapla -$(call macos-firewall-register,$@) 24849da0fa4SScott Kruger 249513d7a9cSJed Brown$(testexe.c) $(testexe.cu) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 25020844ca6SSatish Balay $(call quiet,CLINKER) -o $@ $^ $(PETSC_TEST_LIB) 2517cb68e74SVaclav Hapla -$(call macos-firewall-register,$@) 25249da0fa4SScott Kruger 253*1a5aed34SJunchao Zhang$(testexe.hip.cpp) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 254*1a5aed34SJunchao Zhang $(call quiet,CLINKER) -o $@ $^ $(PETSC_TEST_LIB) 255*1a5aed34SJunchao Zhang -$(call macos-firewall-register,$@) 256*1a5aed34SJunchao Zhang 257c0558f20SBarry Smith$(testexe.kokkos.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 258c0558f20SBarry Smith $(call quiet,PETSC_LINK.kokkos.cxx) -o $@ $^ $(PETSC_TEST_LIB) 2597cb68e74SVaclav Hapla -$(call macos-firewall-register,$@) 260c0558f20SBarry Smith 261d23021a0SBarry Smith$(testexe.raja.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 262d23021a0SBarry Smith $(call quiet,CLINKER) -o $@ $^ $(PETSC_TEST_LIB) 263d23021a0SBarry Smith -$(call macos-firewall-register,$@) 264d23021a0SBarry Smith 265513d7a9cSJed Brown$(testexe.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 2662f4326f3SSatish Balay $(call quiet,CXXLINKER) -o $@ $^ $(PETSC_TEST_LIB) 2677cb68e74SVaclav Hapla -$(call macos-firewall-register,$@) 268513d7a9cSJed Brown 26949da0fa4SScott Kruger# Fortran source files need petsc*.mod, which isn't explicitly managed in the makefile. 27049da0fa4SScott Kruger$(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),F F90)) : $(libpetscall) 27149da0fa4SScott Kruger 27249da0fa4SScott Kruger# Testing convenience targets 273c173c275SScott Kruger.PHONY: test pre-clean 274c173c275SScott Kruger 275ff7b3809SScott Krugertest: report_tests 276c173c275SScott Kruger 27749da0fa4SScott Krugerpre-clean: 2785e361860SScott Kruger @$(RM) -rf $(TESTDIR)/counts $(TESTLOGTAPFILE) $(TESTLOGERRFILE) 2795e361860SScott Kruger @touch $(TESTLOGTAPFILE) $(TESTLOGERRFILE) 28027d73d1fSBarry Smith @echo "Using MAKEFLAGS:" ${MAKEFLAGS} 28149da0fa4SScott Kruger 2824d9d3ee5SSatish Balaycheck-test-errors: 2835e361860SScott Kruger @grep '^not ok' $(TESTLOGTAPFILE) | grep -v 'Exceeded timeout' | tee $(TESTDIR)/allgtests-tap-err.log 2844d9d3ee5SSatish Balay @test ! -s $(TESTDIR)/allgtests-tap-err.log 2854d9d3ee5SSatish Balay 28649da0fa4SScott Kruger.PHONY: $(foreach pkg, $(pkgs), test-$(pkg) $(foreach lang, $(testlangs), test-$(pkg).$(lang) test-rm-$(pkg).$(lang))) 28749da0fa4SScott Krugertestpkgs := $(foreach pkg, $(pkgs), test-$(pkg)) 28849da0fa4SScott Kruger# Targets to run tests in test-$pkg.$lang and delete the executables, language by language 28949da0fa4SScott Kruger$(testpkgs) : test-% : $(foreach lang, $(testlangs), test-rm-%.$(lang)) 29049da0fa4SScott Kruger# List of raw test run targets 29149da0fa4SScott Krugeralltesttargets := $(foreach tp, $(testpkgs), $(foreach lang, $(testlangs), $($(tp).$(lang)))) 29249da0fa4SScott Kruger 29349da0fa4SScott Kruger# Run targets 29449da0fa4SScott Kruger$(alltesttargets) : % : $(TESTDIR)/counts/%.counts 29549da0fa4SScott Kruger.PHONY: $(alltesttargets) 29649da0fa4SScott Kruger 29749da0fa4SScott Kruger$(TESTDIR)/counts/%.counts : 29849da0fa4SScott Kruger $(quiettest) $< $(TESTFLAGS) 29949da0fa4SScott Kruger 30049da0fa4SScott Kruger# Targets to run tests and remove executables, by package-lang pairs. 30149da0fa4SScott Kruger# Run the tests in each batch using recursive invocation of make because 30249da0fa4SScott Kruger# we need all of them to complete before removing the executables. Make 30349da0fa4SScott Kruger# doesn't guarantee an exploration order for the graph. Only recursive 30449da0fa4SScott Kruger# if there is something to be done. 30549da0fa4SScott Krugeralltest-rm := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), test-rm-$(pkg).$(lang))) 30649da0fa4SScott Kruger$(alltest-rm) : test-rm-% : test-% 30749da0fa4SScott Krugerifneq ($(NO_RM),1) 30849da0fa4SScott Kruger $(call quiet,RM) $(addprefix $(TESTDIR)/,$(basename $($(@:test-rm-%=testsrcs-%)))) 30949da0fa4SScott Krugerendif 31049da0fa4SScott Kruger 31149da0fa4SScott Kruger# Remove intermediate .o files 31249da0fa4SScott Kruger# This only removes the files at the end which is insufficient 31349da0fa4SScott Kruger#.INTERMEDIATE: $(testsrcs.o:%.o=%) 31449da0fa4SScott Kruger 31549da0fa4SScott Kruger# all sources should get recompiled when petscvariables changes (i.e when configure is rerun or when petscvariables is manually edited.) 31649da0fa4SScott Kruger$(testsrcs.o) : $(petscvariables) 31749da0fa4SScott Kruger 31849da0fa4SScott Kruger%/.DIR : 31949da0fa4SScott Kruger @mkdir -p $(@D) 32049da0fa4SScott Kruger @touch $@ 32149da0fa4SScott Kruger 32249da0fa4SScott Kruger.PRECIOUS: %/.DIR 32349da0fa4SScott Kruger 32449da0fa4SScott Kruger.SUFFIXES: # Clear .SUFFIXES because we don't use implicit rules 32549da0fa4SScott Kruger.DELETE_ON_ERROR: # Delete likely-corrupt target file if rule fails 32649da0fa4SScott Kruger 32737ed16bcSStefano Zampini.PHONY: clean cleantest all 32849da0fa4SScott Kruger 32949da0fa4SScott Krugercleantest: 33049da0fa4SScott Kruger ${RM} -r $(TESTDIR) $(generatedtest) 33149da0fa4SScott Kruger 33249da0fa4SScott Krugerclean: cleantest 33349da0fa4SScott Kruger 33449da0fa4SScott Krugeralltest.d := $(testsrcs.o:%.o=%.d) 33549da0fa4SScott Kruger# Tell make that alltest.d are all up to date. Without this, the include 33649da0fa4SScott Kruger# below has quadratic complexity, taking more than one second for a 33749da0fa4SScott Kruger# do-nothing build of PETSc (much worse for larger projects) 33849da0fa4SScott Kruger$(alltest.d) : ; 33949da0fa4SScott Kruger 34049da0fa4SScott Kruger-include $(alltest.d) 34149da0fa4SScott Kruger 34263cf4119SScott Kruger# Tests can be generated by searching -- see documentation below 343c9625024SScott Krugershowreport= 34485bc9deeSScott Krugerifndef searchin 34585bc9deeSScott Kruger searchin = " " 34685bc9deeSScott Krugerendif 34785bc9deeSScott Krugerifdef i 34885bc9deeSScott Kruger searchin = $(i) 34985bc9deeSScott Krugerendif 35058da34e9SJed Brownifdef gs 35158da34e9SJed Brown gmakesearch = $(gs) 35258da34e9SJed Brownendif 35363cf4119SScott Krugerifdef gmakesearch 354848cfe54SJed Brown TESTTARGETS := $(filter $(gmakesearch),$(alltesttargets)) 35585bc9deeSScott Kruger ifdef gmakesearchin 35685bc9deeSScott Kruger TESTTARGETS2 := $(foreach v,$(TESTTARGETS),$(if $(findstring $(gmakesearchin),$(v)),$(v))) 35749da0fa4SScott Kruger TESTTARGETS := $(TESTTARGETS2) 35849da0fa4SScott Kruger endif 35985bc9deeSScott Krugerelse ifdef gmakesearchin 36085bc9deeSScott Kruger TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(gmakesearchin),$(v)),$(v))) 36149da0fa4SScott Krugerelse ifdef argsearch 36249da0fa4SScott Kruger TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(argsearch),$($(v)_ARGS)),$(v))) 36363cf4119SScott Krugerelse ifdef search 3649ea87190SJacob Faibussowitsch TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) 'name' '$(search)') 36563cf4119SScott Krugerelse ifdef s 3669ea87190SJacob Faibussowitsch TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) 'name' '$(s)') 367feeaa4f6SScott Krugerelse ifdef test-fail 368f1f6c4e6SStefano Zampini TESTTARGETS := $(shell $(TESTDIR)/echofailures.sh) 3696f5e9bd5SScott Krugerelse ifdef query 3709ea87190SJacob Faibussowitsch TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) '$(query)' '$(queryval)') 37185bc9deeSScott Krugerelse ifdef q 3729ea87190SJacob Faibussowitsch TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) '$(q)' '$(qv)') 37349da0fa4SScott Krugerelse # No filter - run them all, but delete the executables as we go 37449da0fa4SScott Kruger TESTTARGETS := $(testpkgs) 375f42deef9SScott Kruger ifneq ($(PRINTONLY),1) 376c9625024SScott Kruger showreport = "-s" # Only show full report when all tests are run 377f42deef9SScott Kruger endif 37849da0fa4SScott Krugerendif 37949da0fa4SScott Kruger 38049da0fa4SScott Kruger.PHONY: report_tests print-test 38149da0fa4SScott Kruger 38249da0fa4SScott Krugerprint-test: 3835b6dee57SScott Kruger $(info $(TESTTARGETS)) 3845b6dee57SScott Kruger @true 38549da0fa4SScott Kruger 3866e5deea7SScott Krugershow-fail: 387b711b6a4SScott Kruger -@$(PYTHON) $(CONFIGDIR)/report_tests.py -d $(TESTDIR)/counts -f 388b711b6a4SScott Kruger 3896e5deea7SScott Kruger 3906e5deea7SScott Kruger 391c01c7e64SJed Brown# Don't start running tests until starttime has completed 392c01c7e64SJed Brown$(alltesttargets:%=$(TESTDIR)/counts/%.counts) : starttime 393c01c7e64SJed Brown 394c01c7e64SJed Brown# Ensure that libpetsc (if it is a prerequisite) has been built and clean the counts/logs before starting timer 3957cb68e74SVaclav Haplastarttime: pre-clean $(libpetscall) macos-firewall-register-mpiexec 39627d73d1fSBarry Smith @$(eval STARTTIME := $(shell date +%s)) 39727d73d1fSBarry Smith 39827d73d1fSBarry Smithreport_tests: starttime $(TESTTARGETS) 39932f4009dSScott Kruger @$(eval ENDTIME := $(shell date +%s)) 400c9625024SScott Kruger -@ elapsed_time=$$(($(ENDTIME)- $(STARTTIME))) && \ 401c9625024SScott Kruger $(PYTHON) $(CONFIGDIR)/report_tests.py -m $(MAKE) -d $(TESTDIR)/counts -t 5 -e $${elapsed_time} $(showreport) 40249da0fa4SScott Kruger 4035e361860SScott Krugercheck_output: 4045e361860SScott Kruger $(PYTHON) $(CONFIGDIR)/gmakegentest.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --testdir=$(TESTDIR) --check-output 4055e361860SScott Kruger 40649da0fa4SScott Kruger# Do not how how to invoke test from makefile 40749da0fa4SScott KrugerHASGMAKEFILE := $(filter gmakefile,$(MAKEFILE_LIST)) 40849da0fa4SScott Krugerifeq ($(HASGMAKEFILE),gmakefile) 40949da0fa4SScott Krugerhelpdeps:=help-make help-targets 41049da0fa4SScott Krugermakefile="gmakefile" 411142b82d2SScott Krugerother_help="To see full test help: make -f gmakefile.test help" 41249da0fa4SScott Krugerelse 41349da0fa4SScott Krugerhelpdeps:=help-make help-targets help-test 41449da0fa4SScott Krugermakefile="gmakefile.test" 415142b82d2SScott Krugerother_help="" 41649da0fa4SScott Krugerendif 41749da0fa4SScott Kruger 41849da0fa4SScott Krugerhelp: ${helpdeps} 41949da0fa4SScott Kruger -@echo "Above is from: ${helpdeps}" 420142b82d2SScott Kruger -@echo "${other_help}" 42149da0fa4SScott Kruger 42249da0fa4SScott Krugerhelp-make: 42349da0fa4SScott Kruger -@echo 42449da0fa4SScott Kruger -@echo "Basic build usage:" 42549da0fa4SScott Kruger -@echo " make -f ${makefile} <options>" 42649da0fa4SScott Kruger -@echo 42749da0fa4SScott Kruger -@echo "Options:" 42849da0fa4SScott Kruger -@echo " V=0 Very quiet builds" 42949da0fa4SScott Kruger -@echo " V=1 Verbose builds" 43049da0fa4SScott Kruger -@echo 43149da0fa4SScott Kruger 43249da0fa4SScott Krugerhelp-targets: 43349da0fa4SScott Kruger -@echo "All makefile targets and their dependencies:" 43449da0fa4SScott Kruger -@grep ^[a-z] ${makefile} | grep : | grep -v = 43549da0fa4SScott Kruger -@echo 43649da0fa4SScott Kruger -@echo 43749da0fa4SScott Kruger 43849da0fa4SScott Krugerhelp-test: 43949da0fa4SScott Kruger -@echo "Basic test usage:" 44049da0fa4SScott Kruger -@echo " make -f ${makefile} test <options>" 44149da0fa4SScott Kruger -@echo 44249da0fa4SScott Kruger -@echo "Options:" 44385bc9deeSScott Kruger -@echo " V=1 Verbose output (-v to scripts)" 44449da0fa4SScott Kruger -@echo " NO_RM=1 Do not remove the executables after running" 445f50802fbSScott Kruger -@echo " REPLACE=1 Replace the output in PETSC_DIR source tree (-m to test scripts)" 4465e361860SScott Kruger -@echo " OUTPUT=1 Show only the errors on stdout" 447f50802fbSScott Kruger -@echo " ALT=1 Replace 'alt' output in PETSC_DIR source tree (-M to test scripts)" 44849da0fa4SScott Kruger -@echo " DIFF_NUMBERS=1 Diff the numbers in the output (-j to test scripts and petscdiff)" 449baa5c0f4SScott Kruger -@echo " CUDAMEMCHECK=1 Execute the tests using cuda-memcheck (-U to test scripts)" 45049da0fa4SScott Kruger -@echo " VALGRIND=1 Execute the tests using valgrind (-V to test scripts)" 45185bc9deeSScott Kruger -@echo " DEBUG=1 Launch tests in the debugger (-d to the scripts)" 452142b82d2SScott Kruger -@echo " NP=<num proc> Set a number of processors to pass to scripts." 453142b82d2SScott Kruger -@echo " FORCE=1 Force SKIP or TODO tests to run" 454a6f3f80dSScott Kruger -@echo " PRINTONLY=1 Print the command, but do not run. For loops print first command" 455142b82d2SScott Kruger -@echo " TIMEOUT=<time> Test timeout limit in seconds (default in config/petsc_harness.sh)" 456f50802fbSScott Kruger -@echo " TESTDIR='tests' Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}" 45749da0fa4SScott Kruger -@echo " or $${PREFIX_DIR}/$${TESTDIR}" 45849da0fa4SScott Kruger -@echo " or $${PREFIX_DIR}/share/petsc/examples/$${TESTDIR})" 4594ff3c6a1SScott Kruger -@echo " TESTBASE='tests' Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}" 46049da0fa4SScott Kruger -@echo " OPTIONS='<args>' Override options to scripts (-a to test scripts)" 46149da0fa4SScott Kruger -@echo " EXTRA_OPTIONS='<args>' Add options to scripts (-e to test scripts)" 46249da0fa4SScott Kruger -@echo 4630b148140SVaclav Hapla -@echo "Special options for macOS:" 4640b148140SVaclav 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" 4650b148140SVaclav Hapla -@echo 46663cf4119SScott Kruger -@echo "Tests can be generated by searching with multiple methods" 46763cf4119SScott Kruger -@echo " For general searching (using config/query_test.py):" 46863cf4119SScott Kruger -@echo " make -f ${makefile} test search='sys*ex2*'" 46963cf4119SScott Kruger -@echo " or the shortcut using s" 47063cf4119SScott Kruger -@echo " make -f ${makefile} test s='sys*ex2*'" 47185bc9deeSScott Kruger -@echo " You can also use the full path to a file directory" 47285bc9deeSScott Kruger -@echo " make -f ${makefile} test s='src/sys/tests/'" 473feeaa4f6SScott Kruger -@echo 4746f5e9bd5SScott Kruger -@echo " To search for fields from the original test definitions:" 4756f5e9bd5SScott Kruger -@echo " make -f ${makefile} test query='requires' queryval='*MPI_PROCESS_SHARED_MEMORY*'" 47685bc9deeSScott Kruger -@echo " or the shortcut using q and qv" 47785bc9deeSScott Kruger -@echo " make -f ${makefile} test q='requires' qv='*MPI_PROCESS_SHARED_MEMORY*'" 47885bc9deeSScott Kruger -@echo " To filter results from other searches, use searchin" 47985bc9deeSScott Kruger -@echo " make -f ${makefile} test s='src/sys/tests/' searchin='*options*'" 48063cf4119SScott Kruger -@echo 48163cf4119SScott Kruger -@echo " To re-run the last tests which failed:" 48263cf4119SScott Kruger -@echo " make -f ${makefile} test test-fail='1'" 48363cf4119SScott Kruger -@echo 48449da0fa4SScott Kruger -@echo " To see which targets match a given pattern (useful for doing a specific target):" 48563cf4119SScott Kruger -@echo " make -f ${makefile} print-test search=sys*" 48649da0fa4SScott Kruger -@echo 48749da0fa4SScott Kruger -@echo " To build an executable, give full path to location:" 488c4762a1bSJed Brown -@echo ' make -f ${makefile} $${PETSC_ARCH}/tests/sys/tests/ex1' 48949da0fa4SScott Kruger -@echo " or make the test with NO_RM=1" 49049da0fa4SScott Kruger -@echo 491