-
Notifications
You must be signed in to change notification settings - Fork 1
/
CMakeLists.txt
104 lines (78 loc) · 4.21 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
# Указываем минимальную версию CMake
cmake_minimum_required(VERSION 3.16)
# Название проекта
project(dv_big_int)
option(DV_BIG_INT_BUILD_TESTER "Компилировать Тестер" OFF)
option(DV_BIG_INT_UB_SANITIZER "Детектировать undefined behavior" OFF)
# Версия стандарта C++
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# Если используется одноконфигурационный генератор и конфигурация не указана
if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
# то конфигурацией по умолчанию будет Release
set(CMAKE_BUILD_TYPE Release)
# Нельзя оставлять переменную CMAKE_BUILD_TYPE пустой (подробности в Dviglo2D)
endif()
# Указываем Студии на то, что исходники в кодировке UTF-8.
# Это позволяет писать U'🍌'. У других компиляторов, похоже, нет с этим проблем
# https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2295r6.pdf
if(MSVC)
add_compile_options(/utf-8)
endif()
# Включаем поддержку папок в IDE
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
# ============================================== Библиотека ==============================================
# Название таргета
set(target_name dv_big_int)
# Создаём список файлов
file(GLOB source_files lib/*)
# Создаём статическую библиотеку
add_library(${target_name} STATIC ${source_files})
# Делаем заголовочные файлы доступными библиотеке и приложениям
target_include_directories(${target_name} PUBLIC lib)
# Выводим больше предупреждений
if(MSVC)
target_compile_options(${target_name} PRIVATE /W4)
else() # GCC, Clang или MinGW
target_compile_options(${target_name} PRIVATE -Wall -Wextra -Wpedantic)
if(NOT MINGW AND DV_BIG_INT_UB_SANITIZER)
target_compile_options(${target_name} PRIVATE -fsanitize=undefined)
target_link_options(${target_name} INTERFACE -fsanitize=undefined)
endif()
endif()
# Заставляем VS отображать дерево каталогов
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR}/lib FILES ${source_files})
# ============================================== Тестер ==============================================
if(DV_BIG_INT_BUILD_TESTER)
# Название таргета
set(target_name tester)
# Создаём список файлов
file(GLOB source_files tester/*)
# Создаём приложение
add_executable(${target_name} ${source_files})
# Подключаем библиотеку
target_link_libraries(${target_name} PRIVATE dv_big_int)
# Выводим больше предупреждений
if(MSVC)
target_compile_options(${target_name} PRIVATE /W4)
else() # GCC, Clang или MinGW
target_compile_options(${target_name} PRIVATE -Wall -Wextra -Wpedantic)
if(NOT MINGW AND DV_BIG_INT_UB_SANITIZER)
target_compile_options(${target_name} PRIVATE -fsanitize=undefined)
endif()
endif()
# Статически линкуем библиотеки, чтобы не копировать dll-ки
if(MINGW)
target_link_options(${target_name} PRIVATE -static)
endif()
# Заставляем VS отображать дерево каталогов
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR}/tester FILES ${source_files})
# Включаем тестирование
enable_testing()
# Добавляем приложение в список тестируемых
add_test(NAME ${target_name} COMMAND ${target_name})
# В Visual Studio таргет будет назначен стартовым вместо ALL_BUILD,
# чтобы потом не делать это вручную при отладке приложения
set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT ${target_name})
endif()