Открыть сервис

CMake

CMake — это кроссплатформенная система автоматизации сборки программного обеспечения с открытым исходным кодом, предназначенная для управления процессом компиляции независимо от используемой операционной системы и компилятора. В отличие от традиционных систем сборки (например, Make), CMake не выполняет сборку напрямую, а генерирует файлы сборки для целевой среды (Makefile для Unix, проектные файлы для Microsoft Visual Studio, Ninja и другие), работая по принципу «метасборки». Основным входным файлом является CMakeLists.txt, в котором описываются цели, зависимости и параметры проекта.

История

Предпосылки и создание

Разработка CMake началась в 1999 году в рамках проекта National Library of Medicine (США) для обеспечения переносимости программного обеспечения между Unix- и Windows-платформами. Первая версия была выпущена в 2000 году. Основным автором и идейным вдохновителем выступил Кен Мартин (Ken Martin), а впоследствии проект перешёл под управление компании Kitware, Inc., которая продолжает его развитие по сей день.

Развитие и версии

  • CMake 2.x (2006–2012) — становление как стандарта де-факто для кросс-платформенной сборки в сообществе C/C++. Появились поддержка генераторов для Ninja, улучшенная работа с тестированием (CTest) и упаковкой (CPack).
  • CMake 3.0 (2014) — значительное обновление: введены интерфейсные библиотеки (INTERFACE), улучшена поддержка языков Fortran, CUDA, Swift. Версия 3.0 стала точкой отсчёта для современного синтаксиса.
  • CMake 3.10+ (2017–2023) — активное внедрение модулей для встроенных систем, поддержка пакетных менеджеров (vcpkg, Conan), улучшение работы с кэшем и инструментариями IDE.
  • CMake 4.0 (планируется) — переход на более строгий синтаксис, отказ от устаревших конструкций, улучшенная поддержка модулей C++20.

Архитектура и принципы работы

Файл CMakeLists.txt

Основной единицей описания проекта является текстовый файл CMakeLists.txt, размещаемый в корневой директории проекта. Он содержит команды на языке CMake (собственный скриптовый язык, напоминающий смесь Bash и Tcl). Ключевые команды:

  • cmake_minimum_required(VERSION ...) — задаёт минимальную версию CMake.
  • project(ProjectName LANGUAGES C CXX) — объявляет имя проекта и используемые языки.
  • add_executable(target source1.cpp source2.cpp) — создаёт исполняемый файл.
  • add_library(target STATIC/SHARED sources...) — создаёт статическую или динамическую библиотеку.
  • target_link_libraries(target lib1 lib2) — указывает зависимости между целями.
  • find_package(PackageName REQUIRED) — подключает внешние пакеты (например, Boost, OpenCV).

Генераторы

CMake поддерживает множество генераторов, которые создают файлы сборки для конкретных сред. Основные:

  • Unix Makefiles — для Linux и macOS, генерирует Makefile.
  • Ninja — высокопроизводительный генератор для Ninja (рекомендуется для больших проектов).
  • Visual Studio — для Windows (поддерживает все версии от 2005 до 2022).
  • Xcode — для macOS, генерирует проект Xcode.
  • MSBuild — для Windows, генерирует файлы .vcxproj.

Выбор генератора осуществляется при конфигурации: cmake -G "Ninja" ..

Кэш CMake

CMake хранит результаты конфигурации в файле CMakeCache.txt. Это позволяет сохранять выбранные опции (например, пути к библиотекам, флаги компиляции) между запусками. Пользователь может изменять переменные кэша через ccmake (интерфейс curses) или cmake-gui (графический интерфейс).

Модули и пакеты

CMake поставляется с большим набором встроенных модулей (Modules/), которые упрощают поиск распространённых библиотек и инструментов. Например:

  • FindBoost.cmake — поиск Boost.
  • FindOpenGL.cmake — поиск OpenGL.
  • FindPython3.cmake — поиск Python 3.

Модули используют команду find_package() и могут быть дополнены пользовательскими скриптами.

Основные возможности

Кроссплатформенность

CMake позволяет писать один CMakeLists.txt, который работает на Windows, Linux, macOS, FreeBSD, Android, iOS и других Unix-подобных системах. Условные конструкции (if(WIN32), if(APPLE), if(CMAKE_SYSTEM_NAME STREQUAL "Linux")) позволяют адаптировать сборку под конкретную платформу.

Поддержка языков программирования

Хотя CMake чаще всего ассоциируется с C и C++, он поддерживает также:

  • Fortran
  • CUDA (начиная с CMake 3.8)
  • Swift
  • Java (через модули)
  • Assembler
  • C# (для Windows через Visual Studio)
  • Objective-C/Objective-C++

