CMake

Содержание

Файлы

Переменные окружения

Переменные CMake

Свойства CMake

Перечень команд CMakeLists.txt

Перечень команд командной строки

Ссылки

В процессе разработки программного обеспечения наступает момент, когда приходиться переводить исходный код во что-то, что может быть использовано конечным пользователем.

Этот процесс называется сборкой программного обеспечения.

Сборка программного обеспечения — это комплексный процесс.

Для управления комплексностью при сборки программного обеспечения требуется подходящий инструмент.

Таким иструментом является CMake.

CMake — инструмент управления сборкой программного обеспечения.

Цель CMake — обеспечить управляемостью комплексный процесс сборки программного обеспечения.

CMake представляет из себя набор инструментов для решения возложенных на него задач.

Сборка программного обеспечения в системе CMake происходит поэтапно.

Упрощенно, процесс работы CMake можно разделить на пять этапов.

Основным артефактом системы CMake является файл CMakeLists.txt. Он определяет что должно быть собрано и как, какие тесты должны быть запущены и какие пакеты созданы.

Данный файл является файлом описания проекта. Он служит для управления комплексным процессом сборки программного обеспечения.

Фундаментальным понятием системы CMake является понятие проекта. Сборка проекта — это то, что находится под управлением системы CMake.

Структура проекта состоит из двух частей: исходные файлы и двоичные файлы.

В рамках системы CMake установлен следующий порядок размещения указанных файлов по каталогам: исходные файлы размещаются в каталоге с исходным кодом, двоичные файлы размещаются в каталоге с двоичными файлами (или в каталоге сборки).

Каталог с исходным кодом находится под управлением разработчика.

Каталог сборки находится под управлением системы CMake. В процессе работы системы в этом каталоге создаются различные артефакты системы сборки, а также файлы, являющиеся результатом сборки.

В отношении того, где будет размещен каталог сборки существует два варианта. Каталог сборки размещен в каталоге с исходным кодом (in-source). Каталог сборки размещен вне каталога с исходным кодом (out-source).

В процессе работы система CMake создает файлы сборки выбранной системы сборки. Для конкретной системы сборки должен быть использован соответствующий генератор.

Базовая форма работы с системой CMake.

cd build
cmake -G Ninja ../source
cmake --build .

Второй вариант базовой формы работы с системой CMake.

cmake -G Ninja -S source -B build
cmake --build build

Файлы

/usr/bin/ccmake
/usr/bin/cmake
/usr/bin/cmake-gui
/usr/bin/cpack
/usr/bin/ctest

/usr/share/man/man1/ccmake.1.gz
/usr/share/man/man1/cmake-gui.1.gz
/usr/share/man/man1/cmake.1.gz
/usr/share/man/man1/cpack.1.gz
/usr/share/man/man1/ctest.1.gz

/usr/share/man/man7/cmake-buildsystem.7.gz
/usr/share/man/man7/cmake-commands.7.gz
/usr/share/man/man7/cmake-compile-features.7.gz
/usr/share/man/man7/cmake-configure-log.7.gz
/usr/share/man/man7/cmake-cxxmodules.7.gz
/usr/share/man/man7/cmake-developer.7.gz
/usr/share/man/man7/cmake-env-variables.7.gz
/usr/share/man/man7/cmake-file-api.7.gz
/usr/share/man/man7/cmake-generator-expressions.7.gz
/usr/share/man/man7/cmake-generators.7.gz
/usr/share/man/man7/cmake-language.7.gz
/usr/share/man/man7/cmake-modules.7.gz
/usr/share/man/man7/cmake-packages.7.gz
/usr/share/man/man7/cmake-policies.7.gz
/usr/share/man/man7/cmake-presets.7.gz
/usr/share/man/man7/cmake-properties.7.gz
/usr/share/man/man7/cmake-qt.7.gz
/usr/share/man/man7/cmake-server.7.gz
/usr/share/man/man7/cmake-toolchains.7.gz
/usr/share/man/man7/cmake-variables.7.gz
/usr/share/man/man7/cpack-generators.7.gz

Переменные окружения

CMAKE_GENERATOR

Установить генератор, используемый системой по умолчанию

Переменные CMake

BUILD_SHARED_LIBS

Установить тип библиотек, собираемых по умолчанию

CMAKE_COLOR_DIAGNOSTICS

Включить цвета в диагностическом выводе

CMAKE_LIBRARY_OUTPUT_DIRECTORY

Установить каталог для размещения файлов библиотек

CMAKE_RUNTIME_OUTPUT_DIRECTORY

Установить каталог для размещения исполняемых файлов

Свойства CMake

RUNTIME_OUTPUT_NAME

Имя для целей, являющихся исполняемыми файлами

Перечень команд CMakeLists.txt

add_executable

Определить исполняемый файл целью сборки

add_executable(main first.cpp second.cpp)

Определить исполняемый файл целью сборки и установить исходники для неё

add_executable(two EXCLUDE_FROM_ALL two.cpp)

add_library(targetName [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 [source2 ...])

Определить библиотеку целью сборки

cmake_minimum_required(VERSION 3.29)

include(<file|module> [OPTIONAL] [RESULT_VARIABLE <var>] [NO_POLICY_SCOPE])

Загрузить и выполнить код CMake из указанного файла

message("ok!")

Вывести указанное сообщение

project(sample LANGUAGES CXX)

set(<variable> [<value>...] [PARENT_SCOPE])

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ../bin)

Установить значение указанной переменной CMake

set_property

Установить указанное свойство в заданных областях

set_property(TARGET one two PROPERTY EXCLUDE_FROM_ALL true)

Установить значение (true) для указанного свойства (EXCLUDE_FROM_ALL) для заданных целей (one, two)

target_link_libraries(targetName <PRIVATE | PUBLIC | INTERFACE> item1 [item2 ...] [<PRIVATE | PUBLIC | INTERFACE> item1 [item2 ...]])

Установить библиотеки, используемые в качестве зависимостей для указанной цели

unset(<variable> [CACHE | PARENT_SCOPE])

Очистить значение переменной, переменной кэша или переменной окружения

Перечень команд командной строки

cmake -G Ninja ..

Сгенерировать файлы сборки системы Ninja (-G Ninja) в текущем каталоге

Файл сборки CMakeLists.txt должен находиться в родительском каталоге.

Сгенерированные файлы будут находиться в текущем каталоге.

cmake --build .

Осуществить сборку проекта

Сборка будет осуществлена из файлов, сгенерированных командой cmake в текущем каталоге.

cmake --build build --target one two

Осуществить сборку указанных целей

cmake -DBUILD_SHARED_LIBS=YES source

Установить значение указанной переменной CMake

cmake -D myVar:type=someValue ...

Установить значение указанной переменной кэша

Ссылки