Skip to content

Commit cef77db

Browse files
authored
Merge pull request #727 from sebproell/cmake-cache-vars
CMake: ensure that cache variables are set
2 parents 5e6ebb3 + 0cefc62 commit cef77db

File tree

6 files changed

+105
-26
lines changed

6 files changed

+105
-26
lines changed

CMakeLists.txt

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,13 +137,21 @@ enable_testing()
137137

138138
# NOTE: --mca orte_tmpdir_base [...] can be removed for openmpi >= 4.1.1 according to
139139
# https://github.com/open-mpi/ompi/issues/8510#issuecomment-1329297350
140-
set(MPIEXEC_EXTRA_OPTS_FOR_TESTING
141-
"--bind-to none --use-hwthread-cpus --mca orte_tmpdir_base ${PROJECT_BINARY_DIR}/tmp"
142-
)
140+
four_c_process_cache_variable(
141+
FOUR_C_MPIEXEC_ARGS_FOR_TESTING
142+
TYPE
143+
STRING
144+
DESCRIPTION
145+
"Arguments to pass to mpiexec for testing."
146+
DEFAULT
147+
"--bind-to none --use-hwthread-cpus --mca orte_tmpdir_base ${PROJECT_BINARY_DIR}/tmp"
148+
)
149+
# We might need to add more arguments. Initialize with the user input.
150+
set(_mpiexec_all_args_for_testing ${FOUR_C_MPIEXEC_ARGS_FOR_TESTING})
143151

144152
if(FOUR_C_ENABLE_ADDRESS_SANITIZER)
145153
# Do not detect leaks, we only care about UB inducing memory issues
146-
string(APPEND MPIEXEC_EXTRA_OPTS_FOR_TESTING " -x LSAN_OPTIONS=detect_leaks=0")
154+
string(APPEND _mpiexec_all_args_for_testing " -x LSAN_OPTIONS=detect_leaks=0")
147155
set(FOUR_C_ENABLE_ADDRESS_SANITIZER_TEST_OPTIONS "LSAN_OPTIONS=detect_leaks=0")
148156
endif()
149157

cmake/functions/four_c_auto_define_tests.cmake

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,11 @@ function(_set_up_unit_test_target _module_under_test _target)
5656

5757
# the first process will write a unit test report
5858
separate_arguments(
59-
MPIEXEC_EXTRA_OPTS_FOR_TESTING_LIST UNIX_COMMAND ${MPIEXEC_EXTRA_OPTS_FOR_TESTING}
59+
_mpiexec_all_args_for_testing_list UNIX_COMMAND ${_mpiexec_all_args_for_testing}
6060
)
6161

