File: TestUtilities.cmake

package info (click to toggle)
martchus-cpp-utilities 5.33.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,396 kB
  • sloc: cpp: 12,679; awk: 18; ansic: 12; makefile: 10
file content (124 lines) | stat: -rw-r--r-- 5,343 bytes parent folder | download
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 ()