Управление зависимостями

CMake не является полноценным менеджером пакетов, но интегрируется с популярными решениями:

  • FetchContent (CMake 3.11+) — автоматическая загрузка и сборка зависимостей из Git-репозиториев или архивов.
  • ExternalProject — более сложный механизм для управления внешними проектами.
  • CPM.cmake — сторонняя библиотека, упрощающая FetchContent.
  • Conan и vcpkg — внешние менеджеры пакетов, которые генерируют файлы CMake.

Тестирование (CTest)

Инструмент CTest, входящий в состав CMake, позволяет запускать тесты, описанные в проекте. Тесты могут быть написаны на любом языке (C++, Python, Shell). CTest поддерживает параллельный запуск, фильтрацию и интеграцию с CI-системами.

Упаковка (CPack)

CPack — инструмент для создания установочных пакетов. Поддерживаются форматы:

Пример использования

Простой проект на C++

Создадим минимальный проект с одним исходным файлом.

  1. Структура каталогов:

`` my_project/ ├── CMakeLists.txt └── main.cpp ``

  1. CMakeLists.txt:

``cmake cmake_minimum_required(VERSION 3.10) project(HelloWorld LANGUAGES CXX) add_executable(hello main.cpp) ``

  1. main.cpp:

```cpp

include <iostream>

int main() { std::cout << "Hello, CMake!" << std::endl; return 0; } ```

  1. Сборка:

``bash mkdir build && cd build cmake .. cmake --build . ./hello ``

Проект с библиотекой и тестами

Более сложный пример демонстрирует создание статической библиотеки и подключение тестов.

CMakeLists.txt: ```cmake cmake_minimum_required(VERSION 3.15) project(MyLib LANGUAGES CXX)

Статическая библиотека

add_library(mylib STATIC src/mylib.cpp include/mylib.h) target_include_directories(mylib PUBLIC include)

Исполняемый файл

add_executable(myapp src/main.cpp) target_link_libraries(myapp mylib)

Тестирование

enable_testing() add_test(NAME test_mylib COMMAND myapp --test) ```

Применение

Крупные проекты, использующие CMake

  • LLVM/Clang — компиляторный проект полностью перешёл на CMake.
  • Qt — начиная с Qt 6, CMake является официальной системой сборки.
  • KDE — весь рабочий стол Plasma и приложения собираются через CMake.
  • OpenCV — библиотека компьютерного зрения.
  • Blender — 3D-редактор.
  • MySQLреляционная база данных.
  • ROS (Robot Operating System) — фреймворк для робототехники.

Интеграция с IDE

Большинство современных сред разработки имеют встроенную поддержку CMake:

  • CLion (JetBrains) — использует CMake как основную систему сборки.
  • Visual Studio (начиная с 2017) — поддерживает открытие CMake-проектов напрямую.
  • Qt Creator — имеет встроенный менеджер CMake.
  • Eclipse — через плагин C/C++ Development Tools (CDT).
  • VS Code — через расширение CMake Tools.

Критика и ограничения

Сложность синтаксиса

Язык CMake считается многословным и не всегда интуитивным. Новички часто сталкиваются с трудностями при настройке сложных проектов, особенно при работе с модулями и условными конструкциями.

Производительность

Для очень больших проектов (миллионы строк кода) конфигурация CMake может занимать значительное время, хотя генерация с Ninja частично компенсирует это.

Отсутствие полноценного менеджера пакетов

CMake не предоставляет централизованного реестра библиотек, что приводит к необходимости вручную указывать пути к зависимостям или использовать сторонние инструменты (Conan, vcpkg).

Проблемы с версиями

Разные версии CMake могут иметь несовместимый синтаксис. Например, старые проекты, использующие find_package без указания версии, могут некорректно работать с новыми модулями.

Интересные факты

  • Название «CMake» расшифровывается как «Cross-Platform Make» (кроссплатформенный Make).
  • CMake написан на C++ и сам собирается с помощью CMake (самодокументирование).
  • В 2021 году CMake занял первое место в опросе Slackware по популярности среди систем сборки для C++.
  • Существует «модный» инструмент CMakePresets.json, который позволяет задавать предопределённые конфигурации сборки (например, Debug, Release, MinSizeRel) и упрощает работу в CI.

Источники

  • Официальная документация CMake (cmake.org/documentation)
  • Kitware, Inc. — история развития CMake
  • Статья «CMake: Past, Present, Future» (KDE TechBase)
  • Книга «Professional CMake: A Practical Guide» (Craig Scott)
  • Репозиторий CMake на GitHub (Kitware/CMake)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →