Jump to content

CMake

CMake
Разработчик(и) Энди Седильник, Билл Хоффман, Брэд Кинг, Кен Мартин, Александр Нойндорф
Первоначальный выпуск 2000 ; 24 года назад ( 2000 )
Стабильная версия
3.30.2 [1]  Отредактируйте это в Викиданных / 2 августа 2024 г.
Репозиторий
Написано в С , С++ [2]
Операционная система Кросс-платформенный
Тип Инструменты разработки программного обеспечения
Лицензия Пункт BSD-3
Веб-сайт cmake .org  Edit this on Wikidata

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

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 — это система упаковки для дистрибутивов программного обеспечения. Он тесно интегрирован с CMake, но может работать и без него. [31] [32]

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

Принятие

[ редактировать ]

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.

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


См. также

[ редактировать ]

Примечания

[ редактировать ]
  1. ^ Зависимости восходящего потока - зависимые источники, которые зависят от измененного исходного файла.
  2. ^ Перейти обратно: а б Как видно из репозитория исходного кода CMake.
  1. ^ «CMake 3.30.2 доступен для загрузки» . 2 августа 2024 г. Проверено 4 августа 2024 г.
  2. ^ «Проект с открытым исходным кодом CMake на OpenHub» . ОпенХаб . Проверено 9 апреля 2016 г.
  3. ^ «Сделать» .
  4. ^ Перейти обратно: а б с д и ж г час я дж к л м «Архитектура приложений с открытым исходным кодом (том 1)CMake» . aosabook.org . Проверено 11 июня 2023 г.
  5. ^ «Лицензии · мастер · CMake/CMake» . ГитЛаб . Проверено 13 ноября 2020 г.
  6. ^ «Еженедельник FLOSS 111: CMake» . подкаст . Сеть ТВиТ . Проверено 27 февраля 2011 г.
  7. ^ «КАБЕЛЬ» . Архивировано из оригинала 19 июня 2013 года . Проверено 10 ноября 2010 г.
  8. ^ Мейнард, Роберт (10 июня 2014 г.). «[CMake] [ОБЪЯВЛЕНИЕ] Выпущена версия CMake 3.0.0» .
  9. ^ «Эффективный современный CMake» . Суть .
  10. ^ Перейти обратно: а б Бинна, Мануэль (22 июля 2018 г.). «Эффективный современный CMake» .
  11. ^ https://public.kitware.com/Bug/view.php?id=14012#c32631
  12. ^ Перейти обратно: а б Нойндорф, Александр (21 июня 2006 г.). «Почему проект KDE перешел на CMake и как» . LWN.net .
  13. ^ «Обнаружение функции компилятора CMake» . 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 г.). Эффективный 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. ^ Цедильник, Андрей (30 октября 2003 г.). «Кроссплатформенная разработка программного обеспечения с использованием программного обеспечения CMake» . Linux-журнал . Проверено 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 — Документация CMake 3.19.7» . 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. ^ «Внешний проект — Документация CMake 3.14.7» . cmake.org . Проверено 24 октября 2020 г.
  31. ^ «Упаковка с помощью CPack» . Вики-сайт сообщества CMake .
  32. ^ cpack(1) Linux по основным командам Руководство .
  33. ^ «Создание Blender — Wiki для разработчиков Blender» . wiki.blender.org . Проверено 1 июля 2021 г.
  34. ^ Эльмшойзер, Дж; Краснагоркай, А; Обрешков Е; Ундрус, А (2017). «Крупномасштабная разработка программного обеспечения с помощью CMake в ATLAS» (PDF) . ЦЕРН. Архивировано (PDF) из оригинала 28 июля 2018 года.
  35. ^ «Сделать успех» . cmake.org . Посуда. 2011 . Проверено 12 марта 2022 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 98e6b438f80af6343203976bb28ae024__1722492600
URL1:https://arc.ask3.ru/arc/aa/98/24/98e6b438f80af6343203976bb28ae024.html
Заголовок, (Title) документа по адресу, URL1:
CMake - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)