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++
Создадим минимальный проект с одним исходным файлом.
- Структура каталогов:
`` my_project/ ├── CMakeLists.txt └── main.cpp ``
CMakeLists.txt:
``cmake cmake_minimum_required(VERSION 3.10) project(HelloWorld LANGUAGES CXX) add_executable(hello main.cpp) ``
main.cpp:
```cpp
include <iostream>
int main() { std::cout << "Hello, CMake!" << std::endl; return 0; } ```
- Сборка:
``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 →