diff --git a/cmake/modules/DumuxTestMacros.cmake b/cmake/modules/DumuxTestMacros.cmake index 195bfea19720e77814573ed0546bd33a7ac11ab0..e6a9e926bc92296084dfab310df723771aef7630 100644 --- a/cmake/modules/DumuxTestMacros.cmake +++ b/cmake/modules/DumuxTestMacros.cmake @@ -1,29 +1,6 @@ # Dumux wrapper for the module that provides tools for testing the Dune way. # We have a wrapper to have to possibily of supporting multiple Dune versions. # -# .. cmake_function:: dumux_declare_test_label -# -# .. cmake_brief:: -# -# Declare labels for :ref:`dumux_add_test`. -# -# .. cmake_param:: LABELS -# :multi: -# -# The names of labels to declare. Label names must be nonempty and -# consist only of alphanumeric characters plus :code:`-` and :code:`_` -# to make sure it is easy to construct regular expressions from them for -# :code:`ctest -L ${label_regex}`. -# -# Labels need to be declared to ensure that the target -# :code:`build_${label}_tests` exists. They will normally be declared -# on-demand by :ref:`dumux_add_test`. But sometimes it is useful to be able to -# run :code:`make build_${label}_tests` whether or not any tests with that -# label exists in a module. For these cases :ref:`dune_declare_test_label` can -# be called explicitly. -# -# The label :code:`quick` is always predeclared. -# # .. cmake_function:: dumux_add_test # # .. cmake_brief:: @@ -203,122 +180,50 @@ # build all tests during `make all`. Note, that this may take quite some time for some modules. # If not in use, you have to build tests through the target :code:`build_tests`. # +# .. cmake_function:: dumux_evaluate_cmake_guard +# +# .. cmake_brief:: +# +# Fills the passed variable with TRUE if all guards evaluate to TRUE and FALSE otherwise +# +# .. cmake_param:: CMAKE_GUARD +# :multi: +# :argname: condition +# +# A number of conditions that CMake should evaluate. +# Uses the same mechanics that `dumux_add_test` uses to evaluate its CMAKE_GUARD argument. +# +# The passed condition can be a complex expression like +# `( A OR B ) AND ( C OR D )`. Mind the spaces around the parentheses. +# +# Example: Write CMAKE_GUARD dune-foo_FOUND if you want to set a variable +# that is only true if the module dune-foo has been found. +# + +# Note: This forwards to dune_add_test but enables another layer in case we need to support +# future Dune features with older Dune versions supported by Dumux +function(dumux_add_test) + dune_add_test(${ARGV}) +endfunction() -# Note: This is a copy of dune_declare_test_label to be backwards compatible with Dune 2.6 but enable labels -function(dumux_declare_test_label) +# Evaluate test guards like dune_add_test internally does +function(dumux_evaluate_cmake_guard GUARD_LETS_YOU_PASS) include(CMakeParseArguments) - set(OPTIONS) - set(SINGLEARGS) - set(MULTIARGS LABELS) - cmake_parse_arguments(arg "${OPTIONS}" "${SINGLEARGS}" "${MULTIARGS}" ${ARGN}) + set(MULTIARGS CMAKE_GUARD) + cmake_parse_arguments(EVALGUARD "${OPTIONS}" "${SINGLEARGS}" "${MULTIARGS}" ${ARGN}) - if( (DEFINED arg_UNPARSED_ARGUMENTS) AND NOT ( arg_UNPARSED_ARGUMENTS STREQUAL "" ) ) - message(FATAL_ERROR "Unhandled extra arguments given to dumux_declare_test_label(): " - "<${arg_UNPARSED_ARGUMENTS}>") + # Check whether the parser produced any errors + if(EVALGUARD_UNPARSED_ARGUMENTS) + message(WARNING "Unrecognized arguments ('${EVALGUARD_UNPARSED_ARGUMENTS}') for dumux_evaluate_cmake_guard!") endif() - foreach(label IN LISTS arg_LABELS) - # Make sure the label is not empty, and does not contain any funny - # characters, in particular regex characters - if(NOT (label MATCHES "[-_0-9a-zA-Z]+")) - message(FATAL_ERROR "Refusing to add label \"${label}\" since it is " - "empty or contains funny characters (characters other than " - "alphanumeric ones and \"-\" or \"_\"; the intent of this restriction " - "is to make construction of the argument to \"ctest -L\" easier") - endif() - set(target "build_${label}_tests") - if(NOT TARGET "${target}") - add_custom_target("${target}") + # determine if all condition of the guard are met + set(${GUARD_LETS_YOU_PASS} TRUE PARENT_SCOPE) + set(FAILED_CONDITION_PRINTING "") + foreach(condition ${ADDTEST_CMAKE_GUARD}) + separate_arguments(condition) + if(NOT (${condition})) + set(${GUARD_LETS_YOU_PASS} FALSE PARENT_SCOPE) endif() endforeach() -endfunction(dumux_declare_test_label) - -# predefine "quick" test label so build_quick_tests can be built -# unconditionally -dumux_declare_test_label(LABELS quick) - -# Note: This is a copy of dune_declare_test_label to be backwards compatible with Dune 2.6 but enable labels -# After labels are available on a release branch this can simply forward to dune_add_test -function(dumux_add_test) - # for new versions just forward to dune_add_test - if(DUNE_COMMON_VERSION VERSION_GREATER 2.6.0) - dune_add_test(${ARGV}) - - # otherwise deal with labels separately (backwards-compatibilty layer with Dune 2.6.0) - else() - include(CMakeParseArguments) - set(OPTIONS EXPECT_COMPILE_FAIL EXPECT_FAIL SKIP_ON_77 COMPILE_ONLY) - set(SINGLEARGS NAME TARGET TIMEOUT) - set(MULTIARGS SOURCES COMPILE_DEFINITIONS COMPILE_FLAGS LINK_LIBRARIES CMD_ARGS MPI_RANKS COMMAND CMAKE_GUARD LABELS) - cmake_parse_arguments(ADDTEST "${OPTIONS}" "${SINGLEARGS}" "${MULTIARGS}" ${ARGN}) - - # Check whether the parser produced any errors - if(ADDTEST_UNPARSED_ARGUMENTS) - message(WARNING "Unrecognized arguments ('${ADDTEST_UNPARSED_ARGUMENTS}') for dumux_add_test!") - endif() - - # remove labels from the argument list - set(FORWARD_ARGS ${ARGV}) - if(ADDTEST_LABELS) - string(REPLACE "LABELS;${ADDTEST_LABELS}" "" FORWARD_ARGS "${FORWARD_ARGS}") - # replace head or trailing ";" - string(REGEX REPLACE ";^" "" FORWARD_ARGS "${FORWARD_ARGS}") - string(REGEX REPLACE ";$" "" FORWARD_ARGS "${FORWARD_ARGS}") - endif() - - # foward to dune function - dune_add_test(${FORWARD_ARGS}) - - # take care of labels afterwards - if(NOT ADDTEST_NAME) - # try deducing the test name from the executable name - if(ADDTEST_TARGET) - set(ADDTEST_NAME ${ADDTEST_TARGET}) - endif() - # try deducing the test name form the source name - if(ADDTEST_SOURCES) - list(LENGTH ADDTEST_SOURCES len) - get_filename_component(ADDTEST_NAME ${ADDTEST_SOURCES} NAME_WE) - endif() - endif() - - if(ADDTEST_SOURCES) - set(ADDTEST_TARGET ${ADDTEST_NAME}) - endif() - - # possibly set default for mpi ranks - if(NOT ADDTEST_MPI_RANKS) - set(ADDTEST_MPI_RANKS 1) - endif() - - # Discard all parallel tests if MPI was not found - if(NOT MPI_FOUND) - set(DUNE_MAX_TEST_CORES 1) - endif() - - # make sure each label exists and its name is acceptable - dumux_declare_test_label(LABELS ${ADDTEST_LABELS}) - - # Have build_${label}_tests depend on the given target in - # order to trigger the build correctly - if(NOT ADDTEST_EXPECT_COMPILE_FAIL) - foreach(label IN LISTS ADDTEST_LABELS) - add_dependencies(build_${label}_tests ${ADDTEST_TARGET}) - endforeach() - endif() - - # Add one test for each specified processor number - foreach(procnum ${ADDTEST_MPI_RANKS}) - if((NOT "${procnum}" GREATER "${DUNE_MAX_TEST_CORES}") AND (NOT ADDTEST_COMPILE_ONLY)) - set(ACTUAL_NAME ${ADDTEST_NAME}) - - if(NOT ${procnum} STREQUAL "1") - set(ACTUAL_NAME "${ACTUAL_NAME}-mpi-${procnum}") - endif() - - # Set the labels on the test - set_tests_properties(${ACTUAL_NAME} PROPERTIES LABELS "${ADDTEST_LABELS}") - endif() - endforeach() - endif() endfunction() diff --git a/examples/liddrivencavity/CMakeLists.txt b/examples/liddrivencavity/CMakeLists.txt index ab2ce8d7c23823e913eaebc00e36fd314b09bcd8..008e2b11786a8fc0d477dee3061c740827d2f7ec 100644 --- a/examples/liddrivencavity/CMakeLists.txt +++ b/examples/liddrivencavity/CMakeLists.txt @@ -1,11 +1,13 @@ add_subdirectory(reference_data) dune_symlink_to_source_files(FILES "params_re1.input" "params_re1000.input" "run_and_plot.py") -set(DUMUX_EXAMPLE_LDC_CMAKE_GUARDS "( HAVE_UMFPACK )") + +# set the test guard for the following tests (only enable test if UMFPack is available) +set(DUMUX_EXAMPLE_LDC_CMAKE_GUARD "( HAVE_UMFPACK )") dumux_add_test(NAME example_ff_liddrivencavity SOURCES main.cc LABELS freeflow navierstokes example - CMAKE_GUARD DUMUX_EXAMPLE_LDC_CMAKE_GUARDS + CMAKE_GUARD ${DUMUX_EXAMPLE_LDC_CMAKE_GUARD} COMMAND ${CMAKE_SOURCE_DIR}/bin/testing/runtest.py CMD_ARGS --script fuzzy --files ${CMAKE_SOURCE_DIR}/test/references/test_ff_navierstokes_closedsystem_ldc_re1-reference.vtu @@ -23,8 +25,11 @@ dumux_add_test(NAME example_ff_liddrivencavity_re1000 --command "${CMAKE_CURRENT_BINARY_DIR}/example_ff_liddrivencavity params_re1000.input -Grid.Cells \"64 64\" -TimeLoop.TEnd 50") -# test plot script (only if UMFPack is available and the tests above were actually run) -if(DUMUX_EXAMPLE_LDC_CMAKE_GUARDS) +# test plot script (only if the guard enables to TRUE, i.e. all preconditions for the above tests are met) +dumux_evaluate_cmake_guard(DUMUX_ENABLE_LDC_PLOT_TEST + CMAKE_GUARD ${DUMUX_EXAMPLE_LDC_CMAKE_GUARD}) + +if (DUMUX_ENABLE_LDC_PLOT_TEST) dumux_add_test(NAME example_ff_liddrivencavity_plot TARGET example_ff_liddrivencavity COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/run_and_plot.py