6262
set(mpi_arguments
63-
${MPIEXEC_EXTRA_OPTS_FOR_TESTING_LIST}
63+
${_mpiexec_all_args_for_testing_list}
6464
-np
6565
1
6666
$<TARGET_FILE:${_target}>
@@ -73,7 +73,7 @@ function(_set_up_unit_test_target _module_under_test _target)
7373
APPEND
7474
mpi_arguments
7575
:
76-
${MPIEXEC_EXTRA_OPTS_FOR_TESTING_LIST}
76+
${_mpiexec_all_args_for_testing_list}
7777
-np
7878
${remaining_procs}
7979
$<TARGET_FILE:${_target}>

cmake/functions/four_c_configure_dependency.cmake

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,16 @@ function(four_c_configure_dependency _package_name)
209209
four_c_process_global_option(
210210
FOUR_C_WITH_${_package_name_sanitized} "Build 4C with ${_package_name}" ${_parsed_DEFAULT}
211211
)
212+
# Add a cache entry to set the root directory of the package.
213+
four_c_process_cache_variable(
214+
FOUR_C_${_package_name_sanitized}_ROOT
215+
TYPE
216+
PATH
217+
DESCRIPTION
218+
"Root directory of ${_package_name}"
219+
DEFAULT
220+
""
221+
)
212222

213223
if(${_parsed_DEFAULT} STREQUAL "ON")
214224
if(NOT FOUR_C_WITH_${_package_name_sanitized})

cmake/functions/four_c_process_global_option.cmake

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,59 @@ function(four_c_process_global_option option_name description default)
1313
if(NOT option_name MATCHES "FOUR_C_.*")
1414
message(FATAL_ERROR "Disallowed option '${option_name}'. Option needs to start with 'FOUR_C_'.")
1515
endif()
16-
option("${option_name}" "${description}" "${default}")
16+
option("${option_name}" "${description} (default: ${default})" "${default}")
1717
if(${option_name})
1818
message(STATUS "Option ${option_name} = ON")
1919
else()
2020
message(STATUS "Option ${option_name} = OFF")
2121
endif()
2222
endfunction()
23+
24+
# Initialize a cache variable. This function is almost equivalent to the builtin CMake
25+
# set() command, except that it also prints info on whether the variable is set and allows to
26+
# ensure a consistent style. Note that you need to use four_c_process_global_option() for the
27+
# common case of a BOOL variable.
28+
#
29+
# Usage:
30+
# four_c_initialize_cache_variable(variable_name
31+
# TYPE <STRING|FILEPATH|PATH>
32+
# DESCRIPTION "Description of the variable"
33+
# DEFAULT "Default value of the variable")
34+
#
35+
function(four_c_process_cache_variable variable_name)
36+
if(NOT variable_name MATCHES "FOUR_C_.*")
37+
message(
38+
FATAL_ERROR
39+
"Disallowed variable name '${variable_name}'. Variable name needs to start with 'FOUR_C_'."
40+
)
41+
endif()
42+
43+
set(options "")
44+
set(oneValueArgs TYPE DESCRIPTION DEFAULT)
45+
set(multiValueArgs "")
46+
cmake_parse_arguments(
47+
_parsed
48+
"${options}"
49+
"${oneValueArgs}"
50+
"${multiValueArgs}"
51+
${ARGN}
52+
)
53+
54+
if(DEFINED _parsed_UNPARSED_ARGUMENTS)
55+
message(FATAL_ERROR "There are unparsed arguments: ${_parsed_UNPARSED_ARGUMENTS}")
56+
endif()
57+
58+
# Ensure that only one of the options STRING or (FILE)PATH for the cache variable type is set.
59+
if(NOT _parsed_TYPE MATCHES "STRING|FILEPATH|PATH")
60+
message(
61+
FATAL_ERROR
62+
"Invalid type '${_parsed_TYPE}' for cache variable '${variable_name}'. Allowed types are STRING, FILEPATH and PATH."
63+
)
64+
endif()
65+
66+
set(${variable_name}
67+
"${_parsed_DEFAULT}"
68+
CACHE ${_parsed_TYPE} "${_parsed_DESCRIPTION} (default: ${_parsed_DEFAULT})"
69+
)
70+
message(STATUS "Cache variable ${variable_name} = ${${variable_name}}")
71+
endfunction()

cmake/functions/four_c_testing_functions.cmake

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -291,12 +291,12 @@ function(four_c_test)
291291
set(test_command
292292
"mkdir -p ${test_directory} \
293293
&& ${FOUR_C_ENABLE_ADDRESS_SANITIZER_TEST_OPTIONS} $<TARGET_FILE:${FOUR_C_EXECUTABLE_NAME}> --to-yaml ${base_test_file} ${test_directory}/converted_input.yaml \
294-
&& ${MPIEXEC_EXECUTABLE} ${MPIEXEC_EXTRA_OPTS_FOR_TESTING} -np ${base_NP} $<TARGET_FILE:${FOUR_C_EXECUTABLE_NAME}> ${test_directory}/converted_input.yaml ${test_directory}/xxx"
294+
&& ${MPIEXEC_EXECUTABLE} ${_mpiexec_all_args_for_testing} -np ${base_NP} $<TARGET_FILE:${FOUR_C_EXECUTABLE_NAME}> ${test_directory}/converted_input.yaml ${test_directory}/xxx"
295295
)
296296
else()
297297
set(test_command
298298
"mkdir -p ${test_directory} \
299-
&& ${MPIEXEC_EXECUTABLE} ${MPIEXEC_EXTRA_OPTS_FOR_TESTING} -np ${base_NP} $<TARGET_FILE:${FOUR_C_EXECUTABLE_NAME}> ${base_test_file} ${test_directory}/xxx"
299+
&& ${MPIEXEC_EXECUTABLE} ${_mpiexec_all_args_for_testing} -np ${base_NP} $<TARGET_FILE:${FOUR_C_EXECUTABLE_NAME}> ${base_test_file} ${test_directory}/xxx"
300300
)
301301
endif()
302302

@@ -362,7 +362,7 @@ function(four_c_test)
362362
)
363363
set(restart_test_directory ${PROJECT_BINARY_DIR}/framework_test_output/${name_of_test})
364364
set(test_command
365-
"mkdir -p ${restart_test_directory} && ${MPIEXEC_EXECUTABLE} ${MPIEXEC_EXTRA_OPTS_FOR_TESTING} -np ${restart_NP} $<TARGET_FILE:${FOUR_C_EXECUTABLE_NAME}> ${restart_test_file} ${restart_test_directory}/xxx restartfrom=${test_directory}/xxx restart=${_parsed_RESTART_STEP}"
365+
"mkdir -p ${restart_test_directory} && ${MPIEXEC_EXECUTABLE} ${_mpiexec_all_args_for_testing} -np ${restart_NP} $<TARGET_FILE:${FOUR_C_EXECUTABLE_NAME}> ${restart_test_file} ${restart_test_directory}/xxx restartfrom=${test_directory}/xxx restart=${_parsed_RESTART_STEP}"
366366
)
367367

