-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCMakeLists.txt
149 lines (121 loc) · 4.58 KB
/
CMakeLists.txt
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
cmake_minimum_required(VERSION 3.20)
#[=============================================================================[
# Basic project definition #
]=============================================================================]
list(APPEND CMAKE_MESSAGE_CONTEXT Test)
project(Template_test)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS ON)
#[=============================================================================[
# Options #
]=============================================================================]
include(CMakeDependentOption)
include(FeatureSummary)
cmake_dependent_option(TEMPLATE_TEST_COVERAGE "Template: Test with coverage" OFF "TEMPLATE_TESTS;Template_IS_TOP_LEVEL" OFF)
add_feature_info(Coverage TEMPLATE_TEST_COVERAGE "Compile with test coverage")
mark_as_advanced(TEMPLATE_TEST_COVERAGE)
#[==============================================================================================[
# Project configuration #
]==============================================================================================]
include(FetchContent)
if (TEMPLATE_TEST_COVERAGE)
target_compile_options(Template_Template PRIVATE --coverage)
target_compile_options(Template_Hello PRIVATE --coverage)
target_link_options(Template_Template PUBLIC --coverage)
endif ()
#[=============================================================================[
# External packages #
]=============================================================================]
set(external_libs)
if (NOT Template_IS_TOP_LEVEL)
FetchContent_Declare(Template
GIT_REPOSITORY https://github.com/LecrisUT/CMake-Template
GIT_TAG main
FIND_PACKAGE_ARGS CONFIG
)
list(APPEND external_libs Template)
endif ()
FetchContent_Declare(Catch2
GIT_REPOSITORY https://github.com/catchorg/Catch2
GIT_TAG v3.4.0
FIND_PACKAGE_ARGS CONFIG
)
list(APPEND external_libs Catch2)
FetchContent_MakeAvailable(${external_libs})
#[=============================================================================[
# Main definition #
]=============================================================================]
enable_testing()
include(Catch)
add_executable(test-suite)
target_link_libraries(test-suite PRIVATE Catch2::Catch2WithMain Template::Template)
function(Template_add_test test)
#[===[.md
# Template_add_test
Internal helper for adding functional tests specific for the current template project
## Synopsis
```cmake
Template_add_test(<name>
[TEST_NAME <test_name>]
[TARGET <target>]
[LABELS <label1> <label2>])
```
## Options
`<name>`
Path to the CMake project to be executed relative to `${CMAKE_CURRENT_SOURCE_DIR}`
`TEST_NAME` [Default: `<name>`]
Name for the test to be used as the ctest name
`LABELS`
Additional labels to be added
]===]
list(APPEND CMAKE_MESSAGE_CONTEXT "Template_add_test")
set(ARGS_Options)
set(ARGS_OneValue
TEST_NAME
)
set(ARGS_MultiValue
LABELS
)
cmake_parse_arguments(PARSE_ARGV 1 ARGS "${ARGS_Options}" "${ARGS_OneValue}" "${ARGS_MultiValue}")
# Check required/optional arguments
if (ARGC LESS 1)
message(FATAL_ERROR "Missing test name")
endif ()
if (NOT DEFINED ARGS_TEST_NAME)
set(ARGS_TEST_NAME ${test})
endif ()
set(extra_args)
if (Template_IS_TOP_LEVEL)
list(APPEND extra_args
-DFETCHCONTENT_TRY_FIND_PACKAGE_MODE=ALWAYS
# Generated Config file point to binary targets until it is installed
-DTemplate_ROOT=${Template_BINARY_DIR}
-DFETCHCONTENT_SOURCE_DIR_TEMPLATE=${Template_SOURCE_DIR}
)
endif ()
add_test(NAME ${ARGS_TEST_NAME}
COMMAND ${CMAKE_CTEST_COMMAND} --build-and-test ${CMAKE_CURRENT_SOURCE_DIR}/${test}
${CMAKE_CURRENT_BINARY_DIR}/${test}
# Use the same build environment as the current runner
--build-generator "${CMAKE_GENERATOR}"
--build-options -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
${extra_args}
--test-command ${CMAKE_CTEST_COMMAND} --test-dir ${CMAKE_CURRENT_BINARY_DIR}/${test} --output-on-failure
)
set_tests_properties(${ARGS_TEST_NAME} PROPERTIES
LABELS "${ARGS_LABELS}"
)
endfunction()
foreach (test_type IN ITEMS
unit
functional
package
)
add_subdirectory(${test_type})
endforeach ()
catch_discover_tests(test-suite
# Manually hard-coding labels until upstream support is included
# https://github.com/catchorg/Catch2/pull/2690
PROPERTIES LABELS "unit"
)