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 5649da0fa4SScott Krugerifeq ($(VALGRIND),1) 5749da0fa4SScott Kruger TESTFLAGS += -V # Add valgrind to the flags 5849da0fa4SScott Krugerendif 5949da0fa4SScott Krugerifeq ($(REPLACE),1) 6049da0fa4SScott Kruger TESTFLAGS += -m # Replace results by passing -m to petscdiff 6149da0fa4SScott Krugerendif 625e361860SScott Krugerifeq ($(OUTPUT),1) 635e361860SScott Kruger TESTFLAGS += -o 'err_only' # Show only the errors on stdout 645e361860SScott Krugerendif 65f50802fbSScott Krugerifeq ($(ALT),1) 66f50802fbSScott Kruger TESTFLAGS += -M # Replace alt files by passing -M to petscdiff 67f50802fbSScott Krugerendif 68e6bdf5b1SSatish BalayPRINTONLY ?= 0 69a6f3f80dSScott Krugerifeq ($(PRINTONLY),1) 70a6f3f80dSScott Kruger TESTFLAGS += -p # Pass -p to petscdiff to print only command 71a6f3f80dSScott Krugerendif 7249da0fa4SScott Krugerifeq ($(DIFF_NUMBERS),1) 7349da0fa4SScott Kruger TESTFLAGS += -j # Pass -j to petscdiff to diff the actual numbers 7449da0fa4SScott Krugerendif 7549da0fa4SScott Krugerifdef OPTIONS 7649da0fa4SScott Kruger TESTFLAGS += -a '$(OPTIONS)' # override arguments 7749da0fa4SScott Krugerendif 7849da0fa4SScott Krugerifdef EXTRA_OPTIONS 7949da0fa4SScott Kruger TESTFLAGS += -e '$(EXTRA_OPTIONS)' # add extra arguments 8049da0fa4SScott Krugerendif 8149da0fa4SScott Krugerifdef NP 8249da0fa4SScott Kruger TESTFLAGS += -n $(NP) # set number of processes 8349da0fa4SScott Krugerendif 8449da0fa4SScott Kruger# Override the default timeout that may be found at the top of config/petsc_harness.sh 8549da0fa4SScott Kruger# This must be an integer. It is given in seconds. 8649da0fa4SScott Krugerifdef TIMEOUT 8749da0fa4SScott Kruger TESTFLAGS += -t $(TIMEOUT) # Override the default timeout 8849da0fa4SScott Krugerendif 8949da0fa4SScott Kruger 90fc46264cSScott Kruger$(generatedtest) : $(petscconf) $(petscvariables) $(CONFIGDIR)/gmakegentest.py $(TESTDIR)/.DIR | $$(@D)/.DIR 918e69c5ecSJed Brown $(PYTHON) $(CONFIGDIR)/gmakegentest.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --testdir=$(TESTDIR) 9249da0fa4SScott Kruger 93fca490e6SSatish Balayifneq ($(filter-out clean check,$(MAKECMDGOALS:clean%=clean)),) 94336d78f1SSatish Balayinclude $(generatedtest) 95535b694aSJed Brownendif 9649da0fa4SScott Kruger 9749da0fa4SScott Krugerifeq ($(PETSC_LANGUAGE),CXXONLY) 9849da0fa4SScott Kruger cc_name := CXX 9949da0fa4SScott Krugerelse 10049da0fa4SScott Kruger cc_name := CC 10149da0fa4SScott Krugerendif 10249da0fa4SScott Kruger 1030b119762SSatish BalayPETSC_COMPILE.c = $(call quiet,$(cc_name)) -c $(PCC_FLAGS) $(PFLAGS) $(CCPPFLAGS) $(C_DEPFLAGS) 1040b119762SSatish BalayPETSC_COMPILE.cxx = $(call quiet,CXX) -c $(CXX_FLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(CXX_DEPFLAGS) 105c0558f20SBarry Smithifneq ($(KOKKOS_BIN),) 106c0558f20SBarry Smith# Kokkos requires nvcc to be in PATH and the C++ compiler to be given in an environmental variable 107c0558f20SBarry 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) 108c0558f20SBarry 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) 109c0558f20SBarry Smithelse 110c0558f20SBarry SmithPETSC_COMPILE.kokkos.cxx = $(call quiet,CXX) -c $(CXX_FLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(CXX_DEPFLAGS) 111c0558f20SBarry SmithPETSC_LINK.kokkos.cxx = $(CXXLINKER) $(CXX_LINKER_FLAGS) $(CXXFLAGS) $(PETSC_CCPPFLAGS) $(CPPFLAGS) $(LDFLAGS) 112c0558f20SBarry Smithendif 11382707f21SStefano ZampiniPETSC_COMPILE.cu = $(call quiet,CUDAC) -c $(CUDAC_FLAGS) $(CUFLAGS) --compiler-options="$(PCC_FLAGS) $(CXXFLAGS) $(CCPPFLAGS)" 11428f796eaSScott KrugerPETSC_COMPILE.hip.cpp = $(call quiet,HIPCC) -c $(HIPCC_FLAGS) $(HIPCCFLAGS) $(HIPCCPPFLAGS) $(HIPCC_DEPFLAGS) 11528f796eaSScott KrugerPETSC_COMPILE.sycl.cpp = $(call quiet,SYCLCPP) -c $(SYCLCPP_FLAGS) $(SYCLCPPFLAGS) $(SYCLCPPCPPFLAGS) $(SYCLCPP_DEPFLAGS) 11682707f21SStefano ZampiniPETSC_GENDEPS.cu = $(call quiet,CUDAC,.dep) --generate-dependencies --output-directory=$(@D) $(CUDAC_FLAGS) $(CUFLAGS) --compiler-options="$(PCC_FLAGS) $(CXXFLAGS) $(CCPPFLAGS)" 11749da0fa4SScott KrugerPETSC_COMPILE.F = $(call quiet,FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) 11849da0fa4SScott Kruger 119c0558f20SBarry Smithtestlangs := c cu cxx F F90 kokkos.cxx hip.cpp sycl.cpp 120513d7a9cSJed Brown$(foreach lang, $(testlangs), $(eval \ 121513d7a9cSJed Brown testexe.$(lang) = $(foreach pkg, $(pkgs), $(testsrcs-$(pkg).$(lang):%.$(lang)=$(TESTDIR)/%)))) 12249da0fa4SScott Krugerconcattestlang = $(foreach lang, $(2), $(testsrcs-$(1).$(lang):%.$(lang)=$(TESTDIR)/%.o)) 12349da0fa4SScott Krugertestsrcs.o := $(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),$(testlangs))) 124fc46264cSScott Krugertestsrcs-rel := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), $(testsrcs-$(pkg).$(lang)))) 125fc46264cSScott Krugertestsrcs := $(foreach sfile, $(testsrcs-rel), $(TESTSRCDIR)/$(sfile)) 12649da0fa4SScott Kruger 12706fe1a63SSatish Balay# workaround win32fe failure 12806fe1a63SSatish Balayifneq (,$(findstring win32fe,$(call quiet,$(cc_name)))) 12906fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex6: | $(TESTDIR)/ts/tutorials/multirate/ex5 13006fe1a63SSatish Balay$(TESTDIR)/ts/tutorials/multirate/ex8: | $(TESTDIR)/ts/tutorials/multirate/ex6 13106fe1a63SSatish Balayendif 13206fe1a63SSatish Balay 13349da0fa4SScott Kruger# Refresh testfiles when sources change, but don't balk if the source file is nonexistent (deleted) 13449da0fa4SScott Kruger$(generatedtest) : $(testsrcs) 13549da0fa4SScott Kruger$(testsrcs) : 13649da0fa4SScott Kruger 1374ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.c | $$(@D)/.DIR 13849da0fa4SScott Kruger $(PETSC_COMPILE.c) $(abspath $<) -o $@ 13949da0fa4SScott Kruger 140c0558f20SBarry Smith$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.kokkos.cxx | $$(@D)/.DIR 141c0558f20SBarry Smith $(PETSC_COMPILE.kokkos.cxx) $(abspath $<) -o $@ 142c0558f20SBarry Smith 1434ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cxx | $$(@D)/.DIR 14449da0fa4SScott Kruger $(PETSC_COMPILE.cxx) $(abspath $<) -o $@ 14549da0fa4SScott Kruger 1464ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cu | $$(@D)/.DIR 14749da0fa4SScott Kruger $(PETSC_COMPILE.cu) $(abspath $<) -o $@ # Compile first so that if there is an error, it comes from a normal compile 14849da0fa4SScott Kruger @$(PETSC_GENDEPS.cu) $(abspath $<) -o $(@:%.o=%.d) # Generate the dependencies for later 14949da0fa4SScott Kruger 150a55d2495SJed Brown# Test modules go in the same directory as the target *.o 151a55d2495SJed BrownTESTMODDIR = $(@D) 15249da0fa4SScott KrugerFCMOD = cd 1534ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F | $$(@D)/.DIR 15449da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),) 155a55d2495SJed Brown $(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@) 15649da0fa4SScott Krugerelse 157a55d2495SJed Brown $(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR) 15849da0fa4SScott Krugerendif 1590266c241SJed Brown -@$(GFORTRAN_DEP_CLEANUP) 16049da0fa4SScott Kruger 1614ff3c6a1SScott Kruger$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F90 | $$(@D)/.DIR 16249da0fa4SScott Krugerifeq ($(FC_MODULE_OUTPUT_FLAG),) 163a55d2495SJed Brown $(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@) 16449da0fa4SScott Krugerelse 165a55d2495SJed Brown $(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR) 16649da0fa4SScott Krugerendif 1670266c241SJed Brown -@$(GFORTRAN_DEP_CLEANUP) 1680266c241SJed Brown 169cf7d3547SScott Kruger# This is a hack to fix a broken gfortran. 1700266c241SJed Browndefine GFORTRAN_DEP_CLEANUP 1710266c241SJed Brown if test -e "$(@:%.o=%.d)" && head -1 "$(@:%.o=%.d)" | fgrep -q -v : ; then\ 1724f45eea9SScott Kruger echo "$(@): \\" > $(@:%.o=%.dtemp) ; \ 1730266c241SJed Brown tr '\n' '@' < $(@:%.o=%.d) | cut -d: -f2- | tr '@' '\n' >> $(@:%.o=%.dtemp) ; \ 1740266c241SJed Brown mv $(@:%.o=%.dtemp) $(@:%.o=%.d); \ 1754f45eea9SScott Kruger fi 1760266c241SJed Brownendef 17749da0fa4SScott Kruger 17820844ca6SSatish Balay# link line constructed differently for gmakefile vs gmakefile.test invocation 17920844ca6SSatish Balayifeq ($(libpetscall),) 18020844ca6SSatish BalayPETSC_TEST_LIB = $(PETSC_LIB) 18120844ca6SSatish Balayelse 18220844ca6SSatish BalayPETSC_TEST_LIB = $(C_SH_LIB_PATH) $(PETSC_EXTERNAL_LIB_BASIC) 18320844ca6SSatish Balayendif 18420844ca6SSatish Balay 185bde159b7SSatish Balay# manually list some some library dependencies to check for circular dependencies 186c4762a1bSJed Brown$(TESTDIR)/sys/tests/ex9: PETSC_TEST_LIB = $(PETSC_SYS_LIB) 187c4762a1bSJed Brown$(TESTDIR)/vec/vec/tests/ex1: PETSC_TEST_LIB = $(PETSC_VEC_LIB) 188c4762a1bSJed Brown$(TESTDIR)/mat/tests/ex1: PETSC_TEST_LIB = $(PETSC_MAT_LIB) 189c4762a1bSJed Brown$(TESTDIR)/dm/tests/ex1: PETSC_TEST_LIB = $(PETSC_DM_LIB) 190c4762a1bSJed Brown$(TESTDIR)/ksp/ksp/tests/ex1: PETSC_TEST_LIB = $(PETSC_KSP_LIB) 191c4762a1bSJed Brown$(TESTDIR)/snes/tests/ex1: PETSC_TEST_LIB = $(PETSC_SNES_LIB) 192c4762a1bSJed Brown$(TESTDIR)/ts/tests/ex2: PETSC_TEST_LIB = $(PETSC_TS_LIB) 193c4762a1bSJed Brown$(TESTDIR)/tao/tutorials/ex1: PETSC_TEST_LIB = $(PETSC_TAO_LIB) 194bde159b7SSatish Balay 195*1dcdb15bSVaclav Hapla# if configured --with-macos-firewall-rules, ensure mpiexec.hydra and test executable is on firewall list 196*1dcdb15bSVaclav Haplaifdef MACOS_FIREWALL_MPIEXEC 197*1dcdb15bSVaclav Hapladefine macos-firewall-register 198*1dcdb15bSVaclav Hapla @APP=$(call abspath, $(1)); \ 199*1dcdb15bSVaclav Hapla FW=/usr/libexec/ApplicationFirewall/socketfilterfw; \ 200*1dcdb15bSVaclav Hapla ANS=`$$FW --getappblocked $$APP`; \ 201*1dcdb15bSVaclav Hapla if ! echo $$ANS | grep "$$APP" &> /dev/null; then \ 202*1dcdb15bSVaclav Hapla if ! sudo -n true 2>/dev/null; then echo "Asking for sudo password to add new firewall rule for\n $$APP:"; fi; \ 203*1dcdb15bSVaclav Hapla sudo $$FW --add $$APP && \ 204*1dcdb15bSVaclav Hapla sudo $$FW --block $$APP; \ 205*1dcdb15bSVaclav Hapla else \ 206*1dcdb15bSVaclav Hapla echo $$ANS; \ 207*1dcdb15bSVaclav Hapla fi 208*1dcdb15bSVaclav Haplaendef 209*1dcdb15bSVaclav Hapladefine macos-firewall-fix 210*1dcdb15bSVaclav Hapla $(call macos-firewall-register, $(MACOS_FIREWALL_MPIEXEC)) 211*1dcdb15bSVaclav Hapla $(call macos-firewall-register, $(1)) 212*1dcdb15bSVaclav Haplaendef 213*1dcdb15bSVaclav Haplaendif 214*1dcdb15bSVaclav Hapla 21549da0fa4SScott Kruger# Test executables 216513d7a9cSJed Brown$(testexe.F) $(testexe.F90) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 21720844ca6SSatish Balay $(call quiet,FLINKER) -o $@ $^ $(PETSC_TEST_LIB) 218*1dcdb15bSVaclav Hapla -$(call macos-firewall-fix,$@) 21949da0fa4SScott Kruger 220513d7a9cSJed Brown$(testexe.c) $(testexe.cu) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 22120844ca6SSatish Balay $(call quiet,CLINKER) -o $@ $^ $(PETSC_TEST_LIB) 222*1dcdb15bSVaclav Hapla -$(call macos-firewall-fix,$@) 22349da0fa4SScott Kruger 224c0558f20SBarry Smith$(testexe.kokkos.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 225c0558f20SBarry Smith $(call quiet,PETSC_LINK.kokkos.cxx) -o $@ $^ $(PETSC_TEST_LIB) 226*1dcdb15bSVaclav Hapla -$(call macos-firewall-fix,$@) 227c0558f20SBarry Smith 228513d7a9cSJed Brown$(testexe.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall) 2292f4326f3SSatish Balay $(call quiet,CXXLINKER) -o $@ $^ $(PETSC_TEST_LIB) 230*1dcdb15bSVaclav Hapla -$(call macos-firewall-fix,$@) 231513d7a9cSJed Brown 23249da0fa4SScott Kruger# Fortran source files need petsc*.mod, which isn't explicitly managed in the makefile. 23349da0fa4SScott Kruger$(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),F F90)) : $(libpetscall) 23449da0fa4SScott Kruger 23549da0fa4SScott Kruger# Testing convenience targets 236c173c275SScott Kruger.PHONY: test pre-clean 237c173c275SScott Kruger 238ff7b3809SScott Krugertest: report_tests 239c173c275SScott Kruger 24049da0fa4SScott Krugerpre-clean: 2415e361860SScott Kruger @$(RM) -rf $(TESTDIR)/counts $(TESTLOGTAPFILE) $(TESTLOGERRFILE) 2425e361860SScott Kruger @touch $(TESTLOGTAPFILE) $(TESTLOGERRFILE) 24327d73d1fSBarry Smith @echo "Using MAKEFLAGS:" ${MAKEFLAGS} 24449da0fa4SScott Kruger 2454d9d3ee5SSatish Balaycheck-test-errors: 2465e361860SScott Kruger @grep '^not ok' $(TESTLOGTAPFILE) | grep -v 'Exceeded timeout' | tee $(TESTDIR)/allgtests-tap-err.log 2474d9d3ee5SSatish Balay @test ! -s $(TESTDIR)/allgtests-tap-err.log 2484d9d3ee5SSatish Balay 24949da0fa4SScott Kruger.PHONY: $(foreach pkg, $(pkgs), test-$(pkg) $(foreach lang, $(testlangs), test-$(pkg).$(lang) test-rm-$(pkg).$(lang))) 25049da0fa4SScott Krugertestpkgs := $(foreach pkg, $(pkgs), test-$(pkg)) 25149da0fa4SScott Kruger# Targets to run tests in test-$pkg.$lang and delete the executables, language by language 25249da0fa4SScott Kruger$(testpkgs) : test-% : $(foreach lang, $(testlangs), test-rm-%.$(lang)) 25349da0fa4SScott Kruger# List of raw test run targets 25449da0fa4SScott Krugeralltesttargets := $(foreach tp, $(testpkgs), $(foreach lang, $(testlangs), $($(tp).$(lang)))) 25549da0fa4SScott Kruger 25649da0fa4SScott Kruger# Run targets 25749da0fa4SScott Kruger$(alltesttargets) : % : $(TESTDIR)/counts/%.counts 25849da0fa4SScott Kruger.PHONY: $(alltesttargets) 25949da0fa4SScott Kruger 26049da0fa4SScott Kruger$(TESTDIR)/counts/%.counts : 26149da0fa4SScott Kruger $(quiettest) $< $(TESTFLAGS) 26249da0fa4SScott Kruger 26349da0fa4SScott Kruger# Targets to run tests and remove executables, by package-lang pairs. 26449da0fa4SScott Kruger# Run the tests in each batch using recursive invocation of make because 26549da0fa4SScott Kruger# we need all of them to complete before removing the executables. Make 26649da0fa4SScott Kruger# doesn't guarantee an exploration order for the graph. Only recursive 26749da0fa4SScott Kruger# if there is something to be done. 26849da0fa4SScott Krugeralltest-rm := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), test-rm-$(pkg).$(lang))) 26949da0fa4SScott Kruger$(alltest-rm) : test-rm-% : test-% 27049da0fa4SScott Krugerifneq ($(NO_RM),1) 27149da0fa4SScott Kruger $(call quiet,RM) $(addprefix $(TESTDIR)/,$(basename $($(@:test-rm-%=testsrcs-%)))) 27249da0fa4SScott Krugerendif 27349da0fa4SScott Kruger 27449da0fa4SScott Kruger# Remove intermediate .o files 27549da0fa4SScott Kruger# This only removes the files at the end which is insufficient 27649da0fa4SScott Kruger#.INTERMEDIATE: $(testsrcs.o:%.o=%) 27749da0fa4SScott Kruger 27849da0fa4SScott Kruger# all sources should get recompiled when petscvariables changes (i.e when configure is rerun or when petscvariables is manually edited.) 27949da0fa4SScott Kruger$(testsrcs.o) : $(petscvariables) 28049da0fa4SScott Kruger 28149da0fa4SScott Kruger%/.DIR : 28249da0fa4SScott Kruger @mkdir -p $(@D) 28349da0fa4SScott Kruger @touch $@ 28449da0fa4SScott Kruger 28549da0fa4SScott Kruger.PRECIOUS: %/.DIR 28649da0fa4SScott Kruger 28749da0fa4SScott Kruger.SUFFIXES: # Clear .SUFFIXES because we don't use implicit rules 28849da0fa4SScott Kruger.DELETE_ON_ERROR: # Delete likely-corrupt target file if rule fails 28949da0fa4SScott Kruger 29037ed16bcSStefano Zampini.PHONY: clean cleantest all 29149da0fa4SScott Kruger 29249da0fa4SScott Krugercleantest: 29349da0fa4SScott Kruger ${RM} -r $(TESTDIR) $(generatedtest) 29449da0fa4SScott Kruger 29549da0fa4SScott Krugerclean: cleantest 29649da0fa4SScott Kruger 29749da0fa4SScott Krugeralltest.d := $(testsrcs.o:%.o=%.d) 29849da0fa4SScott Kruger# Tell make that alltest.d are all up to date. Without this, the include 29949da0fa4SScott Kruger# below has quadratic complexity, taking more than one second for a 30049da0fa4SScott Kruger# do-nothing build of PETSc (much worse for larger projects) 30149da0fa4SScott Kruger$(alltest.d) : ; 30249da0fa4SScott Kruger 30349da0fa4SScott Kruger-include $(alltest.d) 30449da0fa4SScott Kruger 30549da0fa4SScott Kruger# Tests can be generated by searching 30649da0fa4SScott Kruger# Percent is a wildcard (only one allowed): 30749da0fa4SScott Kruger# make -f gmakefile test search=sys%ex2 30849da0fa4SScott Kruger# To match internal substrings (matches *ex2*): 30949da0fa4SScott Kruger# make -f gmakefile test searchin=ex2 31049da0fa4SScott Kruger# Search and searchin can be combined: 31149da0fa4SScott Kruger# make -f gmakefile test search='sys%' searchin=ex2 31249da0fa4SScott Kruger# For args: 31349da0fa4SScott Kruger# make -f gmakefile test argsearch=cuda 31449da0fa4SScott Kruger# For general glob-style searching using python: 31549da0fa4SScott Kruger# NOTE: uses shell which is possibly slower and is possibly more brittle 31649da0fa4SScott Kruger# make -f gmakefile test globsearch='sys*ex2*' 31749da0fa4SScott Krugerifdef search 31849da0fa4SScott Kruger TESTTARGETS := $(filter $(search),$(alltesttargets)) 31949da0fa4SScott Kruger ifdef searchin 32049da0fa4SScott Kruger TESTTARGETS2 := $(foreach v,$(TESTTARGETS),$(if $(findstring $(searchin),$(v)),$(v))) 32149da0fa4SScott Kruger TESTTARGETS := $(TESTTARGETS2) 32249da0fa4SScott Kruger endif 32349da0fa4SScott Krugerelse ifdef searchin 32449da0fa4SScott Kruger TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(searchin),$(v)),$(v))) 32549da0fa4SScott Krugerelse ifdef argsearch 32649da0fa4SScott Kruger TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(argsearch),$($(v)_ARGS)),$(v))) 32749da0fa4SScott Krugerelse ifdef globsearch 328aec279ffSScott Kruger TESTTARGETS := $(shell $(PYTHON) config/query_tests.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) 'name' '$(globsearch)') 329feeaa4f6SScott Krugerelse ifdef test-fail 330feeaa4f6SScott Kruger TESTTARGETS := $(shell $(PETSC_ARCH)/tests/echofailures.sh) 3316f5e9bd5SScott Krugerelse ifdef query 332aec279ffSScott Kruger TESTTARGETS := $(shell $(PYTHON) config/query_tests.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) '$(query)' '$(queryval)') 33349da0fa4SScott Krugerelse # No filter - run them all, but delete the executables as we go 33449da0fa4SScott Kruger TESTTARGETS := $(testpkgs) 33549da0fa4SScott Krugerendif 33649da0fa4SScott Kruger 33749da0fa4SScott Kruger.PHONY: report_tests print-test 33849da0fa4SScott Kruger 33949da0fa4SScott Krugerprint-test: 3405b6dee57SScott Kruger $(info $(TESTTARGETS)) 3415b6dee57SScott Kruger @true 34249da0fa4SScott Kruger 3436e5deea7SScott Krugershow-fail: 344b711b6a4SScott Kruger -@$(PYTHON) $(CONFIGDIR)/report_tests.py -d $(TESTDIR)/counts -f 345b711b6a4SScott Kruger 3466e5deea7SScott Kruger 3476e5deea7SScott Kruger 348c01c7e64SJed Brown# Don't start running tests until starttime has completed 349c01c7e64SJed Brown$(alltesttargets:%=$(TESTDIR)/counts/%.counts) : starttime 350c01c7e64SJed Brown 351c01c7e64SJed Brown# Ensure that libpetsc (if it is a prerequisite) has been built and clean the counts/logs before starting timer 352c01c7e64SJed Brownstarttime: pre-clean $(libpetscall) 35327d73d1fSBarry Smith @$(eval STARTTIME := $(shell date +%s)) 35427d73d1fSBarry Smith 35527d73d1fSBarry Smithreport_tests: starttime $(TESTTARGETS) 35632f4009dSScott Kruger @$(eval ENDTIME := $(shell date +%s)) 357a6f3f80dSScott Kruger -@if test ${PRINTONLY} -ne 1; then elapsed_time=$$(($(ENDTIME)- $(STARTTIME))) && \ 358a6f3f80dSScott Kruger $(PYTHON) $(CONFIGDIR)/report_tests.py -m $(MAKE) -d $(TESTDIR)/counts -t 5 -e $${elapsed_time};\ 359a6f3f80dSScott Kruger fi 36049da0fa4SScott Kruger 3615e361860SScott Krugercheck_output: 3625e361860SScott Kruger $(PYTHON) $(CONFIGDIR)/gmakegentest.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --testdir=$(TESTDIR) --check-output 3635e361860SScott Kruger 36449da0fa4SScott Kruger# Do not how how to invoke test from makefile 36549da0fa4SScott KrugerHASGMAKEFILE := $(filter gmakefile,$(MAKEFILE_LIST)) 36649da0fa4SScott Krugerifeq ($(HASGMAKEFILE),gmakefile) 36749da0fa4SScott Krugerhelpdeps:=help-make help-targets 36849da0fa4SScott Krugermakefile="gmakefile" 369142b82d2SScott Krugerother_help="To see full test help: make -f gmakefile.test help" 37049da0fa4SScott Krugerelse 37149da0fa4SScott Krugerhelpdeps:=help-make help-targets help-test 37249da0fa4SScott Krugermakefile="gmakefile.test" 373142b82d2SScott Krugerother_help="" 37449da0fa4SScott Krugerendif 37549da0fa4SScott Kruger 37649da0fa4SScott Krugerhelp: ${helpdeps} 37749da0fa4SScott Kruger -@echo "Above is from: ${helpdeps}" 378142b82d2SScott Kruger -@echo "${other_help}" 37949da0fa4SScott Kruger 38049da0fa4SScott Krugerhelp-make: 38149da0fa4SScott Kruger -@echo 38249da0fa4SScott Kruger -@echo "Basic build usage:" 38349da0fa4SScott Kruger -@echo " make -f ${makefile} <options>" 38449da0fa4SScott Kruger -@echo 38549da0fa4SScott Kruger -@echo "Options:" 38649da0fa4SScott Kruger -@echo " V=0 Very quiet builds" 38749da0fa4SScott Kruger -@echo " V=1 Verbose builds" 38849da0fa4SScott Kruger -@echo 38949da0fa4SScott Kruger 39049da0fa4SScott Krugerhelp-targets: 39149da0fa4SScott Kruger -@echo "All makefile targets and their dependencies:" 39249da0fa4SScott Kruger -@grep ^[a-z] ${makefile} | grep : | grep -v = 39349da0fa4SScott Kruger -@echo 39449da0fa4SScott Kruger -@echo 39549da0fa4SScott Kruger 39649da0fa4SScott Krugerhelp-test: 39749da0fa4SScott Kruger -@echo "Basic test usage:" 39849da0fa4SScott Kruger -@echo " make -f ${makefile} test <options>" 39949da0fa4SScott Kruger -@echo 40049da0fa4SScott Kruger -@echo "Options:" 40149da0fa4SScott Kruger -@echo " NO_RM=1 Do not remove the executables after running" 402f50802fbSScott Kruger -@echo " REPLACE=1 Replace the output in PETSC_DIR source tree (-m to test scripts)" 4035e361860SScott Kruger -@echo " OUTPUT=1 Show only the errors on stdout" 404f50802fbSScott Kruger -@echo " ALT=1 Replace 'alt' output in PETSC_DIR source tree (-M to test scripts)" 40549da0fa4SScott Kruger -@echo " DIFF_NUMBERS=1 Diff the numbers in the output (-j to test scripts and petscdiff)" 40649da0fa4SScott Kruger -@echo " VALGRIND=1 Execute the tests using valgrind (-V to test scripts)" 407142b82d2SScott Kruger -@echo " NP=<num proc> Set a number of processors to pass to scripts." 408142b82d2SScott Kruger -@echo " FORCE=1 Force SKIP or TODO tests to run" 409a6f3f80dSScott Kruger -@echo " PRINTONLY=1 Print the command, but do not run. For loops print first command" 410142b82d2SScott Kruger -@echo " TIMEOUT=<time> Test timeout limit in seconds (default in config/petsc_harness.sh)" 411f50802fbSScott Kruger -@echo " TESTDIR='tests' Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}" 41249da0fa4SScott Kruger -@echo " or $${PREFIX_DIR}/$${TESTDIR}" 41349da0fa4SScott Kruger -@echo " or $${PREFIX_DIR}/share/petsc/examples/$${TESTDIR})" 4144ff3c6a1SScott Kruger -@echo " TESTBASE='tests' Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}" 41549da0fa4SScott Kruger -@echo " OPTIONS='<args>' Override options to scripts (-a to test scripts)" 41649da0fa4SScott Kruger -@echo " EXTRA_OPTIONS='<args>' Add options to scripts (-e to test scripts)" 41749da0fa4SScott Kruger -@echo 41849da0fa4SScott Kruger -@echo "Tests can be generated by searching:" 41949da0fa4SScott Kruger -@echo " Percent is a wildcard (only one allowed):" 42049da0fa4SScott Kruger -@echo " make -f ${makefile} test search=sys%ex2" 42149da0fa4SScott Kruger -@echo 42249da0fa4SScott Kruger -@echo " To match internal substrings (matches *ex2*):" 42349da0fa4SScott Kruger -@echo " make -f ${makefile} test searchin=ex2" 42449da0fa4SScott Kruger -@echo 42549da0fa4SScott Kruger -@echo " Search and searchin can be combined:" 42649da0fa4SScott Kruger -@echo " make -f ${makefile} test search='sys%' searchin=ex2" 42749da0fa4SScott Kruger -@echo 42849da0fa4SScott Kruger -@echo " To match patterns in the arguments:" 42949da0fa4SScott Kruger -@echo " make -f ${makefile} test argsearch=cuda" 43049da0fa4SScott Kruger -@echo 43149da0fa4SScott Kruger -@echo " For general glob-style searching using python:" 43249da0fa4SScott Kruger -@echo " NOTE: uses shell which is possibly slower and more brittle" 43349da0fa4SScott Kruger -@echo " make -f ${makefile} test globsearch='sys*ex2*'" 43449da0fa4SScott Kruger -@echo 435feeaa4f6SScott Kruger -@echo " To re-run the last tests which failed:" 436feeaa4f6SScott Kruger -@echo " make -f ${makefile} test test-fail='1'" 437feeaa4f6SScott Kruger -@echo 4386f5e9bd5SScott Kruger -@echo " To search for fields from the original test definitions:" 4396f5e9bd5SScott Kruger -@echo " make -f ${makefile} test query='requires' queryval='*MPI_PROCESS_SHARED_MEMORY*'" 4406f5e9bd5SScott Kruger -@echo 44149da0fa4SScott Kruger -@echo " To see which targets match a given pattern (useful for doing a specific target):" 44249da0fa4SScott Kruger -@echo " make -f ${makefile} print-test search=sys%" 44349da0fa4SScott Kruger -@echo " which is equivalent to:" 44449da0fa4SScott Kruger -@echo " make -f ${makefile} print VAR=TESTTARGETS search='sys%'" 44549da0fa4SScott Kruger -@echo 44649da0fa4SScott Kruger -@echo " To build an executable, give full path to location:" 447c4762a1bSJed Brown -@echo ' make -f ${makefile} $${PETSC_ARCH}/tests/sys/tests/ex1' 44849da0fa4SScott Kruger -@echo " or make the test with NO_RM=1" 44949da0fa4SScott Kruger -@echo 450