В разработке программного обеспечения CMake — это кроссплатформенное бесплатное программное обеспечение с открытым исходным кодом для автоматизации сборки , тестирования , упаковки и установки программного обеспечения с использованием независимого от компилятора метода. [4] CMake сам по себе не является системой сборки; он генерирует файлы сборки другой системы. [5] Он поддерживает иерархии каталогов и приложения, которые зависят от нескольких библиотек. Он может вызывать собственные среды сборки, такие как Make , Qt Creator , Ninja , Android Studio , Apple Xcode и Microsoft Visual Studio . [5] Он имеет минимальные зависимости, требуя только компилятора C++ в собственной системе сборки. [5]
CMake распространяется как бесплатное программное обеспечение с открытым исходным кодом в соответствии с разрешительной лицензией BSD-3-Clause . [6]
Разработка CMake началась в 1999 году в ответ на потребность в кроссплатформенной среде сборки для Insight Segmentation and Registration Toolkit (ITK). [7] [5] Проект финансируется Национальной медицинской библиотекой США в рамках проекта «Видимый человек» . [5] Частично он был вдохновлен pcmaker
, предшественником CMake, который был создан Кеном Мартином и другими разработчиками для поддержки создания Visualization Toolkit (VTK) . pcmaker — это программа на языке C, которая преобразовывала файлы Make в аналоги NMake для MS Windows. [5] В Kitware Билл Хоффман объединил компоненты pcmaker со своими собственными идеями, стремясь имитировать функциональность сценариев настройки Unix . CMake был впервые реализован в 2000 году и получил дальнейшее развитие в 2001 году.
Исторически CMake был задуман с учетом следующих основных особенностей: [5]
Из-за этих ограничений CMake не решил использовать язык сценариев Tcl (популярный в то время) по умолчанию, и вместо этого разработчики решили создать более простой язык сценариев. [5]
Продолжающееся развитие и улучшения были вызваны включением CMake в собственные системы разработчиков, включая проект VXL , [ необходимы разъяснения ] функции CABLE [8] , добавленные Брэдом Кингом, [ необходимы разъяснения ] и GE Corporate R&D для поддержки DART. [ необходимы разъяснения ] Дополнительные функции были созданы, когда VTK перешел на CMake для своей среды сборки и для поддержки ParaView .
Версия 3.0 была выпущена в июне 2014 года. [9] Ее называют началом «современного CMake». [10] Сейчас эксперты советуют избегать переменных в пользу целей и свойств . [11] Команды add_compile_options
, include_directories
, link_directories
, link_libraries
которые были основой CMake 2, теперь должны быть заменены командами, специфичными для конкретной цели.
Разработчик Брэд Кинг заявил, что «буква C в CMake означает «кроссплатформенность » . [12]
Одной из его основных особенностей является возможность помещать выходные данные компилятора (например, объектные файлы) в дерево сборки, расположенное за пределами дерева исходного кода. [5] Это позволяет выполнять несколько сборок из одного и того же дерева исходного кода и осуществлять кросс-компиляцию . Отдельные файлы исходного кода и сборки гарантируют, что удаление каталога сборки не повлияет на исходные файлы и предотвращает беспорядок, который может сбить с толку системы контроля версий. [5]
CMake отслеживает и перекомпилирует все исходные зависимости данного подмодуля, если его источники изменяются. [5] [а]
CMake может находить общесистемные и пользовательские исполняемые файлы, файлы и библиотеки. Эти местоположения хранятся в кеше , который затем можно настроить перед созданием целевых файлов сборки. Кэш можно редактировать с помощью графического редактора, который поставляется с CMake.
CMake хорошо поддерживает сложные иерархии каталогов и приложения, использующие несколько библиотек. Например, CMake может работать с проектом, имеющим несколько наборов инструментов или библиотек, каждая из которых имеет несколько каталогов. Кроме того, CMake может работать с проектами, которые требуют создания исполняемых файлов перед созданием кода, который будет скомпилирован для конечного приложения. Его расширяемый дизайн с открытым исходным кодом позволяет адаптировать CMake по мере необходимости для конкретных проектов. [13]
CMake может генерировать файлы проектов для нескольких популярных IDE , таких как Microsoft Visual Studio , Xcode и Eclipse CDT . Он также может создавать сценарии сборки для MSBuild или NMake в Windows; Unix Make на Unix-подобных платформах, таких как Linux , macOS и Cygwin ; и Ninja как на Windows, так и на Unix-подобных платформах.
CMake позволяет указать функции, которые компилятор должен поддерживать для компиляции целевой программы или библиотеки. [14]
CMake поддерживает обширный список компиляторов, включая: Apple Clang, Clang , GNU GCC , MSVC , Oracle Developer Studio и Intel C++ Compiler . [15]
Несмотря на то, что CMake не является менеджером пакетов , он предоставляет базовые функции модулей (см. CPack) для установки двоичных файлов и информации о пакете, объявленной CMakeList.txt
сценарием для использования потребительскими проектами CMake. Пакет также может быть упакован в архивный файл для менеджера пакетов или установщика, поддерживаемого целевой платформой. Сторонние пакеты также можно импортировать через настроенные файлы CMake, которые либо предоставляются той же третьей стороной, либо создаются вручную. [16] : 132, 142 [17] [18]
Cmake можно запустить с помощью программы ncursesccmake
, которую можно использовать для настройки проектов через интерфейс командной строки.
Сборка программы или библиотеки с помощью CMake — это двухэтапный процесс. [5] Сначала файлы сборки (обычно скрипты) создаются (генерируются) из файлов конфигурации (скриптов CMakeLists.txt), написанных на языке CMake. Затем собственные инструменты сборки платформы, которые могут читать эти файлы сборки (собственная цепочка инструментов), вызываются либо вручную извне, либо через cmake --build
для фактической сборки программ (цели сборки). [13] [19] Генератор, указанный пользователем в командной строке, определяет, какую цепочку инструментов сборки использовать. [5]
Файлы сборки настраиваются в зависимости от используемого генератора (например, Unix Makefiles для make ) и связанных с ним файлов набора инструментов. Опытные пользователи также могут создавать и включать дополнительные генераторы make-файлов для поддержки своих конкретных потребностей компилятора и ОС. Сгенерированные файлы обычно помещаются (с использованием cmake
флага 's) в папку за пределами исходной папки (вне исходной сборки), например, build/
.
Каждый проект сборки, в свою очередь, содержит свой собственный CMakeCache.txt
файл и CMakeFiles
каталог в каждом (под)каталоге проекта, включенном командой add_subdirectory(...)
, что помогает избежать или ускорить регенерацию при повторном запуске.
Процесс генерации и выходные данные можно точно настроить с помощью целевых свойств. Раньше это делалось с помощью CMAKE_...
глобальных переменных с префиксом -, которые также использовались для настройки самого CMake и установки начальных значений по умолчанию. [11] [20] Старый подход сейчас не рекомендуется.
В зависимости от конфигурации CMakeLists.txt файлы сборки могут быть исполняемыми файлами, библиотеками (например libxyz
, xyz.dll
и т. д.), библиотеками объектных файлов или псевдоцелями (включая псевдонимы). CMake может создавать объектные файлы, которые можно связать с исполняемыми двоичными файлами/библиотеками, избегая динамического связывания (время выполнения) и вместо этого используя статическое связывание (время компиляции). Это обеспечивает гибкость в настройке различных оптимизаций. [21]
Зависимости сборки могут определяться автоматически.
Можно создавать предварительно скомпилированные заголовки с помощью CMake начиная с версии 3.6. [22]
CMake имеет относительно простой интерпретируемый императивный язык сценариев. Он поддерживает переменные, методы манипулирования строками, массивы, объявления функций/макросов и включение модулей (импорт). Команды (или директивы) языка CMake считываются cmake
из файла с именем CMakeLists.txt
. В этом файле указаны исходные файлы и параметры сборки, которые CMake поместит в спецификацию сборки проекта (например, Makefile). Кроме того, .cmake
файлы с суффиксом - могут содержать сценарии, используемые CMake. [23]
Чтобы сгенерировать файлы сборки проекта, нужно вызвать cmake
терминал и указать каталог, содержащий файлы CMakeLists.txt
. Этот файл содержит одну или несколько команд в формате COMMAND(argument ...)
.
Аргументы команд разделяются пробелами и могут включать ключевые слова для разделения групп аргументов. Команды могут принимать ключевые слова. Например, в команде ключевое слово . Он служит разделителем между списком исходных файлов и некоторыми другими опциями. [24]SET_SOURCE_FILE_PROPERTIES(source_file ... COMPILE_FLAGS compiler_option ...)
COMPILE_FLAGS
Примеры команд, которые CMake предлагает для указания целей и их зависимостей и которые служат отправной точкой CMakeLists.txt: [25] [26] [27]
add_executable(...)
— объявляет исполняемую двоичную цель с исходными кодами (в зависимости от выбранного языка) для сборкиadd_library(...)
— то же, но для библиотекиtarget_link_libraries(...)
— добавляет зависимости и т. д.CMake поддерживает извлечение значений в переменные из строк данных JSON (начиная с версии 3.19). [28]
Язык сценариев CMake реализован с помощью генераторов Yacc и Lex . [б]
Исполняемые программы CMake, CPack и CTest написаны на языке программирования C++ . [б]
Большая часть функций CMake реализована в модулях, написанных на языке CMake. [29]
Начиная с версии 3.0, в документации CMake используется разметка reStructuredText . HTML-страницы и справочные страницы генерируются генератором документации Sphinx .
CMake поставляется с многочисленными .cmake
модулями и инструментами. Они облегчают такую работу, как поиск зависимостей (как встроенных, так и внешних, например FindXYZ
модулей), тестирование среды инструментальной цепочки и исполняемых файлов, упаковка релизов ( CPack
модуль и cpack
команда) и управление зависимостями от внешних проектов ( ExternalProject
модуль): [30] [31]
CPack — это система упаковки для дистрибутивов программного обеспечения. Он тесно интегрирован с CMake, но может работать и без него.[32] [33]
Его можно использовать для создания:
CMake получил очень широкое распространение в коммерческих проектах, проектах с открытым исходным кодом и академическом программном обеспечении. В число известных пользователей входят Android NDK , Netflix , Inria , MySQL , Boost (библиотеки C++) , KeePassXC , KDE , KiCAD , FreeCAD , Webkit , Blender , [34] Biicode, ReactOS , Apache Qpid , эксперимент ATLAS , [35] и Вторая жизнь . [36]
В следующих файлах исходного кода показано, как создать простую программу hello world , написанную на C++, с помощью CMake.
// hello.cpp #include <iostream> int main () { std :: cout << "Привет, мир!" << std :: endl ; вернуть 0 ; }
# CMakeLists.txt cmake_minimum_required ( ВЕРСИЯ 3.5 ) проект ( HelloWorld CXX ) add_executable ( привет, hello.cpp )
// hello.cpp #include <iostream> #include "hello_heading.h" int main () { for ( int i = 0 ; i < Times ; i ++ ) { std :: cout << "Привет, мир!" << std :: endl ; } вернуть 0 ; }
// hello_heading.h #ifndef HELLO_HEADING_H_ #define HELLO_HEADING_H_ const int Times = 10 ; #endif
# CMakeLists.txt cmake_minimum_required ( ВЕРСИЯ 3.5 ) project ( HelloWorld CXX ) include_directories ( ${ PROJECT_SOURCE_DIR } ) add_executable ( hello hello.cpp )
Команды оболочки для запуска CMake в системе Linux (вводятся в каталог, содержащий два файла выше):
cmake -B сборка . # Настройте каталог сборки. cmake --build build # Собрать программу в каталоге сборки. ./build/hello # Запускаем программу (выводит "Hello, world!")