В разработке программного обеспечения CMake — это кроссплатформенное бесплатное программное обеспечение с открытым исходным кодом для автоматизации сборки , тестирования , упаковки и установки программного обеспечения с использованием независимого от компилятора метода. [4] CMake сам по себе не является системой сборки; он генерирует файлы сборки другой системы. [5] Он поддерживает иерархии каталогов и приложения, которые зависят от нескольких библиотек. Он может вызывать собственные среды сборки, такие как Make , Qt Creator , Ninja , Android Studio , Xcode от Apple и Microsoft Visual Studio . [5] Он имеет минимальные зависимости, требуя только компилятор C++ в своей собственной системе сборки. [5]
CMake распространяется как бесплатное программное обеспечение с открытым исходным кодом в соответствии с разрешительной лицензией BSD-3-Clause . [6]
Разработка CMake началась в 1999 году в ответ на потребность в кроссплатформенной среде сборки для Insight Segmentation and Registration Toolkit (ITK). [7] [5] Проект финансируется Национальной медицинской библиотекой США в рамках проекта Visible Human Project . [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 для поддержки 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] [a]
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) для установки двоичных файлов и информации о пакете, объявленной скриптом CMakeLists.txt
для использования потребительскими проектами CMake. Пакет также может быть упакован в архивный файл для менеджера пакетов или установщика, поддерживаемого целевой платформой. Сторонние пакеты также могут быть импортированы через настроенные файлы CMake, которые либо предоставляются той же третьей стороной, либо создаются вручную. [16] : 132, 142 [17] [18]
Cmake можно запустить с помощью программы ncursesccmake
, которую можно использовать для настройки проектов через интерфейс командной строки.
Сборка программы или библиотеки с помощью CMake — это двухэтапный процесс. [5] Сначала файлы сборки (обычно скрипты) создаются (генерируются) из файлов конфигурации (скриптов CMakeLists.txt), написанных на языке CMake. Затем собственные инструменты сборки платформы, которые могут читать эти файлы сборки (собственная цепочка инструментов), вызываются либо вручную извне, либо через cmake --build
для фактической сборки программ (цели сборки). [13] [19] Генератор, указанный пользователем в командной строке, определяет, какую цепочку инструментов сборки использовать. [5]
Файлы сборки настраиваются в зависимости от используемого генератора (например, Unix Makefiles для make ) и связанных файлов toolchain. Продвинутые пользователи также могут создавать и включать дополнительные генераторы makefile для поддержки своих конкретных потребностей компилятора и ОС. Сгенерированные файлы обычно помещаются (с помощью cmake
флага ) в папку за пределами исходного файла (сборка из исходного кода), например, build/
.
Каждый проект сборки, в свою очередь, содержит собственный CMakeCache.txt
файл и CMakeFiles
каталог в каждом (под)каталоге проекта, включенном командой add_subdirectory(...)
, что помогает избежать или ускорить повторную генерацию при повторном запуске.
Процесс генерации и вывод можно настроить с помощью свойств цели. Раньше это делалось с помощью CMAKE_...
глобальных переменных с префиксом -, которые также использовались для настройки самого CMake и установки начальных значений по умолчанию. [11] [20] Старый подход теперь не рекомендуется.
В зависимости от конфигурации CMakeLists.txt файлы сборки могут быть исполняемыми файлами, библиотеками (например libxyz
, xyz.dll
и т. д.), библиотеками объектных файлов или псевдоцелями (включая псевдонимы). CMake может создавать объектные файлы, которые могут быть связаны с исполняемыми двоичными файлами/библиотеками, избегая динамического (во время выполнения) связывания и используя вместо этого статическое (во время компиляции) связывание. Это обеспечивает гибкость в настройке различных оптимизаций. [21]
Зависимости сборки могут определяться автоматически.
Начиная с версии 3.6, можно генерировать предварительно скомпилированные заголовки с помощью CMake. [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 . [b]
Исполняемые программы CMake, CPack и CTest написаны на языке программирования C++ . [b]
Большая часть функциональности CMake реализована в модулях, написанных на языке CMake. [29]
Начиная с версии 3.0, документация CMake использует разметку reStructuredText . HTML-страницы и страницы man генерируются генератором документации 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] и Second Life . [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 hello.cpp )
// hello.cpp #include "hello_heading.h" #include <iostream> 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 ) проект ( HelloWorld CXX ) include_directories ( ${ PROJECT_SOURCE_DIR } ) add_executable ( hello hello.cpp )
Команды оболочки для запуска CMake в системе Linux (вводятся в каталоге, содержащем два файла, указанные выше):
cmake -B build . # Настройте каталог сборки.
cmake --build build # Соберите программу в каталоге сборки.
./build/hello # Запустите программу (выведет "Hello, world!")