CMake
CMake — это кроссплатформенная система автоматизации сборки программного обеспечения. CMake не собирает программный код напрямую, а генерирует управляющие файлы (например, Makefile) для нативных систем сборки. По сути, это мета-сборщик, который абстрагирует процесс компиляции и линковки от конкретной операционной системы, компилятора и среды разработки, описывая что нужно построить, а не как именно это делать на каждой платформе. Инструкции CMake записываются в файлах CMakeLists.txt.
Исторически, под каждую ОС (Windows, Linux, macOS) и компилятор (GCC, Clang, MSVC) требовалось писать и поддерживать отдельные наборы скриптов сборки (Makefile, .vcxproj, Xcode project), что было трудоемко и непортативно. CMake позволяет описать структуры проекта (исполняемые файлы, библиотеки и их зависимости) на едином языке высокого уровня, и одной конфигурацией охватить все целевые платформы. Его мощь дополняют развитые механизмы поиска внешних библиотек, управления настройками, модульность и система кэширования переменных, что делает его де-факто стандартом для сборки C и C++ проектов, особенно в сфере open-source, где требуется унификация и управление зависимостями.
Опции CMake
Опции CMake — это переменные, которые позволяют управлять процессом конфигурации и сборки проекта. Их основное предназначение — предоставить разработчику возможность включать или отключать определённые функции проекта (например, сборку тестов или поддержку определённых библиотек), выбирать варианты поведения (статическая или динамическая линковка) или указывать пути к зависимостям. В отличие от обычных внутренних переменных CMake, опции (команда option()) специально предназначены для интерактивного изменения извне и сохраняются между запусками, формируя конфигурацию проекта.
Установить и передать опции в CMake можно несколькими основными способами. Наиболее прямой метод — интерактивный, с помощью графических утилит вроде cmake-gui, которые показывают список доступных опций. При сборке на удаленной машине без графического интерфейса (к примеру, на кластере) полезна консольная утилита ccmake:
ccmake ../project-src
Данная утилита позволяет интерактивно в консоли задать или изменить опции CMake.
Для автоматизации и скриптов используется передача опций через командную строку с помощью флага -D, например:
cmake -DBUILD_TESTS=ON -DCMAKE_INSTAL_PREFIX=path
Также опции могут быть предварительно заданы в скриптах или окружении, но флаг -D является стандартным и самым распространённым способом, который перезаписывает значения по умолчанию, указанные в файлах CMakeLists.txt.
Современные IDE, например Qt Creator, имеют интеграцию с CMake. Они предоставляют графический интерфейс для управления опциями проекта, а при конфигурации сами формируют и выполняют нужные команды cmake, избавляя разработчика от ручной работы с кэшем и флагами -D.
CMakeCache
Файл CMakeCache.txt генерируется в директории сборки при первом запуске команды cmake для конфигурации проекта. Он служит хранилищем всех кэшированных переменных (включая пользовательские опции, найденные пути к библиотекам, выбранные компиляторы и системные настройки), что позволяет последующим запускам cmake не повторять полную процедуру обнаружения, а использовать сохранённые значения, обеспечивая скорость и воспроизводимость конфигурации.
Исправить значения в кэше можно либо через графический интерфейс cmake-gui (где все переменные сгруппированы и доступны для редактирования), либо удалив файл целиком (что приведёт к полной переконфигурации), либо точечно изменив значение с помощью того же флага -D в командной строке — при повторном запуске cmake новое значение перезапишет старое в кэше. В крайнем случае файл CMakeCache.txt можно изменить вручную, найдя там нужный флаг или ссылку и заменив его в текстовом редакторе. После изменения CMakeCache.txt необходимо перезапустить cmake для обновления конфигурации.
Последовательность сборки cmake проекта выглядит следующим образом: сначала запускается cmake и настраивает проект, затем запускается компилятор.
| Программа | Входные файлы | Что делает | Выходные файлы |
|---|---|---|---|
| cmake | CMakeLists.txt, CMakeCache.txt | Настраивает проект, находит зависимости | Makefile, сгенерированные исходники |
| Компиляторы (GCC/CLang/MSVC...) | Makefile, исходные файлы | Сбрка проекта: компиляция, линковка | Библиотеки, исполняемые файлы |