CMake
![]() | |
![]() | |
Разработчик(и) | Энди Седильник, Билл Хоффман, Брэд Кинг, Кен Мартин, Александр Нойндорф |
---|---|
Первоначальный выпуск | 2000 |
Стабильная версия | 3.30.3 [ 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.txt
cmake_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.txt
cmake_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.3 доступен для загрузки» . 29 августа 2024 г. Проверено 30 августа 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 [ только URL ]
- ^ Перейти обратно: а б Нойндорф, Александр (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 г.