CMake
![]() | |
![]() | |
Разработчик(и) | Энди Седильник, Билл Хоффман, Брэд Кинг, Кен Мартин, Александр Нойндорф |
---|---|
Первоначальный выпуск | 2000 |
Стабильная версия | 3.30.2 [1] ![]() |
Репозиторий | |
Написано в | С , С++ [2] |
Операционная система | Кросс-платформенный |
Тип | Инструменты разработки программного обеспечения |
Лицензия | Пункт BSD-3 |
Веб-сайт | cmake ![]() |
В области разработки программного обеспечения CMake — это кроссплатформенное бесплатное программное обеспечение с открытым исходным кодом для автоматизации сборки , тестирования , упаковки и установки программного обеспечения с использованием независимого от компилятора метода. [3] CMake сам по себе не является системой сборки; он генерирует файлы сборки другой системы. [4] Он поддерживает иерархии каталогов и приложения, зависящие от нескольких библиотек. Он может вызывать собственные среды сборки, такие как Make , Qt Creator , Ninja , Android Studio , Apple Xcode и Microsoft Visual Studio . [4] Он имеет минимальные зависимости, требуя только компилятора C++ в собственной системе сборки. [4]
CMake распространяется как бесплатное программное обеспечение с открытым исходным кодом в соответствии с разрешительной лицензией BSD-3-Clause . [5]
История
[ редактировать ]Разработка CMake началась в 1999 году в ответ на потребность в кросс-платформенной среде сборки для Insight Segmentation and Registration Toolkit (ITK). [6] [4] Проект финансируется Национальной медицинской библиотекой США в рамках Visible Human Project . [4] Частично это было вдохновлено pcmaker
, предшественник CMake, созданный Кеном Мартином и другими разработчиками для поддержки создания набора инструментов визуализации (VTK) . pcmaker — это программа на языке C, которая преобразовывала файлы Make в аналоги NMake для MS Windows. [4] В Kitware Билл Хоффман объединил компоненты pcmaker со своими собственными идеями, стремясь имитировать функциональность Unix сценариев настройки . CMake был впервые реализован в 2000 году и получил дальнейшее развитие в 2001 году.
Исторически CMake был задуман с учетом следующих основных особенностей: [4]
- зависит только от системного компилятора C++, что означает отсутствие сторонних библиотек
- иметь возможность генерировать входные файлы Visual Studio IDE
- способен создавать исполняемые и подключаемые двоичные библиотеки (статические и общие)
- иметь возможность запускать генераторы кода во время сборки
- отдельные деревья файлов исходного кода/сборки
- системные проверки и самоанализ (аналог Autotools ): что система может и не может делать
- автоматически сканировать версии C/C++
- кроссплатформенный
Из-за этих ограничений CMake не решил использовать язык сценариев Tcl (популярный в то время) по умолчанию, и вместо этого разработчики решили создать более простой язык сценариев. [4]
Непрерывному развитию и усовершенствованиям способствовало включение CMake в собственные системы разработчиков, включая проект VXL , [ нужны разъяснения ] КАБЕЛЬ [7] функции, добавленные Брэдом Кингом, [ нужны разъяснения ] и GE Corporate R&D для поддержки DART. [ нужны разъяснения ] Дополнительные функции были созданы, когда VTK перешел на CMake для своей среды сборки и поддержки ParaView .
Версия 3.0 была выпущена в июне 2014 года. [8] Его описывают как начало «Современного CMake». [9] Теперь эксперты советуют избегать переменных в пользу целей и свойств . [10] Команды add_compile_options
, include_directories
, link_directories
, link_libraries
которые лежали в основе CMake 2, теперь должны быть заменены командами, специфичными для конкретной цели.
Разработчик Брэд Кинг заявил, что «буква C в CMake означает «кроссплатформенность » . [11]
Функции
[ редактировать ]Отдельное дерево сборки
[ редактировать ]Одной из его основных особенностей является возможность помещать выходные данные компилятора (например, объектные файлы) в дерево сборки, расположенное за пределами дерева исходного кода. [4] Это позволяет выполнять несколько сборок из одного и того же дерева исходного кода и осуществлять кросс-компиляцию . Отдельные файлы исходного кода и сборки гарантируют, что удаление каталога сборки не повлияет на исходные файлы и предотвращает беспорядок, который может сбить с толку системы контроля версий. [4]
Управление зависимостями
[ редактировать ]CMake отслеживает и перекомпилирует все исходные зависимости данного подмодуля, если его источники изменяются. [4] [а]
Гибкая структура проекта
[ редактировать ]CMake может находить общесистемные и пользовательские исполняемые файлы, файлы и библиотеки. Эти местоположения хранятся в кеше , который затем можно настроить перед созданием целевых файлов сборки. Кэш можно редактировать с помощью графического редактора, который поставляется с CMake.
CMake хорошо поддерживает сложные иерархии каталогов и приложения, использующие несколько библиотек. Например, CMake может работать с проектом, имеющим несколько наборов инструментов или библиотек, каждая из которых имеет несколько каталогов. Кроме того, CMake может работать с проектами, которые требуют создания исполняемых файлов перед созданием кода, который будет скомпилирован для конечного приложения. Его расширяемый дизайн с открытым исходным кодом позволяет адаптировать CMake по мере необходимости для конкретных проектов. [12]
Поддержка конфигурации IDE
[ редактировать ]CMake может генерировать файлы проектов для нескольких популярных IDE , таких как Microsoft Visual Studio , Xcode и Eclipse CDT . Он также может создавать сценарии сборки для MSBuild или NMake в Windows; Unix Make на Unix-подобных платформах, таких как Linux , macOS и Cygwin ; и Ninja как на Windows, так и на Unix-подобных платформах.
Обнаружение функций компилятора
[ редактировать ]CMake позволяет указать функции, которые компилятор должен поддерживать для компиляции целевой программы или библиотеки. [13]
Составители
[ редактировать ]CMake поддерживает обширный список компиляторов, включая: Apple Clang, Clang , GNU GCC , MSVC , Oracle Developer Studio и Intel C++ Compiler . [14]
Система упаковки
[ редактировать ]Несмотря на то, что CMake не является менеджером пакетов , он предоставляет базовые функции модулей (см. CPack) для установки двоичных файлов и информации о пакете, объявленной CMakeList.txt
скрипт, который будет использоваться потребительскими проектами CMake. Пакет также может быть упакован в архивный файл для менеджера пакетов или установщика, поддерживаемого целевой платформой. Сторонние пакеты также можно импортировать через настроенные файлы CMake, которые либо предоставляются той же третьей стороной, либо создаются вручную. [15] : 132, 142 [16] [17]
графический интерфейс
[ редактировать ]Cmake можно запустить с помощью программы ncurses, например ccmake
который можно использовать для настройки проектов через интерфейс командной строки.
Процесс сборки
[ редактировать ]Сборка программы или библиотеки с помощью CMake — это двухэтапный процесс. [4] Сначала файлы сборки (обычно скрипты) создаются (генерируются) из файлов конфигурации (скриптов CMakeLists.txt), написанных на языке CMake . Затем собственные инструменты сборки платформы, которые могут читать эти файлы сборки (собственная цепочка инструментов), вызываются либо вручную извне, либо через cmake --build
для фактического построения программ (build Targets). [12] [18] Генератор, указанный пользователем в командной строке, определяет, какую цепочку инструментов сборки использовать. [4]
Генераторы
[ редактировать ]Файлы сборки настраиваются в зависимости от используемого генератора (например, Unix Makefiles для make ) и связанных с ним файлов набора инструментов. Опытные пользователи также могут создавать и включать дополнительные генераторы make-файлов для поддержки своих конкретных потребностей компилятора и ОС. Сгенерированные файлы обычно размещаются (с помощью cmake
's flag) в папку за пределами исходной папки (сборка вне исходного кода), например: build/
.
Каждый проект сборки, в свою очередь, содержит свои собственные CMakeCache.txt
файл и CMakeFiles
каталог в каждом (под)каталоге проекта, включенном в add_subdirectory(...)
команда, помогающая избежать или ускорить регенерацию при ее повторном запуске.
Процесс генерации и выходные данные можно точно настроить с помощью целевых свойств. Раньше это делалось через CMAKE_...
Глобальные переменные с префиксом, которые также используются для настройки самого CMake и установки начальных значений по умолчанию. [10] [19] Старый подход сейчас не рекомендуется.
Типы целей сборки
[ редактировать ]В зависимости от конфигурации CMakeLists.txt файлы сборки могут быть либо исполняемыми файлами, либо библиотеками (например, libxyz
, xyz.dll
и т. д.), библиотеки объектных файлов или псевдоцели (включая псевдонимы). CMake может создавать объектные файлы, которые могут быть связаны с исполняемыми двоичными файлами/библиотеками, избегая динамического связывания (время выполнения) и вместо этого используя статическое связывание (время компиляции). Это обеспечивает гибкость в настройке различных оптимизаций. [20]
Зависимости сборки могут определяться автоматически.
Предварительно скомпилированные заголовки
[ редактировать ]Можно создавать предварительно скомпилированные заголовки с помощью CMake начиная с версии 3.6. [21]
Язык
[ редактировать ]CMakeLists.txt
[ редактировать ]CMake имеет относительно простой интерпретируемый императивный язык сценариев. Он поддерживает переменные, методы манипулирования строками, массивы, объявления функций/макросов и включение модулей (импорт). Команды (или директивы) языка CMake читаются cmake
из файла с именем CMakeLists.txt
. В этом файле указаны исходные файлы и параметры сборки, которые CMake поместит в спецификацию сборки проекта (например, Makefile). Кроме того, .cmake
Файлы с -суффиксом могут содержать сценарии, используемые CMake. [22]
Чтобы сгенерировать файлы сборки проекта, вызывается cmake
в терминале и указывает каталог, содержащий CMakeLists.txt
. Этот файл содержит одну или несколько команд в виде COMMAND(argument ...)
.
Синтаксис команды
[ редактировать ]Аргументы команд разделяются пробелами и могут включать ключевые слова для разделения групп аргументов. Команды могут принимать ключевые слова. Например, в команде SET_SOURCE_FILE_PROPERTIES(source_file ... COMPILE_FLAGS compiler_option ...)
ключевое слово COMPILE_FLAGS
. Он служит разделителем между списком исходных файлов и некоторыми другими опциями. [23]
Примеры команд, которые CMake предлагает для указания целей и их зависимостей и которые служат отправной точкой CMakeLists.txt: [24] [25] [26]
add_executable(...)
— объявляет исполняемую двоичную цель с исходными кодами (в зависимости от выбранного языка) для сборкиadd_library(...)
— то же, но для библиотекиtarget_link_libraries(...)
— добавляет зависимости и т. д.
Строки JSON
[ редактировать ]CMake поддерживает извлечение значений в переменные из строк данных JSON (начиная с версии 3.19). [27]
Внутренности
[ редактировать ]Язык сценариев CMake реализован с помощью генераторов Yacc и Lex . [б]
Исполняемые программы CMake, CPack и CTest написаны на языке программирования C++ . [б]
Большая часть функциональности CMake реализована в модулях, написанных на языке CMake . [28]
Начиная с версии 3.0, в документации CMake используется reStructuredText разметка . HTML-страницы и справочные страницы генерируются генератором документации Sphinx .
Модули и инструменты
[ редактировать ]CMake поставляется с многочисленными .cmake
модули и инструменты. Они облегчают такую работу, как поиск зависимостей (как встроенных, так и внешних, например FindXYZ
модулей), тестирование среды инструментальной цепочки и исполняемых файлов, выпуск пакетов ( CPack
модуль и cpack
команда) и управление зависимостями от внешних проектов ( ExternalProject
модуль): [29] [30]
- ctest — используется для команд целевого тестирования, указанных в CMakeLists.txt.
- ccmake и cmake-gui — настройки и обновления переменных конфигурации, предназначенных для собственной системы сборки.
- cpack — помогает упаковать программное обеспечение
CPack
[ редактировать ]CPack — это система упаковки для дистрибутивов программного обеспечения. Он тесно интегрирован с CMake, но может работать и без него. [31] [32]
Его можно использовать для создания:
- Linux RPM , deb и gzip Пакеты (как для двоичных файлов , так и для исходного кода ).
- Файлы NSIS (для Microsoft Windows ).
- MacOS . пакеты
Принятие
[ редактировать ]CMake получил очень широкое распространение в коммерческих проектах, проектах с открытым исходным кодом и академическом программном обеспечении. Несколько известных пользователей включают Android NDK , Netflix , Inria , MySQL , Boost (библиотеки C++) , KeePassXC , KDE , KiCAD , FreeCAD , Webkit , Blender , [33] Biicode, ReactOS , Apache Qpid , эксперимент ATLAS , [34] и Вторая жизнь . [35]
Примеры
[ редактировать ]Привет, мир
[ редактировать ]В следующих файлах исходного кода показано, как создать простую программу hello world , написанную на C++, с помощью CMake.
Пример 1
[ редактировать ]// hello.cpp#include <iostream>int main(){ std::cout << "Hello, world!\n";}
# CMakeLists.txtcmake_minimum_required(VERSION 3.5)project(HelloWorld CXX)add_executable(hello hello.cpp)
Пример 2
[ редактировать ]// hello.cpp#include "hello_heading.h"#include <iostream>int main(){ for (int i = 0; i < Times; i++) { std::cout << "Hello, world!\n"; }}
// hello_heading.h#ifndef HELLO_HEADING_H_#define HELLO_HEADING_H_const int Times = 10;#endif
# CMakeLists.txtcmake_minimum_required(VERSION 3.5)project(HelloWorld CXX)include_directories(${PROJECT_SOURCE_DIR})add_executable(hello hello.cpp)
оболочки Команды для запуска CMake в системе Linux (вводятся в каталог, содержащий два файла выше):
cmake -B build . # Configure the build directory.cmake --build build # Build the program in the build directory../build/hello # Run the program (outputs "Hello, world!")
См. также
[ редактировать ]- Список программного обеспечения для автоматизации сборки § Генерация сценариев сборки
- настроить скрипт
- Делать
- Монорепо
- Кмейк
Примечания
[ редактировать ]- ^ Зависимости восходящего потока - зависимые источники, которые зависят от измененного исходного файла.
- ^ Перейти обратно: а б Как видно из репозитория исходного кода CMake.
Ссылки
[ редактировать ]- ^ «CMake 3.30.2 доступен для загрузки» . 2 августа 2024 г. Проверено 4 августа 2024 г.
- ^ «Проект с открытым исходным кодом CMake на OpenHub» . ОпенХаб . Проверено 9 апреля 2016 г.
- ^ «Сделать» .
- ^ Перейти обратно: а б с д и ж г час я дж к л м «Архитектура приложений с открытым исходным кодом (том 1)CMake» . aosabook.org . Проверено 11 июня 2023 г.
- ^ «Лицензии · мастер · CMake/CMake» . ГитЛаб . Проверено 13 ноября 2020 г.
- ^ «Еженедельник FLOSS 111: CMake» . подкаст . Сеть ТВиТ . Проверено 27 февраля 2011 г.
- ^ «КАБЕЛЬ» . Архивировано из оригинала 19 июня 2013 года . Проверено 10 ноября 2010 г.
- ^ Мейнард, Роберт (10 июня 2014 г.). «[CMake] [ОБЪЯВЛЕНИЕ] Выпущена версия CMake 3.0.0» .
- ^ «Эффективный современный CMake» . Суть .
- ^ Перейти обратно: а б Бинна, Мануэль (22 июля 2018 г.). «Эффективный современный CMake» .
- ^ https://public.kitware.com/Bug/view.php?id=14012#c32631
- ^ Перейти обратно: а б Нойндорф, Александр (21 июня 2006 г.). «Почему проект KDE перешел на CMake и как» . LWN.net .
- ^ «Обнаружение функции компилятора CMake» . www.scivision.dev . 15 ноября 2020 г. Проверено 22 января 2022 г.
- ^ «Поддерживаемые компиляторы» . Документация CMake . Проверено 22 января 2022 г.
- ^ Бернер, Доминик (2022). Лучшие практики CMake: откройте для себя проверенные методы создания и поддержки проектов программирования с помощью CMake . Мустафа Кемаль Гилор. Бирмингем: Packt Publishing, Limited. ISBN 978-1-80324-424-2 . OCLC 1319218167 .
- ^ «cmake-packages(7) — Документация CMake 3.24.1» . cmake.org . Проверено 11 сентября 2022 г.
- ^ «Предоставление конфигурации модуля (дополнительно) — документация по процедуре сборки CMake 1.0» . docs.salome-platform.org . Проверено 11 сентября 2022 г.
- ^ «cmake-toolchains(7) — Документация CMake 3.19.0-rc2» . cmake.org . Проверено 29 октября 2020 г.
- ^ Пфайфер, Дэниел (19 мая 2017 г.). Эффективный Cmake (PDF) . CPPNow.
- ^ «cmake-buildsystem(7) — Документация CMake 3.19.0-rc3» . cmake.org . Проверено 14 ноября 2020 г.
- ^ «target_precompile_headers — Документация CMake 3.21.20210925-gb818e3c» . cmake.org . Проверено 25 сентября 2021 г.
- ^ «cmake-language(7) — Документация CMake 3.19.0-rc2» . cmake.org . Проверено 29 октября 2020 г.
- ^ Цедильник, Андрей (30 октября 2003 г.). «Кроссплатформенная разработка программного обеспечения с использованием программного обеспечения CMake» . Linux-журнал . Проверено 29 января 2021 г.
- ^ «add_executable — Документация CMake 3.19.0-rc1» . cmake.org . Проверено 25 октября 2020 г.
- ^ «add_library — Документация CMake 3.19.0-rc1» . cmake.org . Проверено 25 октября 2020 г.
- ^ «target_link_directories — Документация CMake 3.20.2» . cmake.org . Проверено 10 мая 2021 г.
- ^ «Примечания к выпуску CMake 3.19 — Документация CMake 3.19.7» . cmake.org . Проверено 15 марта 2021 г.
- ^ «cmake-language(7) — Документация CMake 3.19.0-rc1» . cmake.org . Проверено 25 октября 2020 г.
- ^ «cmake-modules(7) — Документация CMake 3.14.7» . cmake.org . Проверено 24 октября 2020 г.
- ^ «Внешний проект — Документация CMake 3.14.7» . cmake.org . Проверено 24 октября 2020 г.
- ^ «Упаковка с помощью CPack» . Вики-сайт сообщества CMake .
- ^ Linux по основным командам Руководство . –
- ^ «Создание Blender — Wiki для разработчиков Blender» . wiki.blender.org . Проверено 1 июля 2021 г.
- ^ Эльмшойзер, Дж; Краснагоркай, А; Обрешков Е; Ундрус, А (2017). «Крупномасштабная разработка программного обеспечения с помощью CMake в ATLAS» (PDF) . ЦЕРН. Архивировано (PDF) из оригинала 28 июля 2018 года.
- ^ «Сделать успех» . cmake.org . Посуда. 2011 . Проверено 12 марта 2022 г.