stringtranslate.com

CMake

В разработке программного обеспечения CMake это кроссплатформенное бесплатное программное обеспечение с открытым исходным кодом для автоматизации сборки , тестирования , упаковки и установки программного обеспечения с использованием независимого от компилятора метода. [3] CMake сам по себе не является системой сборки; он генерирует файлы сборки другой системы. [4] Он поддерживает иерархии каталогов и приложения, которые зависят от нескольких библиотек. Он может вызывать собственные среды сборки, такие как Make , Qt Creator , Ninja , Android Studio , Xcode от Apple и 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, который был создан Кеном Мартином и другими разработчиками для поддержки сборки Visualization Toolkit (VTK) . pcmaker была программой на языке C, которая преобразовывала файлы Make в аналоги NMake для MS Windows. [4] В Kitware Билл Хоффман смешал компоненты pcmaker со своими собственными идеями, стремясь имитировать функциональность сценариев конфигурации Unix . CMake был впервые реализован в 2000 году и получил дальнейшее развитие в 2001 году.

Исторически CMake был задуман с учетом следующих основных особенностей: [4]

Из-за этих ограничений CMake не стал использовать язык сценариев Tcl (популярный в то время) в качестве языка по умолчанию, и вместо этого разработчики решили создать более простой язык сценариев. [4]

Дальнейшая разработка и усовершенствования подпитывались включением CMake в собственные системы разработчиков, включая проект VXL , [ необходимо разъяснение ] функции CABLE [7], добавленные Брэдом Кингом, [ необходимо разъяснение ] и корпоративный отдел исследований и разработок GE для поддержки 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] [a]

Гибкая структура проекта

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 можно запустить с помощью программы ncursesccmake , которую можно использовать для настройки проектов через интерфейс командной строки.

Процесс сборки

Сборка программы или библиотеки с помощью CMake — это двухэтапный процесс. [4] Сначала файлы сборки (обычно скрипты) создаются (генерируются) из файлов конфигурации (скриптов CMakeLists.txt), написанных на языке CMake. Затем собственные инструменты сборки платформы, которые могут читать эти файлы сборки (собственная цепочка инструментов), вызываются либо вручную извне, либо через cmake --buildдля фактической сборки программ (цели сборки). [12] [18] Генератор, указанный пользователем в командной строке, определяет, какую цепочку инструментов сборки использовать. [4]

Генераторы

Файлы сборки настраиваются в зависимости от используемого генератора (например, Unix Makefiles для make ) и связанных файлов toolchain. Продвинутые пользователи также могут создавать и включать дополнительные генераторы makefile для поддержки своих конкретных потребностей компилятора и ОС. Сгенерированные файлы обычно помещаются (с помощью cmakeфлага ) в папку за пределами исходного файла (сборка из исходного кода), например, build/.

Каждый проект сборки, в свою очередь, содержит свой собственный CMakeCache.txtфайл и CMakeFilesкаталог в каждом (под)каталоге проекта, включенном командой add_subdirectory(...), что помогает избежать или ускорить повторную генерацию при повторном запуске.

Процесс генерации и вывод можно настроить с помощью свойств цели. Раньше это делалось с помощью CMAKE_...глобальных переменных с префиксом -, которые также использовались для настройки самого CMake и установки начальных значений по умолчанию. [10] [19] Старый подход теперь не рекомендуется.

Типы целей сборки

В зависимости от конфигурации CMakeLists.txt файлы сборки могут быть исполняемыми файлами, библиотеками (например libxyz, xyz.dllи т. д.), библиотеками объектных файлов или псевдоцелями (включая псевдонимы). CMake может создавать объектные файлы, которые могут быть связаны с исполняемыми двоичными файлами/библиотеками, избегая динамического (во время выполнения) связывания и используя вместо этого статическое (во время компиляции) связывание. Это обеспечивает гибкость в настройке различных оптимизаций. [20]

Зависимости сборки могут определяться автоматически.

Предварительно скомпилированные заголовки

