stringtranslate.com

CMake

В разработке программного обеспечения 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]

Поддержка конфигурации IDE

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]

Язык

CMakeLists.txt

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]

Строки JSON

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

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.

Пример 1

// hello.cpp #include <iostream> int main () { std :: cout << "Привет, мир!" << std :: endl ; вернуть 0 ; }        
# CMakeLists.txt cmake_minimum_required ( ВЕРСИЯ 3.5 ) проект ( HelloWorld CXX ) add_executable ( привет, hello.cpp )   

Пример 2

// 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!")     


Смотрите также

Примечания

  1. ^ Зависимости восходящего потока - зависимые источники, которые зависят от измененного исходного файла.
  2. ^ ab Как видно из репозитория исходного кода CMake.

Рекомендации

  1. ^ «CMake 3.28.3 доступен для загрузки» . 5 февраля 2024 г. Проверено 6 февраля 2024 г.
  2. ^ «CMake 3.29.0-rc2 готов к тестированию» . 22 февраля 2024 г.
  3. ^ «Проект с открытым исходным кодом CMake на OpenHub» . ОпенХаб . Проверено 9 апреля 2016 г.
  4. ^ "CMake".
  5. ^ abcdefghijklm «Архитектура приложений с открытым исходным кодом (том 1) CMake». aosabook.org . Проверено 11 июня 2023 г.
  6. ^ «Лицензии · мастер · CMake / CMake» . ГитЛаб . Проверено 13 ноября 2020 г.
  7. ^ "Еженедельник FLOSS 111: CMake" . подкаст . Сеть ТВиТ . Проверено 27 февраля 2011 г.
  8. ^ "КАБЕЛЬ". Архивировано из оригинала 19 июня 2013 года . Проверено 10 ноября 2010 г.
  9. Мейнард, Роберт (10 июня 2014 г.). «[CMake] [ОБЪЯВЛЕНИЕ] Выпущена версия CMake 3.0.0».
  10. ^ «Эффективный современный CMake». Суть .
  11. ↑ Аб Бинна, Мануэль (22 июля 2018 г.). «Эффективный современный CMake».
  12. ^ https://public.kitware.com/Bug/view.php?id=14012#c32631
  13. ↑ Аб Нойндорф, Александр (21 июня 2006 г.). «Почему проект KDE перешел на CMake и как». LWN.net .
  14. ^ «Обнаружение функции компилятора CMake» . www.scivision.dev . 15 ноября 2020 г. Проверено 22 января 2022 г.
  15. ^ «Поддерживаемые компиляторы». Документация CMake . Проверено 22 января 2022 г.
  16. ^ Бернер, Доминик (2022). Лучшие практики CMake: откройте для себя проверенные методы создания и поддержки проектов программирования с помощью CMake. Мустафа Кемаль Гилор. Бирмингем: Packt Publishing, Limited. ISBN 978-1-80324-424-2. ОСЛК  1319218167.
  17. ^ «cmake-packages(7) — Документация CMake 3.24.1». cmake.org . Проверено 11 сентября 2022 г.
  18. ^ «Предоставление конфигурации модуля (дополнительно) — документация по процедуре сборки CMake 1.0» . docs.salome-platform.org . Проверено 11 сентября 2022 г.
  19. ^ «cmake-toolchains(7) — Документация CMake 3.19.0-rc2» . cmake.org . Проверено 29 октября 2020 г.
  20. Пфайфер, Дэниел (19 мая 2017 г.). Эффективный Cmake (PDF) . CPPNow.
  21. ^ «cmake-buildsystem(7) — Документация CMake 3.19.0-rc3» . cmake.org . Проверено 14 ноября 2020 г.
  22. ^ «target_precompile_headers — Документация CMake 3.21.20210925-gb818e3c» . cmake.org . Проверено 25 сентября 2021 г.
  23. ^ «cmake-language(7) — Документация CMake 3.19.0-rc2» . cmake.org . Проверено 29 октября 2020 г.
  24. Цедильник, Андрей (30 октября 2003 г.). «Кроссплатформенная разработка программного обеспечения с использованием программного обеспечения CMake». Linux-журнал . Проверено 29 января 2021 г.
  25. ^ «add_executable — Документация CMake 3.19.0-rc1» . cmake.org . Проверено 25 октября 2020 г.
  26. ^ «add_library — Документация CMake 3.19.0-rc1» . cmake.org . Проверено 25 октября 2020 г.
  27. ^ «target_link_directories — Документация CMake 3.20.2». cmake.org . Проверено 10 мая 2021 г.
  28. ^ «Примечания к выпуску CMake 3.19 — Документация CMake 3.19.7» . cmake.org . Проверено 15 марта 2021 г.
  29. ^ «cmake-language(7) — Документация CMake 3.19.0-rc1» . cmake.org . Проверено 25 октября 2020 г.
  30. ^ «cmake-modules(7) — Документация CMake 3.14.7». cmake.org . Проверено 24 октября 2020 г.
  31. ^ «ExternalProject — Документация CMake 3.14.7» . cmake.org . Проверено 24 октября 2020 г.
  32. ^ «Упаковка с помощью CPack». Вики-сайт сообщества CMake .
  33. ^ cpack(1)  –  Руководство по основным командам Linux .
  34. ^ "Создание Blender - Wiki для разработчиков Blender" . wiki.blender.org . Проверено 1 июля 2021 г.
  35. ^ Эльмшойзер, Дж; Краснагоркай, А; Обрешков Е; Ундрус, А (2017). «Крупномасштабное создание программного обеспечения с помощью CMake в ATLAS» (PDF) . ЦЕРН. Архивировано (PDF) из оригинала 28 июля 2018 года.
  36. ^ "CMake Success" . cmake.org . Посуда. 2011 . Проверено 12 марта 2022 г.

Внешние ссылки