Система сборки (Build System)
Менеджер зависимостей
Конфигурация проекта
cmake_minimum_required(VERSION 3.10)
project(MyProject)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(my_app
src/main.cpp
src/utils.cpp
)
target_include_directories(my_app PRIVATE include)
target_link_libraries(my_app PRIVATE some_library)
cc_binary(
name = "my_app",
srcs = ["main.cpp", "utils.cpp"],
deps = ["//libs:some_library"],
copts = ["-std=c++17"],
)
project('myproject', 'cpp',
default_options : ['cpp_std=c++17'])
executable('my_app',
sources: ['src/main.cpp', 'src/utils.cpp'],
include_directories: include,
dependencies: [some_library_dep])
Рекомендуемая структура:
my_project/
├── CMakeLists.txt
├── include/
│ └── my_project/
│ └── header.h
├── src/
│ ├── main.cpp
│ └── utils.cpp
├── tests/
├── third_party/
└── build/
Modern CMake подход:
# Поиск пакетов
find_package(Boost 1.70 REQUIRED COMPONENTS filesystem system)
# FetchContent для зависимостей из репозиториев
include(FetchContent)
FetchContent_Declare(
googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG release-1.11.0
)
FetchContent_MakeAvailable(googletest)
# Настройка для разных конфигураций
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -O0")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
# Генерация compile_commands.json для инструментов анализа
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
Пример .gitlab-ci.yml:
stages:
- build
- test
build_job:
stage: build
script:
- mkdir -p build
- cd build
- cmake -DCMAKE_BUILD_TYPE=Release ..
- cmake --build . --parallel
test_job:
stage: test
script:
- cd build
- ctest --output-on-failure
target_precompile_headers(my_app PRIVATE
<vector>
<string>
"include/my_project/common.h"
)
# Включение поддержки модулей
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
enable_language(CXX)
# Добавление модулей
add_library(foo)
target_sources(foo
PUBLIC FILE_SET cxx_modules TYPE CXX_MODULES
BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}
FILES foo.cppm bar.cppm
)
# Обработка специфики платформ
if(WIN32)
add_definitions(-DWINDOWS_PLATFORM)
target_link_libraries(my_app PRIVATE ws2_32)
elseif(UNIX)
add_definitions(-DPOSIX_PLATFORM)
endif()
set_target_properties(my_app PROPERTIES
UNITY_BUILD ON
UNITY_BUILD_BATCH_SIZE 10
)
Кэширование компиляции:
Распределенная сборка:
cmake --graphviz=graph.dot ..
dot -Tpng graph.dot -o graph.png
ninja -t commands > build_commands.txt
ninja -t graph | dot -Tpng -o build_graph.png
Резюмируем: эффективная билд-система требует тщательного проектирования с учетом масштаба проекта, требований к производительности сборки и кроссплатформенности. Современные инструменты типа CMake предоставляют мощные возможности, но требуют глубокого понимания для оптимальной настройки.