1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549
|
# -*- mode: makefile-gmake -*-
-include petscdir.mk
.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
CONFIGDIR := $(PETSC_DIR)/config
# TESTSRCDIR is always relative to gmakefile.test
# This must be before includes
mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
TESTSRCDIR ?= $(dir $(mkfile_path))src
-include $(PETSC_DIR)/$(PETSC_ARCH)/lib/petsc/conf/petscvariables
-include $(PETSC_DIR)/lib/petsc/conf/variables
TESTDIR ?= ./$(PETSC_ARCH)/tests
MODDIR := $(PETSC_DIR)/$(PETSC_ARCH)/include
TESTLOGTAPFILE ?= $(TESTDIR)/test_$(PETSC_ARCH)_tap.log
TESTLOGERRFILE ?= $(TESTDIR)/test_$(PETSC_ARCH)_err.log
EXAMPLESDIR := $(TESTSRCDIR)
pkgs ?= sys vec mat dm ksp snes ts tao
petscconf := $(PETSC_DIR)/$(PETSC_ARCH)/include/petscconf.h
petscvariables := $(PETSC_DIR)/$(PETSC_ARCH)/lib/petsc/conf/petscvariables
generatedtest := $(TESTDIR)/testfiles
.SECONDEXPANSION: # to expand $$(@D)/.DIR
TESTFLAGS := # Initialize as simple variable
#workaround old cygwin versions
ifeq ($(PETSC_CYGWIN_BROKEN_PIPE),1)
ifeq ($(shell basename $(AR)),ar)
V ?=1
endif
endif
# gmake should turn '-s', '--silent', and '--quiet' into an 's' in the first word of MAKEFLAGS
MAKEFLAGS_FW=$(firstword $(MAKEFLAGS))
# ignore first work if it starts with -, because then there are no shortoptions
MAKEFLAGS_SHORT=$(patsubst -%,,$(MAKEFLAGS_FW))
MAKEFLAGS_SILENT=$(findstring s,$(MAKEFLAGS_SHORT))
V ?= $(if $(MAKEFLAGS_SILENT),0)
ifeq ($(V),) # Default
quiet_HELP := "Use \"$(MAKE) V=1\" to see verbose compile lines, \"$(MAKE) V=0\" to suppress.\n"
quiet = @printf $(quiet_HELP)$(eval quiet_HELP:=)" %10s %s\n" "$1$2" "$@"; $($1)
quiettest = @printf " %10s %s\n" "TEST" "$(@:$(TESTDIR)/counts/%.counts=%)";
else ifeq ($(V),0) # Suppress entire command
quiet = @$($1)
quiettest = @
TESTFLAGS += -o err_only
else # Show the full command line
quiet = $($1)
quiettest =
TESTFLAGS += -v
endif
ifeq ($(FORCE),1)
TESTFLAGS += -f # force test execution
endif
ifeq ($(CUDAMEMCHECK),1)
TESTFLAGS += -U # Add cuda-memcheck option to the flags
endif
ifeq ($(VALGRIND),1)
TESTFLAGS += -V # Add valgrind option to the flags
endif
ifeq ($(DEBUG),1)
TESTFLAGS += -d # Launch test in debugger
endif
ifeq ($(REPLACE),1)
TESTFLAGS += -m # Replace results by passing -m to petscdiff
endif
ifeq ($(OUTPUT),1)
TESTFLAGS += -o 'err_only' # Show only the errors on stdout
endif
ifeq ($(ALT),1)
TESTFLAGS += -M # Replace alt files by passing -M to petscdiff
endif
PRINTONLY ?= 0
ifeq ($(PRINTONLY),1)
TESTFLAGS += -p # Pass -p to petscdiff to print only command
endif
ifeq ($(DIFF_NUMBERS),1)
TESTFLAGS += -j # Pass -j to petscdiff to diff the actual numbers
endif
ifdef OPTIONS
TESTFLAGS += -a '$(OPTIONS)' # override arguments
endif
ifdef EXTRA_OPTIONS
TESTFLAGS += -e '$(EXTRA_OPTIONS)' # add extra arguments
endif
ifdef NP
TESTFLAGS += -n $(NP) # set number of processes
endif
# Override the default timeout that may be found at the top of config/petsc_harness.sh
# This must be an integer. It is given in seconds.
ifdef TIMEOUT
TESTFLAGS += -t $(TIMEOUT) # Override the default timeout
endif
$(generatedtest) : $(petscconf) $(petscvariables) $(CONFIGDIR)/gmakegentest.py $(TESTDIR)/.DIR | $$(@D)/.DIR
$(PYTHON) $(CONFIGDIR)/gmakegentest.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --testdir=$(TESTDIR) --srcdir $(TESTSRCDIR) --pkg-pkgs "$(pkgs)"
ifneq ($(filter-out help docs clean distclean check info gmakeinfo libs all install install-lib checkbadSource checkbadFileChange deletefortranbindings fortranbindings alletags clangformat checkclangformat lint get% %build,$(MAKECMDGOALS:clean%=clean)),)
include $(generatedtest)
endif
ifeq ($(PETSC_LANGUAGE),CXXONLY)
cc_name := CXX
else
cc_name := CC
endif
PETSC_COMPILE.c = $(call quiet,$(cc_name)) -c $(PCC_FLAGS) $($(CLANGUAGE)FLAGS) $(CCPPFLAGS) $(C_DEPFLAGS)
PETSC_COMPILE.cxx = $(call quiet,CXX) -c $(CXX_FLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(CXX_DEPFLAGS)
PETSC_COMPILE.cu = $(call quiet,CUDAC) -c $(MPICXX_INCLUDES) $(CUDAC_FLAGS) $(CUDAPP_FLAGS) $(CUDAFLAGS) $(CUDA_HOSTFLAGS)
PETSC_COMPILE.hip.cpp = $(call quiet,HIPC) -c $(MPICXX_INCLUDES) $(HIPC_FLAGS) $(HIPPP_FLAGS) $(HIPFLAGS) $(HIPPPFLAGS) $(HIPOPTFLAGS) $(HIPC_DEPFLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(HIP_DEPFLAGS)
PETSC_COMPILE.sycl.cxx = $(call quiet,SYCLC) -c $(MPICXX_INCLUDES) $(SYCLC_FLAGS) $(SYCLPP_FLAGS) $(SYCLFLAGS) $(SYCLPPFLAGS) $(SYCLOPTFLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(SYCL_DEPFLAGS)
PETSC_GENDEPS.cu = ${CUDA_PETSC_GENDEPS}
PETSC_COMPILE.F = $(call quiet,FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS)
ifneq ($(KOKKOS_USE_CUDA_COMPILER),)
# Kokkos requires nvcc to be in PATH and the C++ compiler to be given in an environmental variable
KOKC = PATH=`dirname $(CUDAC)`:$(PATH) NVCC_WRAPPER_DEFAULT_COMPILER="$(CUDA_CXX)" $(KOKKOS_BIN)/nvcc_wrapper --expt-extended-lambda
KOKKOS_COMPILE = $(call quiet,KOKC) -c $(CUDAC_FLAGS) ${PETSC_CXXCPPFLAGS} $(CUDACPPFLAGS) $(CUDA_CXXFLAGS) $(MPICXX_INCLUDES)
else ifneq ($(KOKKOS_USE_CUDACLANG_COMPILER),)
KOKKOS_COMPILE = $(PETSC_COMPILE.cu)
else ifneq ($(KOKKOS_USE_HIP_COMPILER),)
KOKKOS_COMPILE = $(PETSC_COMPILE.hip.cpp)
else ifneq ($(KOKKOS_USE_SYCL_COMPILER),)
KOKKOS_COMPILE = $(PETSC_COMPILE.sycl.cxx)
else
KOKKOS_COMPILE = $(PETSC_COMPILE.cxx)
endif
# https://github.com/kokkos/kokkos/pull/5473 used a C++17 feature, inline static variables.
# We found -fvisibility=hidden could hide these variables such that the supposed globally unique
# variables become local to each file including them and thus have multiple copies (see an example
# 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
# See also an older bug report related to visibility, https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59693
#
# Our workaround here is to git rid of -fvisibility=hidden from Kokkos compiler options, so that petsc
# files including Kokkos headers won't be affected by this flag.
#
# The solution is not ideal in the sense we have to duplicate the same workaround to any external libraries
# using C++17 inline static variables. We have to wait for GNU to clarify this issue.
PETSC_COMPILE.kokkos.cxx = $(filter-out -fvisibility=hidden,$(subst -Xcompiler -fvisibility=hidden ,,$(strip $(KOKKOS_COMPILE))))
KOKKOS_LINKER = $(filter-out -fvisibility=hidden,$(subst -Xcompiler -fvisibility=hidden ,,$(strip $(CLINKER))))
ifneq ($(RAJA_USE_CUDA_COMPILER),)
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
else
PETSC_COMPILE.raja.cxx = ${CXX} -o $*.o -c ${CXX_FLAGS} ${CXXFLAGS} ${CXXCPPFLAGS}
endif
testlangs := c cu cxx F F90 kokkos.cxx hip.cpp sycl.cxx raja.cxx
$(foreach lang, $(testlangs), $(eval \
testexe.$(lang) = $(foreach pkg, $(pkgs), $(testsrcs-$(pkg).$(lang):%.$(lang)=$(TESTDIR)/%))))
concattestlang = $(foreach lang, $(2), $(testsrcs-$(1).$(lang):%.$(lang)=$(TESTDIR)/%.o))
testsrcs.o := $(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),$(testlangs)))
testsrcs-rel := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), $(testsrcs-$(pkg).$(lang))))
testsrcs := $(foreach sfile, $(testsrcs-rel), $(TESTSRCDIR)/$(sfile))
# workaround win32fe failure
ifneq (,$(findstring win32fe,$(call quiet,$(cc_name))))
$(TESTDIR)/ts/tutorials/multirate/ex6: | $(TESTDIR)/ts/tutorials/multirate/ex5
$(TESTDIR)/ts/tutorials/multirate/ex8: | $(TESTDIR)/ts/tutorials/multirate/ex6
endif
# Refresh testfiles when sources change, but don't balk if the source file is nonexistent (deleted)
$(generatedtest) : $(testsrcs)
$(testsrcs) :
$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.c | $$(@D)/.DIR
$(PETSC_COMPILE.c) $(abspath $<) -o $@
$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.kokkos.cxx | $$(@D)/.DIR
$(PETSC_COMPILE.kokkos.cxx) $(abspath $<) -o $@
$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.sycl.cxx | $$(@D)/.DIR
$(PETSC_COMPILE.sycl.cxx) $(abspath $<) -o $@
$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.raja.cxx | $$(@D)/.DIR
$(PETSC_COMPILE.raja.cxx) $(abspath $<) -o $@
$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cxx | $$(@D)/.DIR
$(PETSC_COMPILE.cxx) $(abspath $<) -o $@
$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.cu | $$(@D)/.DIR
$(PETSC_COMPILE.cu) $(abspath $<) -o $@ # Compile first so that if there is an error, it comes from a normal compile
@$(PETSC_GENDEPS.cu) $(abspath $<) -o $(@:%.o=%.d) # Generate the dependencies for later
$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.hip.cpp | $$(@D)/.DIR
$(PETSC_COMPILE.hip.cpp) $(abspath $<) -o $@
# Test modules go in the same directory as the target *.o
TESTMODDIR = $(@D)
FCMOD = cd
$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F | $$(@D)/.DIR
ifeq ($(FC_MODULE_OUTPUT_FLAG),)
$(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@)
else
$(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR)
endif
-@$(GFORTRAN_DEP_CLEANUP)
$(TESTDIR)/%.o : $(EXAMPLESDIR)/%.F90 | $$(@D)/.DIR
ifeq ($(FC_MODULE_OUTPUT_FLAG),)
$(call quiet,FCMOD) $(TESTMODDIR) && $(FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(FC_DEPFLAGS) -I$(dir $<) $(abspath $<) -o $(abspath $@)
else
$(PETSC_COMPILE.F) -I$(dir $<) $(abspath $<) -o $@ $(FC_MODULE_OUTPUT_FLAG)$(TESTMODDIR) $(FC_MODULE_FLAG)$(TESTMODDIR)
endif
-@$(GFORTRAN_DEP_CLEANUP)
# This is a hack to fix a broken gfortran.
define GFORTRAN_DEP_CLEANUP
if test -e "$(@:%.o=%.d)" && head -1 "$(@:%.o=%.d)" | grep -F -q -v : ; then\
echo "$(@): \\" > $(@:%.o=%.dtemp) ; \
tr '\n' '@' < $(@:%.o=%.d) | cut -d: -f2- | tr '@' '\n' >> $(@:%.o=%.dtemp) ; \
mv $(@:%.o=%.dtemp) $(@:%.o=%.d); \
fi
endef
# link line constructed differently for gmakefile vs gmakefile.test invocation
ifeq ($(libpetscall),)
PETSC_TEST_LIB = $(PETSC_LIB)
else
PETSC_TEST_LIB = $(C_SH_LIB_PATH) $(PETSC_EXTERNAL_LIB_BASIC)
endif
# manually list some library dependencies to check for circular dependencies
$(TESTDIR)/sys/tests/ex9: PETSC_TEST_LIB = $(PETSC_SYS_LIB)
$(TESTDIR)/vec/vec/tests/ex1: PETSC_TEST_LIB = $(PETSC_VEC_LIB)
$(TESTDIR)/mat/tests/ex1: PETSC_TEST_LIB = $(PETSC_MAT_LIB)
$(TESTDIR)/dm/tests/ex1: PETSC_TEST_LIB = $(PETSC_DM_LIB)
$(TESTDIR)/ksp/ksp/tests/ex1: PETSC_TEST_LIB = $(PETSC_KSP_LIB)
$(TESTDIR)/snes/tests/ex1: PETSC_TEST_LIB = $(PETSC_SNES_LIB)
$(TESTDIR)/ts/tests/ex2: PETSC_TEST_LIB = $(PETSC_TS_LIB)
$(TESTDIR)/tao/tutorials/ex1: PETSC_TEST_LIB = $(PETSC_TAO_LIB)
# MACOS FIREWALL HANDLING
# - if run with MACOS_FIREWALL=1
# (automatically set in $PETSC_ARCH/lib/petsc/conf/petscvariables if configured --with-macos-firewall-rules),
# ensure mpiexec and test executable is on firewall list
#
ifeq ($(MACOS_FIREWALL),1)
FW := /usr/libexec/ApplicationFirewall/socketfilterfw
# There is no reliable realpath command in macOS without need for 3rd party tools like homebrew coreutils
# Using Python's realpath seems like the most robust way here
realpath-py = $(shell $(PYTHON) -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' $(1))
#
define macos-firewall-register
@APP=$(call realpath-py, $(1)); \
if ! sudo -n true 2>/dev/null; then printf "Asking for sudo password to add new firewall rule for\n $$APP\n"; fi; \
sudo $(FW) --remove $$APP --add $$APP --blockapp $$APP
endef
endif
#
macos-firewall-register-mpiexec:
-$(call macos-firewall-register, $(MPIEXEC))
# Test executables
$(testexe.F) $(testexe.F90) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
$(call quiet,FLINKER) -o $@ $^ $(PETSC_TEST_LIB)
-$(call macos-firewall-register,$@)
ifneq (,$(findstring emcc,$(CC)))
$(testexe.c) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
-@$(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)
-@printf '#!/usr/bin/env sh\nnode --redirect-warnings=/dev/null $$0.js $$* | grep -v "Heap resize call from"' > $@
-@chmod u+x $@
else
$(testexe.c) $(testexe.cu) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
$(call quiet,CLINKER) $(EXEFLAGS) -o $@ $^ $(PETSC_TEST_LIB)
-$(call macos-firewall-register,$@)
endif
$(testexe.hip.cpp) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
$(call quiet,CLINKER) -o $@ $^ $(PETSC_TEST_LIB)
-$(call macos-firewall-register,$@)
$(testexe.kokkos.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
$(call quiet,KOKKOS_LINKER) $(EXEFLAGS) -o $@ $^ $(PETSC_TEST_LIB)
-$(call macos-firewall-register,$@)
$(testexe.raja.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
$(call quiet,CLINKER) -o $@ $^ $(PETSC_TEST_LIB)
-$(call macos-firewall-register,$@)
$(testexe.cxx) : $(TESTDIR)/% : $(TESTDIR)/%.o $$^ $(libpetscall)
$(call quiet,CXXLINKER) -o $@ $^ $(PETSC_TEST_LIB)
-$(call macos-firewall-register,$@)
# Fortran source files need petsc*.mod, which isn't explicitly managed in the makefile.
$(foreach pkg, $(pkgs), $(call concattestlang,$(pkg),F F90)) : $(libpetscall)
# Testing convenience targets
.PHONY: test pre-clean
# The Fortran compiler may use out-dated module files in the tutorial and test directories so delete them all
remove-test-mod-files:
-@find src -name "*.mod" -not -path "src/binding/*" -delete
test: remove-test-mod-files report_tests
pre-clean:
@$(RM) -rf $(TESTDIR)/counts $(TESTLOGTAPFILE) $(TESTLOGERRFILE)
@touch $(TESTLOGTAPFILE) $(TESTLOGERRFILE)
@echo "Using MAKEFLAGS:" ${MAKEFLAGS}
check-test-errors:
@grep '^not ok' $(TESTLOGTAPFILE) | grep -v 'Exceeded timeout' | tee $(TESTDIR)/allgtests-tap-err.log
@test ! -s $(TESTDIR)/allgtests-tap-err.log
.PHONY: $(foreach pkg, $(pkgs), test-$(pkg) $(foreach lang, $(testlangs), test-$(pkg).$(lang) test-rm-$(pkg).$(lang)))
testpkgs := $(foreach pkg, $(pkgs), test-$(pkg))
# Targets to run tests in test-$pkg.$lang and delete the executables, language by language
$(testpkgs) : test-% : $(foreach lang, $(testlangs), test-rm-%.$(lang))
# List of raw test run targets
alltesttargets := $(foreach tp, $(testpkgs), $(foreach lang, $(testlangs), $($(tp).$(lang))))
# Run targets
$(alltesttargets) : % : $(TESTDIR)/counts/%.counts
.PHONY: $(alltesttargets)
$(TESTDIR)/counts/%.counts :
$(quiettest) $< $(TESTFLAGS)
# Targets to run tests and remove executables, by package-lang pairs.
# Run the tests in each batch using recursive invocation of make because
# we need all of them to complete before removing the executables. Make
# doesn't guarantee an exploration order for the graph. Only recursive
# if there is something to be done.
alltest-rm := $(foreach pkg, $(pkgs), $(foreach lang, $(testlangs), test-rm-$(pkg).$(lang)))
$(alltest-rm) : test-rm-% : test-%
ifneq ($(NO_RM),1)
$(call quiet,RM) $(addprefix $(TESTDIR)/,$(basename $($(@:test-rm-%=testsrcs-%))))
endif
# Remove intermediate .o files
# This only removes the files at the end which is insufficient
#.INTERMEDIATE: $(testsrcs.o:%.o=%)
# all sources should get recompiled when petscvariables changes (i.e when configure is rerun or when petscvariables is manually edited.)
$(testsrcs.o) : $(petscvariables)
%/.DIR :
@mkdir -p $(@D)
@touch $@
.PRECIOUS: %/.DIR
.SUFFIXES: # Clear .SUFFIXES because we don't use implicit rules
.DELETE_ON_ERROR: # Delete likely-corrupt target file if rule fails
.PHONY: clean cleantest all
cleantest:
${RM} -r $(TESTDIR) $(generatedtest)
clean: cleantest
alltest.d := $(testsrcs.o:%.o=%.d)
# Tell make that alltest.d are all up to date. Without this, the include
# below has quadratic complexity, taking more than one second for a
# do-nothing build of PETSc (much worse for larger projects)
$(alltest.d) : ;
-include $(alltest.d)
# Tests can be generated by searching -- see documentation below
showreport=
ifndef searchin
searchin = " "
endif
ifdef i
searchin = $(i)
endif
ifdef gs
gmakesearch = $(gs)
endif
ifdef gmakesearch
TESTTARGETS := $(filter $(gmakesearch),$(alltesttargets))
ifdef gmakesearchin
TESTTARGETS2 := $(foreach v,$(TESTTARGETS),$(if $(findstring $(gmakesearchin),$(v)),$(v)))
TESTTARGETS := $(TESTTARGETS2)
endif
else ifdef gmakesearchin
TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(gmakesearchin),$(v)),$(v)))
else ifdef argsearch
TESTTARGETS := $(foreach v,$(alltesttargets),$(if $(findstring $(argsearch),$($(v)_ARGS)),$(v)))
else ifdef search
TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) 'name' '$(search)')
else ifdef s
TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) 'name' '$(s)')
else ifdef test-fail
TESTTARGETS := $(shell $(TESTDIR)/echofailures.sh)
else ifdef query
TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) '$(query)' '$(queryval)')
else ifdef q
TESTTARGETS := $(shell $(PYTHON) $(CONFIGDIR)/query_tests.py --testdir=$(TESTDIR) --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --searchin=$(searchin) '$(q)' '$(qv)')
else # No filter - run them all, but delete the executables as we go
TESTTARGETS := $(testpkgs)
ifneq ($(PRINTONLY),1)
showreport = "-s" # Only show full report when all tests are run
endif
endif
.PHONY: report_tests print-test
print-test:
$(info $(TESTTARGETS))
@true
show-fail:
-@$(PYTHON) $(CONFIGDIR)/report_tests.py -d $(TESTDIR)/counts -f
# Don't start running tests until starttime has completed
$(alltesttargets:%=$(TESTDIR)/counts/%.counts) : starttime
# Ensure that libpetsc (if it is a prerequisite) has been built and clean the counts/logs before starting timer
starttime: pre-clean $(libpetscall) macos-firewall-register-mpiexec
@$(eval STARTTIME := $(shell date +%s))
report_tests: starttime $(TESTTARGETS)
@$(eval ENDTIME := $(shell date +%s))
-@ elapsed_time=$$(($(ENDTIME)- $(STARTTIME))) && \
$(PYTHON) $(CONFIGDIR)/report_tests.py -m $(MAKE) -d $(TESTDIR)/counts -t 5 -e $${elapsed_time} $(showreport)
check_output:
$(PYTHON) $(CONFIGDIR)/gmakegentest.py --petsc-dir=$(PETSC_DIR) --petsc-arch=$(PETSC_ARCH) --testdir=$(TESTDIR) --srcdir $(TESTSRCDIR) --pkg-pkgs "$(pkgs)" --check-output
# If users make is a gnumake then these messages are provided even if the user does not do make -f gmakefile.test
HASGMAKEFILE := $(filter gmakefile,$(MAKEFILE_LIST))
ifeq ($(HASGMAKEFILE),gmakefile)
helpdeps:= help-nontest
else
helpdeps:= help-test
endif
help: help-make ${helpdeps}
-@echo ""
help-make:
-@echo
-@echo "PETSc makefile Basic usage:"
-@echo " ${OMAKE} rule <V=1 for verbose output> <other options>"
-@echo
help-nontest:
-@echo "Available rules:"
-@echo " all - build (update) the PETSc and related libraries in parallel"
-@echo " libs - build (update) the PETSc and related libraries"
-@echo " check - run a basic check that the libraries are built correctly and can be used"
-@echo " "
-@echo " getversion - print the PETSc version, or $PETSC_DIR/lib/petsc/bin/petscversion"
-@echo " getmpiexec - print the mpiexec to use to run PETSc programs"
-@echo " getlinklibs - print the libraries that a PETSc application must link against"
-@echo " getincludedirs - print the include directories that a PETSc application must be compiled against"
-@echo " getcflags - print the C compiler flags PETSc is using"
-@echo " getcxxflags - print the C++ compiler flags PETSc is using"
-@echo " getfortranflags - print the Fortran compiler flags PETSc is using"
-@echo " "
-@echo " petsc4pytest - run the entire petsc4py test suite"
-@echo " alltests - run the entire PETSc test suite"
-@echo " test - use \"make help-test\" for help on running the extensive tests"
-@echo
-@echo "Developer rules:"
-@echo " docs - build all the PETSc documentation locally as a website"
-@echo " clean - delete libraries and Fortran module files (used in $PETSC_DIR)"
-@echo " delete compiled examples, .o and related files (used in tutorials or test directories)"
-@echo " clangformat - run clangformat on the PETSc C/C++ source code"
-@echo " clang-tidy - run clang-tidy on the PETSc C code"
-@echo " fortranbindings - regenerate Fortran stubs/interface definitions, needed after git pulls or source code changes"
-@echo " deletefortranbindings - delete the generated Fortran stubs/interface definitions"
-@echo " checkbadSource - check the source code for violations of coding standards"
-@echo " abitest - Compare ABI/API of two versions of PETSc library with the old one defined by PETSC_{DIR,ARCH}_ABI_OLD"
-@echo " reconfigure - delete libraries and Fortran module files and run the previously run configure again"
-@echo " lint - run lint on the source code, including its embedded documentation"
-@echo " Run \"${OMAKE} help-lint\" for lint options"
-@echo " "
-@echo "Building website: (run in the doc directory)"
-@cd doc; ${OMAKE} help
-@echo " "
help-test:
-@echo "Test usage:"
-@echo " ${OMAKE} test <options>"
-@echo
-@echo "Options:"
-@echo " NO_RM=1 Do not remove the executables after running"
-@echo " REPLACE=1 Replace the output in PETSC_DIR source tree (-m to test scripts)"
-@echo " OUTPUT=1 Show only the errors on stdout"
-@echo " ALT=1 Replace 'alt' output in PETSC_DIR source tree (-M to test scripts)"
-@echo " DIFF_NUMBERS=1 Diff the numbers in the output (-j to test scripts and petscdiff)"
-@echo " CUDAMEMCHECK=1 Execute the tests using cuda-memcheck (-U to test scripts)"
-@echo " Use PETSC_CUDAMEMCHECK_COMMAND to change the executable to run and"
-@echo " PETSC_CUDAMEMCHECK_ARGS to change the arguments (note: both"
-@echo " cuda-memcheck and compute-sanitizer are supported)"
-@echo " VALGRIND=1 Execute the tests using valgrind (-V to test scripts)"
-@echo " DEBUG=1 Launch tests in the debugger (-d to the scripts)"
-@echo " NP=<num proc> Set a number of processors to pass to scripts."
-@echo " FORCE=1 Force SKIP or TODO tests to run"
-@echo " PRINTONLY=1 Print the command, but do not run. For loops print first command"
-@echo " TIMEOUT=<time> Test timeout limit in seconds (default in config/petsc_harness.sh)"
-@echo " TESTDIR='tests' Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}"
-@echo " or $${PREFIX_DIR}/$${TESTDIR}"
-@echo " or $${PREFIX_DIR}/share/petsc/examples/$${TESTDIR})"
-@echo " TESTBASE='tests' Subdirectory where tests are run ($${PETSC_DIR}/$${PETSC_ARCH}/$${TESTDIR}"
-@echo " OPTIONS='<args>' Override options to scripts (-a to test scripts)"
-@echo " EXTRA_OPTIONS='<args>' Add options to scripts (-e to test scripts)"
-@echo
-@echo "Special options for macOS:"
-@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"
-@echo
-@echo "Tests can be generated by searching with multiple methods"
-@echo " For general searching (using config/query_tests.py):"
-@echo " ${OMAKE} test search='sys*ex2*'"
-@echo " or the shortcut using s"
-@echo " ${OMAKE} test s='sys*ex2*'"
-@echo " You can also use the full path to a file directory"
-@echo " ${OMAKE} test s='src/sys/tests/'"
-@echo " or a file"
-@echo " ${OMAKE} test s='src/sys/tests/ex1.c'"
-@echo
-@echo " To search for fields from the original test definitions:"
-@echo " ${OMAKE} test query='requires' queryval='*MPI_PROCESS_SHARED_MEMORY*'"
-@echo " or the shortcut using q and qv"
-@echo " ${OMAKE} test q='requires' qv='*MPI_PROCESS_SHARED_MEMORY*'"
-@echo " To filter results from other searches, use searchin"
-@echo " ${OMAKE} test s='src/sys/tests/' searchin='*options*'"
-@echo
-@echo " To re-run the last tests which failed:"
-@echo " ${OMAKE} test test-fail='1'"
-@echo
-@echo " To see which targets match a given pattern (useful for doing a specific target):"
-@echo " ${OMAKE} print-test search=sys*"
-@echo
-@echo " To build an executable, give full path to location:"
-@echo ' ${OMAKE} $${PETSC_ARCH}/tests/sys/tests/ex1'
-@echo " or make the test with NO_RM=1"
-@echo
help-targets:
-@echo "All makefile targets and their dependencies:"
-@grep ^[a-z] ${makefile} | grep : | grep -v =
-@echo
|