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
|
cmake_minimum_required(VERSION 3.17.0 FATAL_ERROR)
# prevent multiple inclusion
if (DEFINED TESTING_UTILITIES_LOADED)
return()
endif ()
set(TESTING_UTILITIES_LOADED YES)
# ensure CTest is loaded (e.g. for BUILD_TESTING variable)
include(CTest)
set(EXCLUDE_TEST_TARGET_BY_DEFAULT ON)
set(DISABLE_UNSTABLE_TESTS_BY_DEFAULT ON)
if (ENABLE_DEVEL_DEFAULTS)
set(EXCLUDE_TEST_TARGET_BY_DEFAULT OFF)
set(DISABLE_UNSTABLE_TESTS_BY_DEFAULT OFF)
endif ()
option(EXCLUDE_TESTS_FROM_ALL "specifies whether to exclude tests from the 'all' target (enabled by default)"
"${EXCLUDE_TEST_TARGET_BY_DEFAULT}")
option(DISABLE_UNSTABLE_TESTS
"specifies whether unstable tests should be disabled (they are enabled by default for devel builds)"
"${DISABLE_UNSTABLE_TESTS_BY_DEFAULT}")
function (configure_test_target)
# parse arguments
set(OPTIONAL_ARGS MANUAL UNSTABLE REQUIRES_MAIN_TARGET)
set(ONE_VALUE_ARGS TARGET_NAME TEST_NAME FULL_TEST_NAME_OUT_VAR FULL_TEST_TARGET_OUT_VAR)
set(MULTI_VALUE_ARGS HEADER_FILES SRC_FILES LIBRARIES RUN_ARGS)
cmake_parse_arguments(ARGS "${OPTIONAL_ARGS}" "${ONE_VALUE_ARGS}" "${MULTI_VALUE_ARGS}" ${ARGN})
if (NOT ARGS_TARGET_NAME)
set(ARGS_TARGET_NAME "${META_TARGET_NAME}")
endif ()
if (NOT ARGS_TEST_NAME)
message(FATAL_ERROR "No test name specified.")
endif ()
set(TEST_TARGET_NAME "${ARGS_TARGET_NAME}_${ARGS_TEST_NAME}")
# add target for test executable, but exclude it from the "all" target when EXCLUDE_TESTS_FROM_ALL is set
if (EXCLUDE_TESTS_FROM_ALL)
set(TESTS_EXCLUSION EXCLUDE_FROM_ALL)
else ()
unset(TESTS_EXCLUSION)
endif ()
add_executable("${TEST_TARGET_NAME}" ${TESTS_EXCLUSION} ${ARGS_HEADER_FILES} ${ARGS_SRC_FILES})
if (ARGS_FULL_TEST_TARGET_OUT_VAR)
set("${ARGS_FULL_TEST_TARGET_OUT_VAR}"
"${TEST_TARGET_NAME}"
PARENT_SCOPE)
endif ()
# add top-level target to build all test targets conveniently, also when excluded from "all" target
if (NOT TARGET tests)
add_custom_target(tests DEPENDS "${TEST_TARGET_NAME}")
else ()
add_dependencies(tests "${TEST_TARGET_NAME}")
endif ()
# configure test target
target_link_libraries(
"${TEST_TARGET_NAME}"
PUBLIC ${META_ADDITIONAL_LINK_FLAGS} ${META_ADDITIONAL_LINK_FLAGS_TEST_TARGET} "${PUBLIC_LIBRARIES}"
PRIVATE "${ARGS_LIBRARIES}" "${PRIVATE_LIBRARIES}")
target_include_directories(
"${TEST_TARGET_NAME}"
PUBLIC $<BUILD_INTERFACE:${TARGET_INCLUDE_DIRECTORY_BUILD_INTERFACE}>
$<BUILD_INTERFACE:${TARGET_GENERATED_INCLUDE_DIRECTORY}> $<INSTALL_INTERFACE:${HEADER_INSTALL_DESTINATION}>
${PUBLIC_INCLUDE_DIRS}
PRIVATE ${TEST_INCLUDE_DIRS} ${PRIVATE_INCLUDE_DIRS})
target_compile_definitions(
"${TEST_TARGET_NAME}"
PUBLIC "${META_PUBLIC_COMPILE_DEFINITIONS}"
PRIVATE "${META_PRIVATE_COMPILE_DEFINITIONS}")
target_compile_options(
"${TEST_TARGET_NAME}"
PUBLIC "${META_PUBLIC_COMPILE_OPTIONS}"
PRIVATE "${META_PRIVATE_COMPILE_OPTIONS}")
set_target_properties(
"${TEST_TARGET_NAME}"
PROPERTIES C_VISIBILITY_PRESET hidden
CXX_VISIBILITY_PRESET hidden
LINK_SEARCH_START_STATIC ${STATIC_LINKAGE}
LINK_SEARCH_END_STATIC ${STATIC_LINKAGE}
AUTOGEN_TARGET_DEPENDS "${AUTOGEN_DEPS}"
QT_DEFAULT_PLUGINS "${META_QT_DEFAULT_PLUGINS}"
EXPORT_COMPILE_COMMANDS "${ENABLE_EXPORT_COMPILE_COMMANDS}")
if (NOT META_CXX_STANDARD STREQUAL "any")
set_target_properties("${TEST_TARGET_NAME}" PROPERTIES CXX_STANDARD "${META_CXX_STANDARD}")
endif ()
# avoid warnings when including autogen files
if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.27)
set_target_properties("${TEST_TARGET_NAME}" PROPERTIES AUTOGEN_USE_SYSTEM_INCLUDE ON)
endif ()
# avoid treating certain warnings as errors when compiling generated files
if (COMMAND configure_development_warnings_for_qt)
configure_development_warnings_for_qt(TARGET "${TEST_TARGET_NAME}")
endif ()
# make the test recognized by ctest
if (NOT ARGS_MANUAL)
set(FULL_TEST_NAME "${ARGS_TARGET_NAME}_run_${ARGS_TEST_NAME}")
set("${ARGS_FULL_TEST_NAME_OUT_VAR}"
"${FULL_TEST_NAME}"
PARENT_SCOPE)
add_test(NAME "${FULL_TEST_NAME}" COMMAND "${TEST_TARGET_NAME}" ${ARGS_RUN_ARGS})
set(TEST_${ARGS_TEST_NAME}_DISABLED
""
CACHE STRING "value for the DISABLED property of test ${ARGS_TEST_NAME}")
if (NOT "${TEST_${ARGS_TEST_NAME}_DISABLED}" STREQUAL "")
set_property(TEST "${FULL_TEST_NAME}" PROPERTY DISABLED "${TEST_${ARGS_TEST_NAME}_DISABLED}")
elseif (ARGS_UNSTABLE AND DISABLE_UNSTABLE_TESTS)
set_property(TEST "${FULL_TEST_NAME}" PROPERTY DISABLED True)
endif ()
endif ()
# add the test executable to the dependencies of the check target
if (NOT ARGS_MANUAL AND TARGET check)
add_dependencies(check ${TEST_TARGET_NAME})
if (ARGS_REQUIRES_MAIN_TARGET)
add_dependencies(check "${META_TARGET_NAME}")
endif ()
endif ()
endfunction ()
|