-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCMakeLists.txt
132 lines (110 loc) · 3.66 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
cmake_minimum_required(VERSION 3.28)
project(vulkandemo CXX C)
####################################################################################################
# Options
option(${PROJECT_NAME}_ENABLE_TESTS "Enable unit tests" OFF)
option(${PROJECT_NAME}_ENABLE_SANITIZER_ASAN "Enable ASan and UBSan" OFF)
####################################################################################################
# Dependencies
find_package(doctest REQUIRED)
find_package(SDL2 REQUIRED)
find_package(spdlog REQUIRED)
find_package(fmt REQUIRED)
find_package(Microsoft.GSL REQUIRED)
find_package(strong_type REQUIRED)
find_package(range-v3 REQUIRED)
find_package(frozen REQUIRED)
find_package(etl REQUIRED)
find_package(Vulkan REQUIRED)
add_subdirectory(vendor/lift)
add_library(rollbear::lift ALIAS lift)
####################################################################################################
# Create target
set(_exe_target vulkandemo)
add_executable(
${_exe_target}
src/types.cpp
src/setup.cpp
src/draw.cpp
src/Logger.cpp
src/vulkandemo.cpp
src/vulkandemo.hpp
src/main.cpp
)
install(
TARGETS ${_exe_target}
DESTINATION "."
RUNTIME DESTINATION bin
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
)
target_compile_features(${_exe_target} PRIVATE cxx_std_23)
set_target_properties(${_exe_target} PROPERTIES CXX_EXTENSIONS OFF)
target_link_libraries(
${_exe_target}
PRIVATE
doctest::doctest
SDL2::SDL2
spdlog::spdlog
fmt::fmt
Microsoft.GSL::GSL
Vulkan::Vulkan
rollbear::strong_type
rollbear::lift
range-v3::range-v3
frozen::frozen
etl::etl
)
target_compile_definitions(
${_exe_target}
PRIVATE
SPDLOG_ACTIVE_LEVEL=$<IF:$<CONFIG:Debug>,SPDLOG_LEVEL_DEBUG,SPDLOG_LEVEL_INFO>
)
if (${PROJECT_NAME}_ENABLE_SANITIZER_ASAN)
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
target_compile_options(
${_exe_target}
PUBLIC
-fsanitize=address,undefined
-fno-sanitize-recover=all
-fno-omit-frame-pointer
)
target_link_options(
${_exe_target}
PUBLIC
-fsanitize=address,undefined
-fno-sanitize-recover=all
-fno-omit-frame-pointer
)
endif ()
endif ()
# Testing
if (${PROJECT_NAME}_ENABLE_TESTS)
enable_testing()
add_test(
NAME ${_exe_target}
COMMAND
${_exe_target}
# Do not continue on to run the application after running tests.
--exit=true
# Also report successful tests (useful due to volume of logging).
# --success=true
)
if (${PROJECT_NAME}_ENABLE_SANITIZER_ASAN)
# Create a library that stubs out dlclose. This is for two reasons:
# * It resolves LSan leak detection false positives in vulkan and nvidia drivers.
# * If LSan does detect a leak, the name of the library should be reported in the stack
# trace
add_library(dlclose_stub SHARED dlclose_stub.c)
target_link_libraries(${_exe_target} PRIVATE dlclose_stub)
list(APPEND _envvars.lsan_opts "verbosity=1")
list(APPEND _envvars.lsan_opts "log_threads=1")
list(JOIN _envvars.lsan_opts ":" _envvars.lsan_opts)
list(APPEND _envvars "LSAN_OPTIONS=${_envvars.lsan_opts}")
# Uncomment below to provide more reporting (but run slower).
# list(APPEND _envvars "ASAN_OPTIONS=fast_unwind_on_malloc=0")
set_tests_properties(${_exe_target} PROPERTIES ENVIRONMENT "${_envvars}")
endif ()
else ()
target_compile_definitions(${_exe_target} PRIVATE DOCTEST_CONFIG_DISABLE)
endif ()