-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCMakeLists.txt
165 lines (133 loc) · 9.06 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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
project(algo-shad)
cmake_minimum_required(VERSION 3.0.0)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/tools/cmake")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
find_package(Catch REQUIRED)
include(tools/cmake/TestSolution.cmake)
include(tools/cmake/BuildFlags.cmake)
include_directories(tools/util)
function(add_task contest name)
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contest${contest}/${name})
add_subdirectory(contest${contest}/${name})
endif()
endfunction()
add_task(2 b)
add_task(2 e)
add_task(3 a)
add_task(3 b)
add_task(3 c)
add_task(3 d)
add_task(3 e)
add_task(4 a)
add_task(4 b)
add_task(4 c)
add_task(4 d)
add_task(7 b)
# set(CPACK_PROJECT_NAME ${PROJECT_NAME})
# set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
# ${CMAKE_BINARY_DIR} - /home/boldakov/algo-shad/build
# ${CMAKE_CURRENT_SOURCE_DIR} - /home/boldakov/algo-shad
# ${CMAKE_SOURCE_DIR} - /home/boldakov/algo-shad
### Запуск скриптовых файлов
# include
# заменяет строку своего вызова кодом заданного файла, действуя аналогично препроцессорной команде include языков C/C++.
### Компиляция исполняемых файлов
# add_executable
# компилирует исполняемый файл с заданным именем из списка исходников.
# add_executable(MyExecutable ObjectHandler.c TimeManager.c MessageGenerator.c)
### Компиляция библиотек
# add_library
# компилирует библиотеку с указанным видом и именем из исходников. (например, lib<LibraryName>.a или <LibraryName>.lib).
# add_library(MyLibrary STATIC ObjectHandler.c TimeManager.c MessageConsumer.c)
# * STATIC Статические библиотеки.
# Представляют из себя архивы объектных файлов, связываемых с исполняемыми файлами и другими библиотеками во время компиляции.
# * SHARED Динамические библиотеки.
# Представляют из себя двоичные библиотеки, загружаемые операционной системой во время выполнения программы.
# * MODULE Модульные библиотеки
# Представляют из себя двоичные библиотеки, загружаемые посредством техник выполнения самим исполняемым файлом.
# * OBJECT Объектные библиотеки
# Представляют из себя набор объектных файлов, связываемых с исполняемыми файлами и другими библиотеками во время компиляции.
### Добавление исходников к цели
# target_sources
# Бывают случаи, требующие многократного добавления исходных файлов к цели.
# Команда способная добавлять исходники к цели множество раз.
# Повторяющиеся вызовы команды target_sources добавляют исходные файлы к цели в том порядке, в каком они были вызваны
# target_sources(MyExecutable MessageConsumer.c)
# target_sources(MyExecutable ResultHandler.c)
### Генерируемые файлы
# Местоположение выходных файлов, сгенерированных командами add_executable и add_library, определяется только на стадии генерации
# * Переменные RUNTIME_OUTPUT_DIRECTORY и RUNTIME_OUTPUT_NAME определяют местоположение целей выполнения.
# * Переменные LIBRARY_OUTPUT_DIRECTORY и LIBRARY_OUTPUT_NAME определяют местоположение библиотек.
# * Переменные ARCHIVE_OUTPUT_DIRECTORY и ARCHIVE_OUTPUT_NAME определяют местоположение архивов.
### Компоновка с библиотеками
# target_link_libraries
# компонует библиотеку или исполняемый файл с другими предоставляемыми библиотеками.
# Первым аргументом данная команда принимает название цели, сгенерированной с помощью команд add_executable или add_library,
# а последующие аргументы представляют собой названия целей библиотек или полные пути к библиотекам.
# target_link_libraries(MyExecutable JsonParser SocketFactory BrowserInvoker)
### Добавление подпроектов
# add_subdirectory
# Побуждает CMake к незамедлительной обработке указанного файла подпроекта.
#
# Добавить каталог "subLibrary" в сборку основного проекта,
# а генерируемые файлы расположить в каталоге "subLibrary/build":
# add_subdirectory(subLibrary subLibrary/build)
#
### Поиск пакетов
# find_package
# находит и загружает настройки внешнего проекта
# В большинстве случаев она применяется для последующей линковки внешних библиотек, таких как Boost и GSL.
# CMake ищет скриптовый файл вида Find<PackageName>.cmake в директории CMAKE_MODULE_PATH, а затем запускает его
# и импортирует все необходимые настройки (в данном случае CMake запустила стандартный файл FindGSL.cmake)
#
# Загрузить настройки пакета библиотеки "GSL":
# find_package(GSL 2.5 REQUIRED) or QUIET
#
# Скомпоновать исполняемый файл с библиотекой "GSL":
# target_link_libraries(MyExecutable GSL::gsl)
#
# Уведомить компилятор о каталоге заголовков "GSL":
# target_include_directories(MyExecutable ${GSL_INCLUDE_DIRS})
#
# Проверить результат поиска пакета
# Это можно сделать путём проверки переменной <PackageName>_FOUND,
# автоматически определяемой после завершения команды find_package.
# Например, в случае успешного импортирования настроек GSL в Ваш проект, переменная GSL_FOUND обратится в истину.
### Способы включения заголовков
# Информировать компилятора о располжении включаемых заголовков можно посредством двух команд: include_directories и target_include_directories.
#
# include_directories
# Влияет на область каталога.
# Это означает, что все директории заголовков, указанные данной командой, будут применяться для всех целей текущего CMakeLists.txt,
# а также для обрабатываемых подпроектов (смотреть add_subdirectory).
#
# target_include_directories
# Влияет лишь на указанную первым аргументом цель,
# а на другие цели никакого воздействия не оказывается.
##
# add_executable(RequestGenerator RequestGenerator.c)
# add_executable(ResponseGenerator ResponseGenerator.c)
#
# Применяется лишь для цели "RequestGenerator":
# target_include_directories(RequestGenerator headers/specific)
#
# Применяется для целей "RequestGenerator" и "ResponseGenerator":
# include_directories(headers)
#
# include_directories и link_libraries является нежелательным !
### Установка проекта
# install
# генерирует установочные правила для Вашего проекта. Данная команда способна работать с целями, файлами, папками и многим другим.
#
# # Установить цели "TimePrinter" и "DataScanner" в директорию "bin":
# install(TARGETS TimePrinter DataScanner DESTINATION bin)
#
# # Установить файлы "DataCache.txt" и "MessageLog.txt" в директорию "~/":
# install(FILES DataCache.txt MessageLog.txt DESTINATION ~/)
#
# # Установить каталоги "MessageCollection" и "CoreFiles" в директорию "~/":
# install(DIRECTORY MessageCollection CoreFiles DESTINATION ~/)
#