Начиная с версии 3.6, можно генерировать предварительно скомпилированные заголовки с помощью CMake. [21]

Язык

CMakeLists.txt

CMake имеет относительно простой интерпретируемый , императивный язык сценариев. Он поддерживает переменные, методы обработки строк, массивы, объявления функций/макросов и включение модулей (импорт). Команды (или директивы) языка CMake считываются из cmakeфайла с именем CMakeLists.txt. Этот файл определяет исходные файлы и параметры сборки, которые CMake поместит в спецификацию сборки проекта (например, Makefile). Кроме того, .cmakeфайлы с суффиксом - могут содержать сценарии, используемые CMake. [22]

Чтобы сгенерировать файлы сборки проекта, нужно вызвать cmakeв терминале и указать каталог, содержащий CMakeLists.txt. Этот файл содержит одну или несколько команд в форме COMMAND(argument ...).

Синтаксис команды

Аргументы команд разделены пробелами и могут включать ключевые слова для разделения групп аргументов. Команды могут принимать ключевые слова. Например, в команде ключевое слово . Оно служит разделителем между списком исходных файлов и некоторыми другими параметрами. [23]SET_SOURCE_FILE_PROPERTIES(source_file ... COMPILE_FLAGS compiler_option ...)COMPILE_FLAGS

Примеры команд, которые CMake предлагает для указания целей и их зависимостей и которые служат отправной точкой CMakeLists.txt: [24] [25] [26]

Строки JSON

CMake поддерживает извлечение значений в переменные из строк данных JSON (начиная с версии 3.19). [27]

Внутренности

Язык сценариев CMake реализован с использованием генераторов Yacc и Lex . [b]

Исполняемые программы CMake, CPack и CTest написаны на языке программирования C++ . [b]

Большая часть функциональности CMake реализована в модулях, написанных на языке CMake. [28]

Начиная с версии 3.0, документация CMake использует разметку reStructuredText . HTML-страницы и страницы руководства генерируются генератором документации Sphinx .

Модули и инструменты

CMake поставляется с многочисленными .cmakeмодулями и инструментами. Они облегчают работу, например, поиск зависимостей (как встроенных, так и внешних, например FindXYZмодулей), тестирование среды цепочки инструментов и исполняемых файлов, упаковка релизов ( CPackмодуль и cpackкоманда) и управление зависимостями от внешних проектов ( ExternalProjectмодуль): [29] [30]

CПакет

CPack — это система упаковки для дистрибутивов программного обеспечения. Она тесно интегрирована с CMake, но может работать и без него. [31] [32]

Его можно использовать для создания:

Принятие

CMake был очень широко принят среди коммерческих, open-source и академических программных проектов. Несколько известных пользователей включают Android NDK , Netflix , Inria , MySQL , Boost (библиотеки C++) , KeePassXC , KDE , KiCAD , FreeCAD , Webkit , Blender , [33] Biicode, ReactOS , Apache Qpid , эксперимент ATLAS , [34] и Second Life . [35]

Примеры

Привет, мир

Следующие файлы исходного кода демонстрируют, как создать простую программу 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 hello.cpp )   

Пример 2

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


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

Примечания

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

