149da0fa4SScott Kruger# -*- mode: makefile-gmake -*- 2fca490e6SSatish Balay-include petscdir.mk 349da0fa4SScott Kruger 450dcbc5aSJunchao Zhang.SUFFIXES: .F .F90 .f90 ${SUFFIXES} .PETSc .C .cc .cpp .cxx .r .rm .so .html .ad .m .tex .make .fig .svg .eps .pdf .jpg .png .dvi .ps .F95 .f95 .fiat .cu .kokkos.cxx .raja.cxx .hip.cpp .sycl.cxx 5c0558f20SBarry Smith 637ed16bcSStefano ZampiniCONFIGDIR := $(PETSC_DIR)/config 749da0fa4SScott Kruger 8fc46264cSScott Kruger# TESTSRCDIR is always relative to gmakefile.test 9fc46264cSScott Kruger# This must be before includes 105b5a9be8SJed Brownmkfile_path := $(abspath $(lastword $(MAKEFILE_LIST))) 115b5a9be8SJed BrownTESTSRCDIR := $(dir $(mkfile_path))src 12fc46264cSScott Kruger 130e03b746SBarry Smith-include $(PETSC_DIR)/$(PETSC_ARCH)/lib/petsc/conf/petscvariables 140e03b746SBarry Smith-include $(PETSC_DIR)/lib/petsc/conf/variables 1549da0fa4SScott Kruger 1670d5ab12SJacob FaibussowitschTESTDIR ?= ./$(PETSC_ARCH)/tests 174ff3c6a1SScott KrugerMODDIR := $(PETSC_DIR)/$(PETSC_ARCH)/include 18e73aa2c6SSatish BalayTESTLOGTAPFILE ?= $(TESTDIR)/test_$(PETSC_ARCH)_tap.log 19e73aa2c6SSatish BalayTESTLOGERRFILE ?= $(TESTDIR)/test_$(PETSC_ARCH)_err.log 2094666443SJed BrownEXAMPLESDIR := $(TESTSRCDIR) 2149da0fa4SScott Kruger 2249da0fa4SScott Krugerpkgs := sys vec mat dm ksp snes ts tao 2349da0fa4SScott Kruger 244ff3c6a1SScott Krugerpetscconf := $(PETSC_DIR)/$(PETSC_ARCH)/include/petscconf.h 254ff3c6a1SScott Krugerpetscvariables := $(PETSC_DIR)/$(PETSC_ARCH)/lib/petsc/conf/petscvariables 268e69c5ecSJed Browngeneratedtest := $(TESTDIR)/testfiles 2749da0fa4SScott Kruger 2849da0fa4SScott Kruger.SECONDEXPANSION: # to expand $$(@D)/.DIR 2949da0fa4SScott Kruger 3049da0fa4SScott KrugerTESTFLAGS := # Initialize as simple variable 3149da0fa4SScott Kruger 32a5b23f4aSJose E. Roman#workaround old cygwin versions 3349da0fa4SScott Krugerifeq ($(PETSC_CYGWIN_BROKEN_PIPE),1) 3449da0fa4SScott Krugerifeq ($(shell basename $(AR)),ar) 3549da0fa4SScott Kruger V ?=1 3649da0fa4SScott Krugerendif 3749da0fa4SScott Krugerendif 3849da0fa4SScott KrugerV ?= $(if $(findstring s,$(MAKEFLAGS)),0) 3949da0fa4SScott Krugerifeq ($(V),) # Default 4049da0fa4SScott Kruger quiet_HELP := "Use \"$(MAKE) V=1\" to see verbose compile lines, \"$(MAKE) V=0\" to suppress.\n" 4149da0fa4SScott Kruger quiet = @printf $(quiet_HELP)$(eval quiet_HELP:=)" %10s %s\n" "$1$2" "$@"; $($1) 4249da0fa4SScott Kruger quiettest = @printf " %10s %s\n" "TEST" "$(@:$(TESTDIR)/counts/%.counts=%)"; 4349da0fa4SScott Krugerelse ifeq ($(V),0) # Suppress entire command 4449da0fa4SScott Kruger quiet = @$($1) 4549da0fa4SScott Kruger quiettest = @ 465e361860SScott Kruger TESTFLAGS += -o err_only 4749da0fa4SScott Krugerelse # Show the full command line 4849da0fa4SScott Kruger quiet = $($1) 4949da0fa4SScott Kruger quiettest = 5049da0fa4SScott Kruger TESTFLAGS += -v 5149da0fa4SScott Krugerendif 5249da0fa4SScott Kruger 5349da0fa4SScott Krugerifeq ($(FORCE),1) 5449da0fa4SScott Kruger TESTFLAGS += -f # force test execution 5549da0fa4SScott Krugerendif 56baa5c0f4SScott Krugerifeq ($(CUDAMEMCHECK),1) 57baa5c0f4SScott Kruger TESTFLAGS += -U # Add cuda-memcheck option to the flags 58baa5c0f4SScott Krugerendif 5949da0fa4SScott Krugerifeq ($(VALGRIND),1) 60baa5c0f4SScott Kruger TESTFLAGS += -V # Add valgrind option to the flags 6149da0fa4SScott Krugerendif 6285bc9deeSScott Krugerifeq ($(DEBUG),1) 6385bc9deeSScott Kruger TESTFLAGS += -d # Launch test in debugger 6485bc9deeSScott Krugerendif 6549da0fa4SScott Krugerifeq ($(REPLACE),1) 6649da0fa4SScott Kruger TESTFLAGS += -m # Replace results by passing -m to petscdiff 6749da0fa4SScott Krugerendif 685e361860SScott Krugerifeq ($(OUTPUT),1) 695e361860SScott Kruger TESTFLAGS += -o 'err_only' # Show only the errors on stdout 705e361860SScott Krugerendif 71f50802fbSScott Krugerifeq ($(ALT),1) 72f50802fbSScott Kruger TESTFLAGS += -M # Replace alt files by passing -M to petscdiff 73f50802fbSScott Krugerendif 74e6bdf5b1SSatish BalayPRINTONLY ?= 0 75a6f3f80dSScott Krugerifeq ($(PRINTONLY),1) 76a6f3f80dSScott Kruger TESTFLAGS += -p # Pass -p to petscdiff to print only command 77a6f3f80dSScott Krugerendif 7849da0fa4SScott Krugerifeq ($(DIFF_NUMBERS),1) 7949da0fa4SScott Kruger TESTFLAGS += -j # Pass -j to petscdiff to diff the actual numbers 8049da0fa4SScott Krugerendif 8149da0fa4SScott Krugerifdef OPTIONS 8249da0fa4SScott Kruger TESTFLAGS += -a '$(OPTIONS)' # override arguments 8349da0fa4SScott Krugerendif 8449da0fa4SScott Krugerifdef EXTRA_OPTIONS 8549da0fa4SScott Kruger TESTFLAGS += -e '$(EXTRA_OPTIONS)' # add extra arguments 8649da0fa4SScott Krugerendif 8749da0fa4SScott Krugerifdef NP 8849da0fa4SScott Kruger TESTFLAGS += -n $(NP) # set number of processes 8949da0fa4SScott Krugerendif 9049da0fa4SScott Kruger# Override the default timeout that may be found at the top of config/petsc_harness.sh 9149da0fa4SScott Kruger# This must be an integer. It is given in seconds. 9249da0fa4SScott Krugerifdef TIMEOUT 9349da0fa4SScott Kruger TESTFLAGS += -t $(TIMEOUT) # Override the default timeout 9449da0fa4SScott Krugerendif 9549da0fa4SScott Kruger 96fc46264cSScott Kruger$(generatedtest) : $(petscconf) $(petscvariables) $(CONFIGDIR)/gmakegentest.py $(TESTDIR)/.DIR | $$(@D)/.DIR 978e69c5ecSJed Brown $(PYTHON) $(CONFIGDIR)/gmakegentest.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --testdir=$(TESTDIR) 9849da0fa4SScott Kruger 99e09b7dbfSBarry Smithifneq ($(filter-out clean check info libs all checkbadSource checkbadFileChange allfortranstubs alletags clangformat checkclangformat get%,$(MAKECMDGOALS:clean%=clean)),) 100336d78f1SSatish Balayinclude $(generatedtest) 101535b694aSJed Brownendif 10249da0fa4SScott Kruger 10349da0fa4SScott Krugerifeq ($(PETSC_LANGUAGE),CXXONLY) 10449da0fa4SScott Kruger cc_name := CXX 10549da0fa4SScott Krugerelse 10649da0fa4SScott Kruger cc_name := CC 10749da0fa4SScott Krugerendif 10849da0fa4SScott Kruger 1093761b06dSJed BrownPETSC_COMPILE.c = $(call quiet,$(cc_name)) -c $(PCC_FLAGS) $($(CLANGUAGE)FLAGS) $(CCPPFLAGS) $(C_DEPFLAGS) 1100b119762SSatish BalayPETSC_COMPILE.cxx = $(call quiet,CXX) -c $(CXX_FLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(CXX_DEPFLAGS) 111f09347e2SJunchao ZhangPETSC_COMPILE.cu = $(call quiet,CUDAC) -c $(MPICXX_INCLUDES) $(CUDAC_FLAGS) --compiler-options="${PETSC_CXXCPPFLAGS} $(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) 114f09347e2SJunchao ZhangPETSC_GENDEPS.cu = $(call quiet,CUDAC,.dep) --generate-dependencies --output-directory=$(@D) $(MPICXX_INCLUDES) $(CUDAC_FLAGS) --compiler-options="${PETSC_CXXCPPFLAGS} $(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 11964cfe48dSJed Brown KOKC = PATH=`dirname $(CUDAC)`:$(PATH) NVCC_WRAPPER_DEFAULT_COMPILER="$(CUDA_CXX)" $(KOKKOS_BIN)/nvcc_wrapper --expt-extended-lambda 120*55bc12c6SJunchao Zhang KOKKOS_COMPILE = $(call quiet,KOKC) -c $(CUDAC_FLAGS) ${PETSC_CXXCPPFLAGS} $(CUDACPPFLAGS) $(CUDA_CXXFLAGS) $(MPICXX_INCLUDES) 121600dc890SJunchao Zhangelse ifneq ($(KOKKOS_USE_HIP_COMPILER),) 122*55bc12c6SJunchao Zhang KOKKOS_COMPILE = $(PETSC_COMPILE.hip.cpp) 12350dcbc5aSJunchao Zhangelse ifneq ($(KOKKOS_USE_SYCL_COMPILER),) 124*55bc12c6SJunchao Zhang KOKKOS_COMPILE = $(PETSC_COMPILE.sycl.cxx) 125600dc890SJunchao Zhangelse 126*55bc12c6SJunchao Zhang KOKKOS_COMPILE = $(PETSC_COMPILE.cxx) 127600dc890SJunchao Zhangendif 128*55bc12c6SJunchao Zhang# https://github.com/kokkos/kokkos/pull/5473 used a C++17 feature, inline static variables. 129*55bc12c6SJunchao Zhang# We found -fvisibility=hidden could hide these variables such that the supposed globally unique 130*55bc12c6SJunchao Zhang# variables become local to each file including them and thus have multiple copies (see an example 131*55bc12c6SJunchao Zhang# at the end of PR5473). It might be a gcc bug thus we also filed at https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107535 132*55bc12c6SJunchao Zhang# See also an older bug report related to visibility, https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59693 133*55bc12c6SJunchao Zhang# 134*55bc12c6SJunchao Zhang# Our workaround here is to git rid of -fvisibility=hidden from Kokkos compiler options, so that petsc 135*55bc12c6SJunchao Zhang# files including Kokkos headers won't be affected by this flag. 136*55bc12c6SJunchao Zhang# 137*55bc12c6SJunchao Zhang# The solution is not ideal in the sense we have to duplicate the same workaround to any external libraries 138*55bc12c6SJunchao Zhang# using C++17 inline static variables. We have to wait for GNU to clarify this issue. 139*55bc12c6SJunchao ZhangPETSC_COMPILE.kokkos.cxx = $(filter-out -fvisibility=hidden,$(KOKKOS_COMPILE)) 140600dc890SJunchao Zhang 141d23021a0SBarry Smithifneq ($(RAJA_USE_CUDA_COMPILER),) 142f09347e2SJunchao Zhang PETSC_COMPILE.raja.cxx = ${CUDAC} $(MPICXX_INCLUDES) ${CUDAC_FLAGS} -x cu -Xcudafe "--display_error_number" -c --compiler-options="${PETSC_CXXCPPFLAGS} ${PETSC_CC_INCLUDES} ${CUDA_CXXFLAGS}" --expt-extended-lambda --expt-relaxed-constexpr 143d23021a0SBarry Smithelse 144d23021a0SBarry Smith PETSC_COMPILE.raja.cxx = ${CXX} -o $*.o -c ${CXX_FLAGS} ${CXXFLAGS} ${CXXCPPFLAGS} 145d23021a0SBarry Smithendif 146d23021a0SBarry Smith 14750dcbc5aSJunchao Zhangtestlangs := c cu cxx F F90 kokkos.cxx hip.cpp sycl.cxx raja.cxx 148513d7a9cSJed Brown$(foreach lang, $(testlangs), $(eval \ 149513d7a9cSJed Brown testexe.$(lang) = $(foreach pkg, $(pkgs), $(testsrcs-$(pkg).$(lang):%.$(lang)=$(TESTDIR)/%)))) 15049da0fa4SScott Krugerconcattestlang = $(foreach lang, $(2), $(testsrcs-$(1).$(lang):%.$(lang)=$(TESTDIR)/%.o)) 15149da0fa4SScott Krugertestsrcs.o := $(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),$(testlangs))) 152fc46264cSScott Krugertestsrcs-rel := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), $(testsrcs-$(pkg).$(lang)))) 153fc46264cSScott Krugertestsrcs := $(foreach sfile, $(testsrcs-rel), $(TESTSRCDIR)/$(sfile)) 15449da0fa4SScott Kruger 15506fe1a63SSatish Balay# workaround win32fe failure 15606fe1a63SSatish Balayifneq (,$(findstring win32fe,$(call quiet,$(cc_name)))) 15706fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex6: | $(TESTDIR)/ts/tutorials/multirate/ex5 15806fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex8: | $(TESTDIR)/ts/tutorials/multirate/ex6 15906fe1a63SSatish Balayendif 16006fe1a63SSatish Balay 16149da0fa4SScott Kruger# Refresh testfiles when sources change, but don't balk if the source file is nonexistent (deleted) 16249da0fa4SScott Kruger$(generatedtest) : $(testsrcs) 16349da0fa4SScott Kruger$(testsrcs) : 16449da0fa4SScott Kruger 1654ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.c | $$(@D)/.DIR 16649da0fa4SScott Kruger $(PETSC_COMPILE.c) $(abspath $<) -o $@ 16749da0fa4SScott Kruger 168c0558f20SBarry Smith$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.kokkos.cxx | $$(@D)/.DIR 169c0558f20SBarry Smith $(PETSC_COMPILE.kokkos.cxx) $(abspath $<) -o $@ 170c0558f20SBarry Smith 17150dcbc5aSJunchao Zhang$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.sycl.cxx | $$(@D)/.DIR 17250dcbc5aSJunchao Zhang $(PETSC_COMPILE.sycl.cxx) $(abspath $<) -o $@ 17350dcbc5aSJunchao Zhang 174d23021a0SBarry Smith$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.raja.cxx | $$(@D)/.DIR 175d23021a0SBarry Smith $(PETSC_COMPILE.raja.cxx) $(abspath $<) -o $@ 176d23021a0SBarry Smith 1774ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cxx | $$(@D)/.DIR 17849da0fa4SScott Kruger $(PETSC_COMPILE.cxx) $(abspath $<) -o $@ 17949da0fa4SScott Kruger 1804ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cu | $$(@D)/.DIR 18149da0fa4SScott Kruger $(PETSC_COMPILE.cu) $(abspath $<) -o $@ # Compile first so that if there is an error, it comes from a normal compile 18249da0fa4SScott Kruger @$(PETSC_GENDEPS.cu) $(abspath $<) -o $(@:%.o=%.d) # Generate the dependencies for later 18349da0fa4SScott Kruger 1841a5aed34SJunchao Zhang$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.hip.cpp | $$(@D)/.DIR 1851a5aed34SJunchao Zhang $(PETSC_COMPILE.hip.cpp) $(abspath $<) -o $@ 1861a5aed34SJunchao Zhang 187a55d2495SJed Brown# Test modules go in the same directory as the target *.o 188a55d2495SJed BrownTESTMODDIR = $(@D) 18949da0fa4SScott KrugerFCMOD = cd 1904ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F | $$(@D)/.DIR 19149da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),) 192a55d2495SJed Brown $(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@) 19349da0fa4SScott Krugerelse 194a55d2495SJed Brown $(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR) 19549da0fa4SScott Krugerendif 1960266c241SJed Brown -@$(GFORTRAN_DEP_CLEANUP) 19749da0fa4SScott Kruger 1984ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F90 | $$(@D)/.DIR 19949da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),) 200a55d2495SJed Brown $(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@) 20149da0fa4SScott Krugerelse 202a55d2495SJed Brown $(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR) 20349da0fa4SScott Krugerendif 2040266c241SJed Brown -@$(GFORTRAN_DEP_CLEANUP) 2050266c241SJed Brown 206cf7d3547SScott Kruger# This is a hack to fix a broken gfortran. 2070266c241SJed Browndefine GFORTRAN_DEP_CLEANUP 208ef0d7cd8SPierre Jolivet if test -e "$(@:%.o=%.d)" && head -1 "$(@:%.o=%.d)" | grep -F -q -v : ; then\ 2094f45eea9SScott Kruger echo "$(@): \\" > $(@:%.o=%.dtemp) ; \ 2100266c241SJed Brown tr '\n' '@' < $(@:%.o=%.d) | cut -d: -f2- | tr '@' '\n' >> $(@:%.o=%.dtemp) ; \ 2110266c241SJed Brown mv $(@:%.o=%.dtemp) $(@:%.o=%.d); \ 2124f45eea9SScott Kruger fi 2130266c241SJed Brownendef 21449da0fa4SScott Kruger 21520844ca6SSatish Balay# link line constructed differently for gmakefile vs gmakefile.test invocation 21620844ca6SSatish Balayifeq ($(libpetscall),) 21720844ca6SSatish BalayPETSC_TEST_LIB = $(PETSC_LIB) 21820844ca6SSatish Balayelse 21920844ca6SSatish BalayPETSC_TEST_LIB = $(C_SH_LIB_PATH) $(PETSC_EXTERNAL_LIB_BASIC) 22020844ca6SSatish Balayendif 22120844ca6SSatish Balay 222bde159b7SSatish Balay# manually list some some library dependencies to check for circular dependencies 223c4762a1bSJed Brown$(TESTDIR)/sys/tests/ex9: PETSC_TEST_LIB = $(PETSC_SYS_LIB) 224c4762a1bSJed Brown$(TESTDIR)/vec/vec/tests/ex1: PETSC_TEST_LIB = $(PETSC_VEC_LIB) 225c4762a1bSJed Brown$(TESTDIR)/mat/tests/ex1: PETSC_TEST_LIB = $(PETSC_MAT_LIB) 226c4762a1bSJed Brown$(TESTDIR)/dm/tests/ex1: PETSC_TEST_LIB = $(PETSC_DM_LIB) 227c4762a1bSJed Brown$(TESTDIR)/ksp/ksp/tests/ex1: PETSC_TEST_LIB = $(PETSC_KSP_LIB) 228c4762a1bSJed Brown$(TESTDIR)/snes/tests/ex1: PETSC_TEST_LIB = $(PETSC_SNES_LIB) 229c4762a1bSJed Brown$(TESTDIR)/ts/tests/ex2: PETSC_TEST_LIB = $(PETSC_TS_LIB) 230c4762a1bSJed Brown$(TESTDIR)/tao/tutorials/ex1: PETSC_TEST_LIB = $(PETSC_TAO_LIB) 231bde159b7SSatish Balay 2327cb68e74SVaclav Hapla# MACOS FIREWALL HANDLING 2337cb68e74SVaclav Hapla# - if run with MACOS_FIREWALL=1 2347cb68e74SVaclav Hapla# (automatically set in $PETSC_ARCH/lib/petsc/conf/petscvariables if configured --with-macos-firewall-rules), 2357cb68e74SVaclav Hapla# ensure mpiexec and test executable is on firewall list 2367cb68e74SVaclav Hapla# 2370b148140SVaclav Haplaifeq ($(MACOS_FIREWALL),1) 2380b148140SVaclav HaplaFW := /usr/libexec/ApplicationFirewall/socketfilterfw 2397cb68e74SVaclav Hapla# There is no reliable realpath command in macOS without need for 3rd party tools like homebrew coreutils 2407cb68e74SVaclav Hapla# Using Python's realpath seems like the most robust way here 2417cb68e74SVaclav Haplarealpath-py = $(shell $(PYTHON) -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' $(1)) 2427cb68e74SVaclav Hapla# 2431dcdb15bSVaclav Hapladefine macos-firewall-register 2447cb68e74SVaclav Hapla @APP=$(call realpath-py, $(1)); \ 2451855f086SVaclav Hapla if ! sudo -n true 2>/dev/null; then printf "Asking for sudo password to add new firewall rule for\n $$APP\n"; fi; \ 2467cb68e74SVaclav Hapla sudo $(FW) --remove $$APP --add $$APP --blockapp $$APP 2471dcdb15bSVaclav Haplaendef 2480b148140SVaclav Haplaendif 2497cb68e74SVaclav Hapla# 2507cb68e74SVaclav Haplamacos-firewall-register-mpiexec: 251961fb248SStefano Zampini -$(call macos-firewall-register, $(MPIEXEC)) 2521dcdb15bSVaclav Hapla 25349da0fa4SScott Kruger# Test executables 254513d7a9cSJed Brown$(testexe.F) $(testexe.F90) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 25520844ca6SSatish Balay $(call quiet,FLINKER) -o $@ $^ $(PETSC_TEST_LIB) 2567cb68e74SVaclav Hapla -$(call macos-firewall-register,$@) 25749da0fa4SScott Kruger 258accbd18bSBarry Smithifneq (,$(findstring emcc,$(CC))) 259accbd18bSBarry Smith$(testexe.c) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 260accbd18bSBarry Smith -@$(call quiet,CLINKER) -s MAIN_MODULE -s ASSERTIONS=2 -s SAFE_HEAP=1 -s STACK_OVERFLOW_CHECK=1 -s ALLOW_MEMORY_GROWTH $(EXEFLAGS) -o $@.js $@.o $(PETSC_LIB) 261accbd18bSBarry Smith -@printf '#!/usr/bin/env sh\nnode --redirect-warnings=/dev/null $$0.js $$* | grep -v "Heap resize call from"' > $@ 262accbd18bSBarry Smith -@chmod u+x $@ 263accbd18bSBarry Smithelse 264513d7a9cSJed Brown$(testexe.c) $(testexe.cu) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 2651c6715b8SMatthew G. Knepley $(call quiet,CLINKER) $(EXEFLAGS) -o $@ $^ $(PETSC_TEST_LIB) 2667cb68e74SVaclav Hapla -$(call macos-firewall-register,$@) 26749da0fa4SScott Kruger 268accbd18bSBarry Smithendif 269accbd18bSBarry Smith 2701a5aed34SJunchao Zhang$(testexe.hip.cpp) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 2711a5aed34SJunchao Zhang $(call quiet,CLINKER) -o $@ $^ $(PETSC_TEST_LIB) 2721a5aed34SJunchao Zhang -$(call macos-firewall-register,$@) 2731a5aed34SJunchao Zhang 274c0558f20SBarry Smith$(testexe.kokkos.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 275672b70e8SJunchao Zhang $(call quiet,CLINKER) $(EXEFLAGS) -o $@ $^ $(PETSC_TEST_LIB) 2767cb68e74SVaclav Hapla -$(call macos-firewall-register,$@) 277c0558f20SBarry Smith 278d23021a0SBarry Smith$(testexe.raja.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 279d23021a0SBarry Smith $(call quiet,CLINKER) -o $@ $^ $(PETSC_TEST_LIB) 280d23021a0SBarry Smith -$(call macos-firewall-register,$@) 281d23021a0SBarry Smith 282513d7a9cSJed Brown$(testexe.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 2832f4326f3SSatish Balay $(call quiet,CXXLINKER) -o $@ $^ $(PETSC_TEST_LIB) 2847cb68e74SVaclav Hapla -$(call macos-firewall-register,$@) 285513d7a9cSJed Brown 28649da0fa4SScott Kruger# Fortran source files need petsc*.mod, which isn't explicitly managed in the makefile. 28749da0fa4SScott Kruger$(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),F F90)) : $(libpetscall) 28849da0fa4SScott Kruger 28949da0fa4SScott Kruger# Testing convenience targets 290c173c275SScott Kruger.PHONY: test pre-clean 291c173c275SScott Kruger 292ff7b3809SScott Krugertest: report_tests 293c173c275SScott Kruger 29449da0fa4SScott Krugerpre-clean: 2955e361860SScott Kruger @$(RM) -rf $(TESTDIR)/counts $(TESTLOGTAPFILE) $(TESTLOGERRFILE) 2965e361860SScott Kruger @touch $(TESTLOGTAPFILE) $(TESTLOGERRFILE) 29727d73d1fSBarry Smith @echo "Using MAKEFLAGS:" ${MAKEFLAGS} 29849da0fa4SScott Kruger 2994d9d3ee5SSatish Balaycheck-test-errors: 3005e361860SScott Kruger @grep '^not ok' $(TESTLOGTAPFILE) | grep -v 'Exceeded timeout' | tee $(TESTDIR)/allgtests-tap-err.log 3014d9d3ee5SSatish Balay @test ! -s $(TESTDIR)/allgtests-tap-err.log 3024d9d3ee5SSatish Balay 30349da0fa4SScott Kruger.PHONY: $(foreach pkg, $(pkgs), test-$(pkg) $(foreach lang, $(testlangs), test-$(pkg).$(lang) test-rm-$(pkg).$(lang))) 30449da0fa4SScott Krugertestpkgs := $(foreach pkg, $(pkgs), test-$(pkg)) 30549da0fa4SScott Kruger# Targets to run tests in test-$pkg.$lang and delete the executables, language by language 30649da0fa4SScott Kruger$(testpkgs) : test-% : $(foreach lang, $(testlangs), test-rm-%.$(lang)) 30749da0fa4SScott Kruger# List of raw test run targets 30849da0fa4SScott Krugeralltesttargets := $(foreach tp, $(testpkgs), $(foreach lang, $(testlangs), $($(tp).$(lang)))) 30949da0fa4SScott Kruger 31049da0fa4SScott Kruger# Run targets 31149da0fa4SScott Kruger$(alltesttargets) : % : $(TESTDIR)/counts/%.counts 31249da0fa4SScott Kruger.PHONY: $(alltesttargets) 31349da0fa4SScott Kruger 31449da0fa4SScott Kruger$(TESTDIR)/counts/%.counts : 31549da0fa4SScott Kruger $(quiettest) $< $(TESTFLAGS) 31649da0fa4SScott Kruger 31749da0fa4SScott Kruger# Targets to run tests and remove executables, by package-lang pairs. 31849da0fa4SScott Kruger# Run the tests in each batch using recursive invocation of make because 31949da0fa4SScott Kruger# we need all of them to complete before removing the executables. Make 32049da0fa4SScott Kruger# doesn't guarantee an exploration order for the graph. Only recursive 32149da0fa4SScott Kruger# if there is something to be done. 32249da0fa4SScott Krugeralltest-rm := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), test-rm-$(pkg).$(lang))) 32349da0fa4SScott Kruger$(alltest-rm) : test-rm-% : test-% 32449da0fa4SScott Krugerifneq ($(NO_RM),1) 32549da0fa4SScott Kruger $(call quiet,RM) $(addprefix $(TESTDIR)/,$(basename $($(@:test-rm-%=testsrcs-%)))) 32649da0fa4SScott Krugerendif 32749da0fa4SScott Kruger 32849da0fa4SScott Kruger# Remove intermediate .o files 32949da0fa4SScott Kruger# This only removes the files at the end which is insufficient 33049da0fa4SScott Kruger#.INTERMEDIATE: $(testsrcs.o:%.o=%) 33149da0fa4SScott Kruger 33249da0fa4SScott Kruger# all sources should get recompiled when petscvariables changes (i.e when configure is rerun or when petscvariables is manually edited.) 33349da0fa4SScott Kruger$(testsrcs.o) : $(petscvariables) 33449da0fa4SScott Kruger 33549da0fa4SScott Kruger%/.DIR : 33649da0fa4SScott Kruger @mkdir -p $(@D) 33749da0fa4SScott Kruger @touch $@ 33849da0fa4SScott Kruger 33949da0fa4SScott Kruger.PRECIOUS: %/.DIR 34049da0fa4SScott Kruger 34149da0fa4SScott Kruger.SUFFIXES: # Clear .SUFFIXES because we don't use implicit rules 34249da0fa4SScott Kruger.DELETE_ON_ERROR: # Delete likely-corrupt target file if rule fails 34349da0fa4SScott Kruger 34437ed16bcSStefano Zampini.PHONY: clean cleantest all 34549da0fa4SScott Kruger 34649da0fa4SScott Krugercleantest: 34749da0fa4SScott Kruger ${RM} -r $(TESTDIR) $(generatedtest) 34849da0fa4SScott Kruger 34949da0fa4SScott Krugerclean: cleantest 35049da0fa4SScott Kruger 35149da0fa4SScott Krugeralltest.d := $(testsrcs.o:%.o=%.d) 35249da0fa4SScott Kruger# Tell make that alltest.d are all up to date. Without this, the include 35349da0fa4SScott Kruger# below has quadratic complexity, taking more than one second for a 35449da0fa4SScott Kruger# do-nothing build of PETSc (much worse for larger projects) 35549da0fa4SScott Kruger$(alltest.d) : ; 35649da0fa4SScott Kruger 35749da0fa4SScott Kruger-include $(alltest.d) 35849da0fa4SScott Kruger 35963cf4119SScott Kruger# Tests can be generated by searching -- see documentation below 360c9625024SScott Krugershowreport= 36185bc9deeSScott Krugerifndef searchin 36285bc9deeSScott Kruger searchin = " " 36385bc9deeSScott Krugerendif 36485bc9deeSScott Krugerifdef i 36585bc9deeSScott Kruger searchin = $(i) 36685bc9deeSScott Krugerendif 36758da34e9SJed Brownifdef gs 36858da34e9SJed Brown gmakesearch = $(gs) 36958da34e9SJed Brownendif 37063cf4119SScott Krugerifdef gmakesearch 371848cfe54SJed Brown TESTTARGETS := $(filter $(gmakesearch),$(alltesttargets)) 37285bc9deeSScott Kruger ifdef gmakesearchin 37385bc9deeSScott Kruger TESTTARGETS2 := $(foreach v,$(TESTTARGETS),$(if $(findstring $(gmakesearchin),$(v)),$(v))) 37449da0fa4SScott Kruger TESTTARGETS := $(TESTTARGETS2) 37549da0fa4SScott Kruger endif 37685bc9deeSScott Krugerelse ifdef gmakesearchin 37785bc9deeSScott Kruger TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(gmakesearchin),$(v)),$(v))) 37849da0fa4SScott Krugerelse ifdef argsearch 37949da0fa4SScott Kruger TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(argsearch),$($(v)_ARGS)),$(v))) 38063cf4119SScott Krugerelse ifdef search 3819ea87190SJacob Faibussowitsch TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) 'name' '$(search)') 38263cf4119SScott Krugerelse ifdef s 3839ea87190SJacob Faibussowitsch TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) 'name' '$(s)') 384feeaa4f6SScott Krugerelse ifdef test-fail 385f1f6c4e6SStefano Zampini TESTTARGETS := $(shell $(TESTDIR)/echofailures.sh) 3866f5e9bd5SScott Krugerelse ifdef query 3879ea87190SJacob Faibussowitsch TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) '$(query)' '$(queryval)') 38885bc9deeSScott Krugerelse ifdef q 3899ea87190SJacob Faibussowitsch TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) '$(q)' '$(qv)') 39049da0fa4SScott Krugerelse # No filter - run them all, but delete the executables as we go 39149da0fa4SScott Kruger TESTTARGETS := $(testpkgs) 392f42deef9SScott Kruger ifneq ($(PRINTONLY),1) 393c9625024SScott Kruger showreport = "-s" # Only show full report when all tests are run 394f42deef9SScott Kruger endif 39549da0fa4SScott Krugerendif 39649da0fa4SScott Kruger 39749da0fa4SScott Kruger.PHONY: report_tests print-test 39849da0fa4SScott Kruger 39949da0fa4SScott Krugerprint-test: 4005b6dee57SScott Kruger $(info $(TESTTARGETS)) 4015b6dee57SScott Kruger @true 40249da0fa4SScott Kruger 4036e5deea7SScott Krugershow-fail: 404b711b6a4SScott Kruger -@$(PYTHON) $(CONFIGDIR)/report_tests.py -d $(TESTDIR)/counts -f 405b711b6a4SScott Kruger 4066e5deea7SScott Kruger 4076e5deea7SScott Kruger 408c01c7e64SJed Brown# Don't start running tests until starttime has completed 409c01c7e64SJed Brown$(alltesttargets:%=$(TESTDIR)/counts/%.counts) : starttime 410c01c7e64SJed Brown 411c01c7e64SJed Brown# Ensure that libpetsc (if it is a prerequisite) has been built and clean the counts/logs before starting timer 4127cb68e74SVaclav Haplastarttime: pre-clean $(libpetscall) macos-firewall-register-mpiexec 41327d73d1fSBarry Smith @$(eval STARTTIME := $(shell date +%s)) 41427d73d1fSBarry Smith 41527d73d1fSBarry Smithreport_tests: starttime $(TESTTARGETS) 41632f4009dSScott Kruger @$(eval ENDTIME := $(shell date +%s)) 417c9625024SScott Kruger -@ elapsed_time=$$(($(ENDTIME)- $(STARTTIME))) && \ 418c9625024SScott Kruger $(PYTHON) $(CONFIGDIR)/report_tests.py -m $(MAKE) -d $(TESTDIR)/counts -t 5 -e $${elapsed_time} $(showreport) 41949da0fa4SScott Kruger 4205e361860SScott Krugercheck_output: 4215e361860SScott Kruger $(PYTHON) $(CONFIGDIR)/gmakegentest.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --testdir=$(TESTDIR) --check-output 4225e361860SScott Kruger 42349da0fa4SScott Kruger# Do not how how to invoke test from makefile 42449da0fa4SScott KrugerHASGMAKEFILE := $(filter gmakefile,$(MAKEFILE_LIST)) 42549da0fa4SScott Krugerifeq ($(HASGMAKEFILE),gmakefile) 42649da0fa4SScott Krugerhelpdeps:=help-make help-targets 42749da0fa4SScott Krugermakefile="gmakefile" 428142b82d2SScott Krugerother_help="To see full test help: make -f gmakefile.test help" 42949da0fa4SScott Krugerelse 43049da0fa4SScott Krugerhelpdeps:=help-make help-targets help-test 43149da0fa4SScott Krugermakefile="gmakefile.test" 432142b82d2SScott Krugerother_help="" 43349da0fa4SScott Krugerendif 43449da0fa4SScott Kruger 43549da0fa4SScott Krugerhelp: ${helpdeps} 43649da0fa4SScott Kruger -@echo "Above is from: ${helpdeps}" 437142b82d2SScott Kruger -@echo "${other_help}" 43849da0fa4SScott Kruger 43949da0fa4SScott Krugerhelp-make: 44049da0fa4SScott Kruger -@echo 44149da0fa4SScott Kruger -@echo "Basic build usage:" 44249da0fa4SScott Kruger -@echo " make -f ${makefile} <options>" 44349da0fa4SScott Kruger -@echo 44449da0fa4SScott Kruger -@echo "Options:" 44549da0fa4SScott Kruger -@echo " V=0 Very quiet builds" 44649da0fa4SScott Kruger -@echo " V=1 Verbose builds" 44749da0fa4SScott Kruger -@echo 44849da0fa4SScott Kruger 44949da0fa4SScott Krugerhelp-targets: 45049da0fa4SScott Kruger -@echo "All makefile targets and their dependencies:" 45149da0fa4SScott Kruger -@grep ^[a-z] ${makefile} | grep : | grep -v = 45249da0fa4SScott Kruger -@echo 45349da0fa4SScott Kruger -@echo 45449da0fa4SScott Kruger 45549da0fa4SScott Krugerhelp-test: 45649da0fa4SScott Kruger -@echo "Basic test usage:" 45749da0fa4SScott Kruger -@echo " make -f ${makefile} test <options>" 45849da0fa4SScott Kruger -@echo 45949da0fa4SScott Kruger -@echo "Options:" 46085bc9deeSScott Kruger -@echo " V=1 Verbose output (-v to scripts)" 46149da0fa4SScott Kruger -@echo " NO_RM=1 Do not remove the executables after running" 462f50802fbSScott Kruger -@echo " REPLACE=1 Replace the output in PETSC_DIR source tree (-m to test scripts)" 4635e361860SScott Kruger -@echo " OUTPUT=1 Show only the errors on stdout" 464f50802fbSScott Kruger -@echo " ALT=1 Replace 'alt' output in PETSC_DIR source tree (-M to test scripts)" 46549da0fa4SScott Kruger -@echo " DIFF_NUMBERS=1 Diff the numbers in the output (-j to test scripts and petscdiff)" 466baa5c0f4SScott Kruger -@echo " CUDAMEMCHECK=1 Execute the tests using cuda-memcheck (-U to test scripts)" 467636bfc99SJacob Faibussowitsch -@echo " Use PETSC_CUDAMEMCHECK_COMMAND to change the executable to run and" 468636bfc99SJacob Faibussowitsch -@echo " PETSC_CUDAMEMCHECK_ARGS to change the arguments (note: both" 469636bfc99SJacob Faibussowitsch -@echo " cuda-memcheck and compute-sanitizer are supported)" 47049da0fa4SScott Kruger -@echo " VALGRIND=1 Execute the tests using valgrind (-V to test scripts)" 47185bc9deeSScott Kruger -@echo " DEBUG=1 Launch tests in the debugger (-d to the scripts)" 472142b82d2SScott Kruger -@echo " NP=<num proc> Set a number of processors to pass to scripts." 473142b82d2SScott Kruger -@echo " FORCE=1 Force SKIP or TODO tests to run" 474a6f3f80dSScott Kruger -@echo " PRINTONLY=1 Print the command, but do not run. For loops print first command" 475142b82d2SScott Kruger -@echo " TIMEOUT=<time> Test timeout limit in seconds (default in config/petsc_harness.sh)" 476f50802fbSScott Kruger -@echo " TESTDIR='tests' Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}" 47749da0fa4SScott Kruger -@echo " or $${PREFIX_DIR}/$${TESTDIR}" 47849da0fa4SScott Kruger -@echo " or $${PREFIX_DIR}/share/petsc/examples/$${TESTDIR})" 4794ff3c6a1SScott Kruger -@echo " TESTBASE='tests' Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}" 48049da0fa4SScott Kruger -@echo " OPTIONS='<args>' Override options to scripts (-a to test scripts)" 48149da0fa4SScott Kruger -@echo " EXTRA_OPTIONS='<args>' Add options to scripts (-e to test scripts)" 48249da0fa4SScott Kruger -@echo 4830b148140SVaclav Hapla -@echo "Special options for macOS:" 4840b148140SVaclav 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" 4850b148140SVaclav Hapla -@echo 48663cf4119SScott Kruger -@echo "Tests can be generated by searching with multiple methods" 48763cf4119SScott Kruger -@echo " For general searching (using config/query_test.py):" 48863cf4119SScott Kruger -@echo " make -f ${makefile} test search='sys*ex2*'" 48963cf4119SScott Kruger -@echo " or the shortcut using s" 49063cf4119SScott Kruger -@echo " make -f ${makefile} test s='sys*ex2*'" 49185bc9deeSScott Kruger -@echo " You can also use the full path to a file directory" 49285bc9deeSScott Kruger -@echo " make -f ${makefile} test s='src/sys/tests/'" 493feeaa4f6SScott Kruger -@echo 4946f5e9bd5SScott Kruger -@echo " To search for fields from the original test definitions:" 4956f5e9bd5SScott Kruger -@echo " make -f ${makefile} test query='requires' queryval='*MPI_PROCESS_SHARED_MEMORY*'" 49685bc9deeSScott Kruger -@echo " or the shortcut using q and qv" 49785bc9deeSScott Kruger -@echo " make -f ${makefile} test q='requires' qv='*MPI_PROCESS_SHARED_MEMORY*'" 49885bc9deeSScott Kruger -@echo " To filter results from other searches, use searchin" 49985bc9deeSScott Kruger -@echo " make -f ${makefile} test s='src/sys/tests/' searchin='*options*'" 50063cf4119SScott Kruger -@echo 50163cf4119SScott Kruger -@echo " To re-run the last tests which failed:" 50263cf4119SScott Kruger -@echo " make -f ${makefile} test test-fail='1'" 50363cf4119SScott Kruger -@echo 50449da0fa4SScott Kruger -@echo " To see which targets match a given pattern (useful for doing a specific target):" 50563cf4119SScott Kruger -@echo " make -f ${makefile} print-test search=sys*" 50649da0fa4SScott Kruger -@echo 50749da0fa4SScott Kruger -@echo " To build an executable, give full path to location:" 508c4762a1bSJed Brown -@echo ' make -f ${makefile} $${PETSC_ARCH}/tests/sys/tests/ex1' 50949da0fa4SScott Kruger -@echo " or make the test with NO_RM=1" 51049da0fa4SScott Kruger -@echo 511