-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCMakeLists.txt
127 lines (120 loc) · 4.35 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
cmake_minimum_required(VERSION 3.28)
project(moderna_test_lib)
set (CMAKE_CXX_STANDARD 23)
set (CMAKE_CXX_STANDARD_REQUIRED true)
set (CMAKE_CXX_SCAN_FOR_MODULES true)
set (CMAKE_CXX_COMPILE_FEATURES "-Wall -Werror")
option (MODERNA_TEST_LIB_BUILD_TESTS "Build tests" OFF)
include (CTest)
if (NOT TARGET ${PROJECT_NAME})
add_library(${PROJECT_NAME})
file (
GLOB ${PROJECT_NAME}_src
"${CMAKE_CURRENT_LIST_DIR}/src/*.cc"
)
target_sources(${PROJECT_NAME}
PUBLIC
FILE_SET CXX_MODULES FILES ${${PROJECT_NAME}_src}
)
target_include_directories(${PROJECT_NAME}
PUBLIC
"${CMAKE_CURRENT_LIST_DIR}/include"
)
endif()
set(MODERNA_TEST_LIB_NAME ${PROJECT_NAME} CACHE INTERNAL "The name of the moderna testing library")
set (MODERNA_TEST_LIB_MAIN "${CMAKE_CURRENT_LIST_DIR}/src/main.cpp" CACHE INTERNAL "The path to the moderna test library main function")
# Function to add a test into the suite.
function(moderna_add_test target_name)
set(options)
set(oneValueArgs)
set(multiValueArgs
TARGETS
LIBRARIES
DIRECTORIES
SANITIZERS
COMPILE_DEFINITIONS
COMPILE_OPTIONS
COMPILE_FEATURES
LINK_OPTIONS
)
cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
# This adds the non sanitized test
include(CTest)
list(APPEND ARG_TARGETS ${MODERNA_TEST_LIB_MAIN})
list(APPEND ARG_TARGETS ${ARG_UNPARSED_ARGUMENTS})
add_executable(${target_name} ${ARG_TARGETS})
function (add_sanitizer target_name sanitizer abbr)
add_executable(${target_name}_${abbr} ${ARG_TARGETS})
if(ARG_LIBRARIES)
target_link_libraries(${target_name}_${abbr} PRIVATE ${ARG_LIBRARIES} ${MODERNA_TEST_LIB_NAME})
else()
target_link_libraries(${target_name}_${abbr} PRIVATE ${MODERNA_TEST_LIB_NAME})
endif()
if(ARG_COMPILE_DEFINITIONS)
target_compile_definitions(${target_name}_${abbr} PRIVATE ${ARG_COMPILE_DEFINITIONS})
endif()
if (ARG_DIRECTORIES)
target_include_directories(${target_name}_${abbr} PRIVATE ${ARG_DIRECTORIES})
endif()
if (ARG_LINK_OPTIONS)
target_link_options(${target_name}_${abbr} PRIVATE "-fsanitize=${sanitizer}" ${ARG_LINK_OPTIONS})
else()
target_link_options(${target_name}_${abbr} PRIVATE "-fsanitize=${sanitizer}")
endif()
if (ARG_COMPILE_OPTIONS)
target_compile_options(${target_name}_${abbr} PRIVATE "-fsanitize=${sanitizer}" ${ARG_COMPILE_OPTIONS})
else()
target_compile_options(${target_name}_${abbr} PRIVATE "-fsanitize=${sanitizer}")
endif()
if (ARG_COMPILE_FEATURES)
target_compile_features(${target_name}_${abbr} PRIVATE ${ARG_COMPILE_FEATURES})
endif()
add_test(NAME ${target_name}_${abbr} COMMAND ${target_name}_${abbr})
endfunction()
# Normal Addition
if (ARG_LIBRARIES)
target_link_libraries(${target_name} PRIVATE ${ARG_LIBRARIES} ${MODERNA_TEST_LIB_NAME})
else()
target_link_libraries(${target_name} PRIVATE ${MODERNA_TEST_LIB_NAME})
endif()
if (ARG_COMPILE_DEFINITIONS)
target_compile_definitions(${target_name} PRIVATE ${ARG_COMPILE_DEFINITIONS})
endif()
if (ARG_DIRECTORIES)
target_include_directories(${target_name} PRIVATE ${ARG_DIRECTORIES})
endif()
if (ARG_LINK_OPTIONS)
target_link_options(${target_name} PRIVATE ${ARG_LINK_OPTIONS})
endif()
if (ARG_COMPILE_OPTIONS)
target_compile_options(${target_name} PRIVATE ${ARG_COMPILE_OPTIONS})
endif()
if (ARG_COMPILE_FEATURES)
target_compile_features(${target_name} PRIVATE ${ARG_COMPILE_FEATURES})
endif()
add_test(NAME ${target_name} COMMAND ${target_name})
if ("all" IN_LIST ARG_SANITIZERS)
add_sanitizer(${target_name} "thread" "tsan")
add_sanitizer(${target_name} "undefined" "ubsan")
add_sanitizer(${target_name} "address" "asan")
if (NOT APPLE)
add_sanitizer(${target_name} "memory" "msan")
endif()
else()
if ("address" IN_LIST ARG_SANITIZERS)
add_sanitizer(${target_name} "address" "asan")
endif()
if ("thread" IN_LIST ARG_SANITIZERS)
add_sanitizer(${target_name} "thread" "tsan")
endif()
if ("undefined" IN_LIST ARG_SANITIZERS)
add_sanitizer(${target_name} "undefined" "ubsan")
endif()
if ("memory" IN_LIST ARG_SANITIZERS AND NOT APPLE)
add_sanitizer(${target_name} "memory" "msan")
endif()
endif()
endfunction()
if (MODERNA_TEST_LIB_BUILD_TEST)
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/tests)
endif()