Ссылки

  1. ^ "CMake 3.30.3 доступен для загрузки". 29 августа 2024 г. Получено 30 августа 2024 г.
  2. ^ "Проект CMake с открытым исходным кодом на OpenHub". OpenHub . Получено 9 апреля 2016 г. .
  3. ^ "CMake".
  4. ^ abcdefghijklm "Архитектура приложений с открытым исходным кодом (том 1)CMake". aosabook.org . Получено 11 июня 2023 г. .
  5. ^ "Лицензии · master · CMake / CMake". GitLab . Получено 13 ноября 2020 г. .
  6. ^ "FLOSS Weekly 111: CMake". подкаст . TWiT Network . Получено 27 февраля 2011 г.
  7. ^ "The CABLE". Архивировано из оригинала 19 июня 2013 года . Получено 10 ноября 2010 года .
  8. Мейнард, Роберт (10 июня 2014 г.). «[CMake] [АНОНС] Выпущен CMake 3.0.0».
  9. ^ "Эффективный современный CMake". Gist .
  10. ^ ab Binna, Manuel (22 июля 2018 г.). «Эффективный современный CMake».
  11. ^ https://public.kitware.com/Bug/view.php?id=14012#c32631 [ пустой URL ]
  12. ^ ab Neundorf, Alexander (21 июня 2006 г.). «Почему проект KDE перешел на CMake — и как». LWN.net .
  13. ^ "CMake compiler feature detect". www.scivision.dev . 15 ноября 2020 г. Получено 22 января 2022 г.
  14. ^ "Поддерживаемые компиляторы". Документация CMake . Получено 22 января 2022 г.
  15. ^ Бернер, Доминик (2022). Лучшие практики CMake: откройте для себя проверенные методы создания и поддержки программных проектов с CMake. Мустафа Кемаль Гилор. Бирмингем: Packt Publishing, Limited. ISBN 978-1-80324-424-2. OCLC  1319218167.
  16. ^ "cmake-packages(7) — Документация CMake 3.24.1". cmake.org . Получено 11 сентября 2022 г. .
  17. ^ "Отображение конфигурации модуля (расширенная информация) — документация процедуры сборки CMake 1.0". docs.salome-platform.org . Получено 11 сентября 2022 г. .
  18. ^ "cmake-toolchains(7) — Документация CMake 3.19.0-rc2". cmake.org . Получено 29 октября 2020 г. .
  19. ^ Пфайфер, Дэниел (19 мая 2017 г.). Effective Cmake (PDF) . CPPNow.
  20. ^ "cmake-buildsystem(7) — Документация CMake 3.19.0-rc3". cmake.org . Получено 14 ноября 2020 г. .
  21. ^ "target_precompile_headers — Документация CMake 3.21.20210925-gb818e3c". cmake.org . Получено 25 сентября 2021 г. .
  22. ^ "cmake-language(7) — Документация CMake 3.19.0-rc2". cmake.org . Получено 29 октября 2020 г. .
  23. ^ Cedilnik, Andrej (30 октября 2003 г.). «Кроссплатформенная разработка программного обеспечения с использованием CMake Software». Linux Journal . Получено 29 января 2021 г.
  24. ^ "add_executable — Документация CMake 3.19.0-rc1". cmake.org . Получено 25 октября 2020 г. .
  25. ^ "add_library — Документация CMake 3.19.0-rc1". cmake.org . Получено 25 октября 2020 г. .
  26. ^ "target_link_directories — Документация CMake 3.20.2". cmake.org . Получено 10 мая 2021 г. .
  27. ^ "CMake 3.19 Release Notes — CMake 3.19.7 Documentation". cmake.org . Получено 15 марта 2021 г. .
  28. ^ "cmake-language(7) — Документация CMake 3.19.0-rc1". cmake.org . Получено 25 октября 2020 г. .
  29. ^ "cmake-modules(7) — Документация CMake 3.14.7". cmake.org . Получено 24 октября 2020 г. .
  30. ^ "ExternalProject — Документация CMake 3.14.7". cmake.org . Получено 24 октября 2020 г. .
  31. ^ "Упаковка с помощью CPack". CMake Community Wiki .
  32. ^ cpack(1)  –  Руководство по основным командам Linux .
  33. ^ "Building Blender - Blender Developer Wiki". wiki.blender.org . Получено 1 июля 2021 г. .
  34. ^ Elmsheuser, J; Krasznahorkay, A; Obreshkov, E; Undrus, A (2017). "Large Scale Software Building with CMake in ATLAS" (PDF) . CERN. Архивировано (PDF) из оригинала 28 июля 2018 г.
  35. ^ "CMake Success". cmake.org . Kitware. 2011 . Получено 12 марта 2022 .

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