368368
# Optional OpenMP threads per processor
@@ -419,7 +419,7 @@ function(four_c_test)
419419
# parallel run
420420
set(name_of_ensight_test "${name_of_test}-post_ensight_parallel")
421421
set(ensight_command
422-
"${MPIEXEC_EXECUTABLE}\ ${MPIEXEC_EXTRA_OPTS_FOR_TESTING}\ -np\ ${_parsed_NP}\ ./post_ensight\ --file=${test_directory}/xxx\ --output=${test_directory}/xxx_parallel --outputtype=bin\ --stress=ndxyz && ${FOUR_C_PYTHON_VENV_BUILD}/bin/python3 ${PROJECT_SOURCE_DIR}/tests/post_processing_test/ensight_comparison.py ${source_file} ${test_directory}/xxx_parallel_structure.case"
422+
"${MPIEXEC_EXECUTABLE}\ ${_mpiexec_all_args_for_testing}\ -np\ ${_parsed_NP}\ ./post_ensight\ --file=${test_directory}/xxx\ --output=${test_directory}/xxx_parallel --outputtype=bin\ --stress=ndxyz && ${FOUR_C_PYTHON_VENV_BUILD}/bin/python3 ${PROJECT_SOURCE_DIR}/tests/post_processing_test/ensight_comparison.py ${source_file} ${test_directory}/xxx_parallel_structure.case"
423423
)
424424
_add_test_with_options(
425425
NAME_OF_TEST
@@ -484,7 +484,7 @@ function(four_c_test_nested_parallelism name_of_input_file_1 name_of_input_file_
484484
NAME ${name_of_input_file_1}-nestedPar
485485
COMMAND
486486
bash -c
487-
"mkdir -p ${test_directory} && ${MPIEXEC_EXECUTABLE} ${MPIEXEC_EXTRA_OPTS_FOR_TESTING} -np 3 $<TARGET_FILE:${FOUR_C_EXECUTABLE_NAME}> -ngroup=2 -glayout=1,2 -nptype=separateDatFiles ${PROJECT_SOURCE_DIR}/tests/input_files/${name_of_input_file_1} ${test_directory}/xxx ${PROJECT_SOURCE_DIR}/tests/input_files/${name_of_input_file_2} ${test_directory}/xxxAdditional"
487+
"mkdir -p ${test_directory} && ${MPIEXEC_EXECUTABLE} ${_mpiexec_all_args_for_testing} -np 3 $<TARGET_FILE:${FOUR_C_EXECUTABLE_NAME}> -ngroup=2 -glayout=1,2 -nptype=separateDatFiles ${PROJECT_SOURCE_DIR}/tests/input_files/${name_of_input_file_1} ${test_directory}/xxx ${PROJECT_SOURCE_DIR}/tests/input_files/${name_of_input_file_2} ${test_directory}/xxxAdditional"
488488
)
489489

490490
require_fixture(${name_of_input_file_1}-nestedPar test_cleanup)
@@ -497,7 +497,7 @@ function(four_c_test_nested_parallelism name_of_input_file_1 name_of_input_file_
497497
NAME ${name_of_input_file_1}-nestedPar-restart
498498
COMMAND
499499
bash -c
500-
"${MPIEXEC_EXECUTABLE} ${MPIEXEC_EXTRA_OPTS_FOR_TESTING} -np 3 $<TARGET_FILE:${FOUR_C_EXECUTABLE_NAME}> -ngroup=2 -glayout=1,2 -nptype=separateDatFiles ${PROJECT_SOURCE_DIR}/tests/input_files/${name_of_input_file_1} ${test_directory}/xxx restart=${restart_step} ${PROJECT_SOURCE_DIR}/tests/input_files/${name_of_input_file_2} ${test_directory}/xxxAdditional restart=${restart_step}"
500+
"${MPIEXEC_EXECUTABLE} ${_mpiexec_all_args_for_testing} -np 3 $<TARGET_FILE:${FOUR_C_EXECUTABLE_NAME}> -ngroup=2 -glayout=1,2 -nptype=separateDatFiles ${PROJECT_SOURCE_DIR}/tests/input_files/${name_of_input_file_1} ${test_directory}/xxx restart=${restart_step} ${PROJECT_SOURCE_DIR}/tests/input_files/${name_of_input_file_2} ${test_directory}/xxxAdditional restart=${restart_step}"
501501
)
502502

503503
require_fixture(
@@ -558,7 +558,7 @@ function(four_c_test_framework)
558558
endif()
559559

560560
set(_run_4C
561-
${MPIEXEC_EXECUTABLE}\ ${MPIEXEC_EXTRA_OPTS_FOR_TESTING}\ -np\ ${num_proc}\ $<TARGET_FILE:${FOUR_C_EXECUTABLE_NAME}>\ ${test_directory}/xxx.4C.yaml\ ${test_directory}/xxx
561+
${MPIEXEC_EXECUTABLE}\ ${_mpiexec_all_args_for_testing}\ -np\ ${num_proc}\ $<TARGET_FILE:${FOUR_C_EXECUTABLE_NAME}>\ ${test_directory}/xxx.4C.yaml\ ${test_directory}/xxx
562562
) # 4C is run using the generated input file
563563

564564
add_test(
@@ -584,7 +584,7 @@ function(four_c_test_cut_test num_proc)
584584

585585
set(RUNTESTS
586586
# Run all the cuttests with num_proc except from alex53
587-
${MPIEXEC_EXECUTABLE}\ ${MPIEXEC_EXTRA_OPTS_FOR_TESTING}\ -np\ ${num_proc}\ ${PROJECT_BINARY_DIR}/cut_test\ --ignore_test=alex53
587+
${MPIEXEC_EXECUTABLE}\ ${_mpiexec_all_args_for_testing}\ -np\ ${num_proc}\ ${PROJECT_BINARY_DIR}/cut_test\ --ignore_test=alex53
588588
# Run alex53 serially
589589
${FOUR_C_ENABLE_ADDRESS_SANITIZER_TEST_OPTIONS}\ ${PROJECT_BINARY_DIR}/cut_test\ --test=alex53
590590
)
@@ -645,7 +645,7 @@ function(
645645
${FOUR_C_ENABLE_ADDRESS_SANITIZER_TEST_OPTIONS}\ ./post_ensight\ --file=${test_directory}/xxx${IDENTIFIER}\ --output=${test_directory}/xxx${IDENTIFIER}_SER_${name_of_input_file}\ --stress=${stresstype}\ --strain=${straintype}\ --start=${startstep}
646646
)
647647
set(RUNPOSTFILTER_PAR
648-
${MPIEXEC_EXECUTABLE}\ ${MPIEXEC_EXTRA_OPTS_FOR_TESTING}\ -np\ ${num_proc}\ ./post_ensight\ --file=${test_directory}/xxx${IDENTIFIER}\ --output=${test_directory}/xxx${IDENTIFIER}_PAR_${name_of_input_file}\ --stress=${stresstype}\ --strain=${straintype}\ --start=${startstep}
648+
${MPIEXEC_EXECUTABLE}\ ${_mpiexec_all_args_for_testing}\ -np\ ${num_proc}\ ./post_ensight\ --file=${test_directory}/xxx${IDENTIFIER}\ --output=${test_directory}/xxx${IDENTIFIER}_PAR_${name_of_input_file}\ --stress=${stresstype}\ --strain=${straintype}\ --start=${startstep}
649649
)
650650

651651
# remove file ending of input file for reference file

cmake/setup_tests.cmake

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,33 @@
66
# SPDX-License-Identifier: LGPL-3.0-or-later
77

88
if(FOUR_C_BUILD_TYPE_UPPER STREQUAL "DEBUG")
9-
set(FOUR_C_TEST_TIMEOUT_SCALE
10-
4
11-
CACHE STRING "Scale timeout of tests by this factor."
12-
)
9+
set(_default_timeout_scale 4)
1310
else()
14-
set(FOUR_C_TEST_TIMEOUT_SCALE
15-
1
16-
CACHE STRING "Scale timeout of tests by this factor."
17-
)
11+
set(_default_timeout_scale 1)
1812
endif()
19-
message(STATUS "Global test timeout scale is ${FOUR_C_TEST_TIMEOUT_SCALE}.")
13+
four_c_process_cache_variable(
14+
FOUR_C_TEST_TIMEOUT_SCALE
15+
TYPE
16+
STRING
17+
DESCRIPTION
18+
"Scale timeout of tests by this factor."
19+
DEFAULT
20+
${_default_timeout_scale}
21+
)
2022

2123
math(EXPR FOUR_C_TEST_GLOBAL_TIMEOUT "120*${FOUR_C_TEST_TIMEOUT_SCALE}")
2224
message(STATUS "The scaled global test timeout is ${FOUR_C_TEST_GLOBAL_TIMEOUT} s.")
2325

26+
four_c_process_cache_variable(
27+
FOUR_C_PVPYTHON
28+
TYPE
29+
FILEPATH
30+
DESCRIPTION
31+
"Path to the pvpython executable used for post-processing tests"
32+
DEFAULT
33+
"pvpython-not-set"
34+
)
35+
2436
# Fetch GoogleTest and setup the unit tests if option is enabled
2537
four_c_process_global_option(FOUR_C_WITH_GOOGLETEST "Use GoogleTest for unit testing" ON)
2638
if(FOUR_C_WITH_GOOGLETEST)

0 commit comments

Comments
 (0)