CMake: различия между версиями
[непроверенная версия] | [непроверенная версия] |
Dr64h (обсуждение | вклад) м →Программные проекты использующие CMake: дополнение, источники |
Dr64h (обсуждение | вклад) викификация, стилевые правки |
||
Строка 1: | Строка 1: | ||
{{Карточка программы |
{{Карточка программы|состояние = активное}} |
||
| название = CMake |
|||
| логотип = Breezeicons-apps-48-cmake.svg |
|||
| тип = [[утилита]],<br> |
|||
[[автоматизация сборки]],<br> |
|||
[[свободное и открытое программное обеспечение]] |
|||
| автор = {{iw|Kitware|Kitware, Inc.|en|Kitware}} |
|||
| разработчики = Энди Седильник (Andy Cedilnik),<br> |
|||
Билл Хоффман (Bill Hoffman),<br> |
|||
Брэд Кинг (Brad King),<br> |
|||
Кен Мартин (Ken Martin),<br> |
|||
Александр Нойндорф (Alexander Neundorf) |
|||
| написана на = [[Си (язык программирования)|Си]], [[C++]]<ref> |
|||
{{cite web |
|||
|url = https://www.openhub.net/p/cmake/analyses/latest/languages_summary |
|||
|title = The cmake Open Source Project on Open Hub: Languages Page |
|||
|lang = en |
|||
|website = [[Open Hub]] |
|||
|access-date = 2022-01-18 |
|||
}} |
|||
</ref> |
|||
| интерфейс = [[Интерфейс командной строки|CLI]], [[Qt]] |
|||
| операционные системы = [[Unix-подобная операционная система|Unix-подобные]],<br> |
|||
[[Microsoft Windows]] |
|||
| аппаратная платформа = [[кроссплатформенность]] |
|||
| языки интерфейса = [[английский]] |
|||
| первый выпуск = [[2000]] |
|||
| последняя версия = 3.22.1<ref> |
|||
{{cite web |
|||
|url = https://blog.kitware.com/cmake-3-22-1-available-for-download/ |
|||
|title = CMake 3.22.1 available for download |
|||
|lang = en |
|||
|website = kitware.com |
|||
|access-date = 2022-01-18 |
|||
}} |
|||
</ref> |
|||
| дата последней версии = [[7 декабря]] [[2021]] |
|||
| состояние = активное |
|||
| лицензия = [[Лицензия BSD|модифицированная лицензия BSD]] |
|||
| сайт = https://cmake.org/ |
|||
| кандидат в релизы = 3.21.0-rc3<ref> |
|||
{{cite web |
|||
|url = https://blog.kitware.com/cmake-3-21-0-rc3-is-ready-for-testing/ |
|||
|title = CMake 3.21.0-rc3 is ready for testing |
|||
|lang = en |
|||
|website = kitware.com |
|||
|access-date = 2022-01-18 |
|||
}} |
|||
</ref> |
|||
| дата кандидата в релизы = [[8 июля]] [[2021]] |
|||
}} |
|||
'''CMake''' (<small>[[МФА]]</small> {{МФА2|ˈ|s|i|ː|m|e|ɪ|k}}, от {{lang-en|'''C'''ross-platform [[Make|'''M'''ake]]}}) — это [[кроссплатформенность|кроссплатформенная]] [[утилита]], обладающая возможностями [[Автоматизация сборки|автоматизации сборки]] программного обеспечения из [[исходный код|исходного кода]]. Сам CMake не занимается непосредственно сборкой, а лишь генерирует файлы сборки из предварительно написанного [[Скрипт|скрипт-файла]] «<tt>CMakeLists.txt</tt>» и предоставляет простой единый интерфейс управления. Помимо этого, CMake способен автоматизировать процесс [[Установка программного обеспечения|установки]] и [[Система управления пакетами|пакетирования]]. |
'''CMake''' (<small>[[МФА]]</small> {{МФА2|ˈ|s|i|ː|m|e|ɪ|k}}, от {{lang-en|'''C'''ross-platform [[Make|'''M'''ake]]}}) — это [[кроссплатформенность|кроссплатформенная]] [[утилита]], обладающая возможностями [[Автоматизация сборки|автоматизации сборки]] программного обеспечения из [[исходный код|исходного кода]]. Сам CMake не занимается непосредственно сборкой, а лишь генерирует файлы сборки из предварительно написанного [[Скрипт|скрипт-файла]] «<tt>CMakeLists.txt</tt>» и предоставляет простой единый интерфейс управления. Помимо этого, CMake способен автоматизировать процесс [[Установка программного обеспечения|установки]] и [[Система управления пакетами|пакетирования]]. |
||
Версия от 23:24, 14 марта 2022
CMake | |
---|---|
Тип | система сборки[вд], свободное и открытое программное обеспечение и утилита |
Автор | Kitware[вд] |
Разработчики | Kitware[вд], Александр Нойндорф[вд], Кен Мартин[вд], Андрей Седильник[вд], Уильям Хоффман[вд] и Брэд Кинг[вд] |
Написана на | C++ и Си[3] |
Интерфейс | Qt[4][5][…] |
Операционные системы | Unix-подобная операционная система[6] и Windows[6] |
Языки интерфейса | английский |
Первый выпуск | 2000 |
Аппаратная платформа | кроссплатформенность[7] |
Последняя версия |
|
Кандидат в релизы |
|
Репозиторий | gitlab.kitware.com/cmake… |
Состояние | активное |
Лицензия | модифицированная лицензия BSD[вд][8][9][…] |
Сайт | cmake.org (англ.) |
Медиафайлы на Викискладе |
CMake (МФА [ˈsiːmeɪk], от англ. Cross-platform Make) — это кроссплатформенная утилита, обладающая возможностями автоматизации сборки программного обеспечения из исходного кода. Сам CMake не занимается непосредственно сборкой, а лишь генерирует файлы сборки из предварительно написанного скрипт-файла «CMakeLists.txt» и предоставляет простой единый интерфейс управления. Помимо этого, CMake способен автоматизировать процесс установки и пакетирования.
Считается альтернативой распространённой в сообществе GNU системе Autotools, разработанной на базе Perl и M4, которая требует определённых навыков для практического использования, а существующие версии в ряде случаев несовместимы друг с другом.
В сравнении с другой альтернативой Autotools — появившейся в 2008 году системой SCons основанной на Python — является более быстродействующей, поскольку написана на Си и использует крайне простой макроязык, но при этом SCons обладает большими возможностями по расширению.
История создания
Разработка CMake началась в 1999 году в ответ на потребность в кроссплатформенной системе сборки для ITK[англ.][10]. Проект финансируемый национальной библиотекой медицины США, как часть проекта «Visible Human Project[англ.]». Задача по разработке была возложена на небольшую компанию Kitware[англ.].
В то время было нормой использовать конфигурационные скрипты и Make файлы для сборки программных проектов на Unix платформах и файлы проектов Visual Studio в среде Windows. Такой подход к разработке вызывал огромное неудобство, так как к примеру добавление обыкновенного файла исходного кода в проект, приводило к большим трудностям. Ведь для каждой платформы, это приходилось делать по отдельности и совершенно разными методами. Очевидно, что разработчики хотели иметь единую унифицированную систему сборки, не отнимающую лишнее время и имеющую все преимущества существующих систем сборки, но при этом не имеющую их недостатков[11][12].
Возможности
Ключевой особенностью является возможность (необязательно) размещать выходные данные компилятора (например, объектные файлы) вне дерева исходного кода. Это позволяет выполнять несколько вариаций сборок из одного и того же исходного кода, а также кросскомпиляцию. Такой подход разделения файлов исходного кода и файлов сборки даёт гарантию, что удаление каталога сборки не приведет к удалению исходного кода. Однако сами пользователи не защищены от случайного удаления каталога с исходными файлами[13].
Настраиваемая структура проекта
CMake может находить общесистемные и пользовательские каталоги исполняемых файлов, файлов конфигураций и библиотек. Эти местоположения хранятся в кэше, который можно конфигурировать перед созданием целевых файлов сборки. CMake кэш можно редактировать с помощью графического редактора, который поставляется вместе с CMake, либо вручную, посредством оболочки командной строки с помощью команд CMake.
Сложные иерархии каталогов проектов, рассчитанные на разные конфигурации, сборку с разными библиотеками и инструментами, также хорошо поддерживаются CMake. По сути CMake предоставляет возможность создавать подпроекты, собираемые перед сборкой основного проекта, что позволяет создавать цепочки зависимостей, собираемые в правильной необходимой разработчику последовательности.
Поддержка разных сред разработки
CMake может создавать файлы проектов для нескольких популярных ИСР, таких как Microsoft Visual Studio, Xcode и Eclipse CDT.
Он также может создавать сценарии сборки для:
- MSBuild и Nmake в Windows;
- Unix Make на Unix-подобных платформах, таких как Linux, BSD, macOS и Cygwin;
- А также Ninja, как на Windows, так и на Unix-подобных платформах.
Для упрощения внедрения поддержки CMake в новые ИСР, рекомендуется использовать файлы преднастройки «CMakePresets.json»[14], для более удобного конфигурирования процесса сборки, а также «File API»[15], содержащий всю необходимую для ИСР информацию.
Процесс сборки
Сборка программы или библиотеки с помощью CMake, представляет собой двухэтапный процесс. Во-первых, стандартные файлы сборки создаются (генерируются) из файлов конфигурации (CMakeLists.txt), которые написаны на языке CMake. Затем задействуются системные инструменты сборки (Make, Ninja и т. п.) используемые для фактического создания программ[13][16].
Файлы сборки конфигурируются в зависимости от используемого генератора (например, генератор «Unix Makefiles» — для Make фaйлов). Продвинутые пользователи могут создавать и включать свои собственные генераторы файлов Make, для поддержки новых компиляторов и операционных систем. Сгенерированные файлы обычно помещаются (с помощью флага CMake) во внешний каталог, за пределами исходных файлов, например в каталог «build».
Каждый проект после сборки, в поддиректориях содержит «CMakeCache.txt» и каталог файлов Make, что помогает избежать или ускорить этап «перегенерации», после повторного запуска сборки[17].
Типы целей сборки
В зависимости от конфигурации CMakeLists.txt и выбранной цели, файлы сборки могут создавать:
- исполняемые файлы;
- разделяемые библиотеки (например, libxyz, xyz.dll и т. п.);
- библиотеки объектных файлов;
- псевдо цели (включая псевдонимы).
CMake может создавать объектные файлы, которые могут быть связаны с исполняемыми двоичными файлами / библиотеками, избегая динамического (во время выполнения) связывания и вместо этого используя статическое (во время компиляции). Это обеспечивает гибкость в настройке различных оптимизаций (зависимости сборки могут определяться автоматически)[18].
Предкомпилированные заголовочные файлы
Начиная с версии CMake 3.6, можно создавать предварительно скомпилированные заголовочные файлы[19].
Язык
CMake имеет относительно простой интерпретируемый императивный язык сценариев. Он поддерживает переменные, методы обработки строк, массивы, объявления функций и макросов, включение модулей (импортирование). Команды языка CMake (или директивы) считываются CMake из файла CMakeLists.txt. В этом файле указываются исходные файлы и параметры сборки, которые CMake размещает в спецификации сборки проекта (например, в файле Make). Кроме того, файлы с приставкой .cmake, могут содержать сценарии используемые CMake[20].
Синтаксис команд
Аргументы команд разделены пробелами и могут содержать ключевые слова, для разделения групп аргументов. Например, в команде
install(TARGETS ...
CONFIGURATIONS ...
RUNTIME DESTINATION ...)
ключевые слова — TARGETS
, CONFIGURATIONS
и RUNTIME DESTINATION
. В данном случае TARGETS
и CONFIGURATIONS
служат разделителями между «целями» и «конфигурациями»[21].
Примеры команд CMake, которые определяют цели и их зависимости[22][23][24]:
add_executable(...)
— определяет цель (исполняемый файл, например .exe, зависит от целевой платформы);add_library(...)
— определяет цель (библиотеку, например .so или .dll);target_link_libraries(...)
— определяет зависимости указанной цели.
Поддержка JSON
CMake поддерживает извлечение значений данных в переменные из строк JSON (начиная с версии 3.19)[25].
Модули и инструменты
CMake поставляется с большим количеством модулей и инструментов «.cmake». Они облегчают такую работу, как поиск зависимостей (как встроенных, так и внешних, например, FindXYZ модули), инструменты для тестирования исполняемых файлов, упаковка (модуль CPack и команда cpack) и управление зависимостями от внешних проектов (модуль ExternalProject)[26][27]:
- ctest — используется для тестирования целей, заданных в CMakeLists.txt;
- ccmake и cmake-gui — настраивает и обновляет переменные конфигурации, предназначенные для целевой системы сборки;
- cpack — помогает упаковывать и устанавливать программное обеспечение.
CPack
Начиная с версии 2.4.2[28], в состав CMake включены система автоматизированной сборки пакетов программного обеспечения CPack и модуль CMake для взаимодействия с ней. Система позволяет создавать пакеты программного обеспечения для популярных пакетных менеджеров (DEB, RPM, DMG), средства установки программного обеспечения (NSIS для Microsoft Windows), а также архивы со сборкой (TGZ, TBZ2, ZIP, самораспаковывающийся TGZ)[29].
Программные проекты использующие CMake
Проекты с открытым исходным кодом
- Apache Qpid (система сообщений);
- Boost (набор C++ библиотек);
- Blender (программа 3D моделирования)[30];
- ReactOS (операционная система совместимая с Windows программами и драйверами);
- MySQL (система управления базами данных);
- KDE (среда рабочего стола и смежные проекты)[31];
- KiCad;
- FreeCAD;
- WebKit (веб движок);
- Hierarchical Data Format (иерархический формат данных).
Научно исследовательские проекты
Программное обеспечение, используемое в эксперименте ATLAS, создано с использованием CMake. Само программное обеспечение написано на C/C++ и Python[32].
Исследовательский институт во франции INRIA применил CMake в медицинском исследовании в проекте SOFA[англ.][33].
Компании и закрытые проекты
- Netflix (стриминговый сервис фильмов и сериалов)[34];
- Second Life (виртуальный мир с элементами социальной сети)[35].
Пример
Далее приведён пример простого «Hello, World!» проекта.
В отдельном каталоге создаём файл с названием — «CMakeLists.txt» со следующим кодом.
cmake_minimum_required(VERSION 3.16) # Выбираем минимальную необходимую версию cmake
set(PROJECT_NAME my_project) # Записываем имя в переменную
project(${PROJECT_NAME}) # Присваиваем имя проекту
add_executable( # Создаём цель (исполняемый файл) с именем проекта
${PROJECT_NAME} # Также, указываем файлы исходного кода
main.cpp # Добавлять заголовочные файлы нет необходимости
)
install( # Устанавливаем цель указав ключевое слово bin
TARGETS ${PROJECT_NAME} # Путь установки будет определён автоматически
RUNTIME DESTINATION bin # bin - binary (путь к исполняемым файлам)
)
В этом же каталоге создаём файл — «main.cpp» (исходный код C++).
# include <iostream>
int main()
{
std::cout << "Hello, World!" << std::endl;
return 0;
}
Помимо CMake, для сборки необходим базовый набор программ — любой компилятор С++ (clang++, g++) и система сборки (Ninja, Make). Далее для сборки необходимы выполнить ряд следующих команд (находясь в том же каталоге):
$ cmake . # Вызываем генерацию файлов сборки
$ cmake --build . # Собираем проект, на выходе получаем исполняемый файл
$ cmake --install . # По необходимости устанавливаем
Для команды установки могут потребоваться повышенные права доступа.
Чтобы получить более подробную информацию, воспользуйтесь командой help
.
$ cmake --help
$ cmake --help-command-list
$ cmake --help-command install
См. также
Примечания
- ↑ CMake 3.31.3 available for download (англ.) — 2024.
- ↑ CMake 3.31.0-rc3 is ready for testing (англ.) — 2024.
- ↑ The cmake Open Source Project on Open Hub: Languages Page — 2006.
- ↑ https://cmake.org/cmake/help/latest/manual/cmake-gui.1.html
- ↑ https://cmake.org/runningcmake
- ↑ 1 2 https://cmake.org/download/
- ↑ https://cmake.org/
- ↑ https://gitlab.kitware.com/cmake/cmake/blob/master/Copyright.txt
- ↑ The cmake Open Source Project on Open Hub: Licenses Page — 2006.
- ↑ FLOSS Weekly 111: CMake (англ.). podcast. TWiT Network.. Дата обращения: 19 января 2022.
- ↑ Перевод главы о CMake из книги «The Architecture of Open Source Applications» . rus-linux.net (28 августа 2012). Дата обращения: 19 января 2022.
- ↑ Глава о CMake из книги «The Architecture of Open Source Applications» (англ.). aosabook.org (2012). Дата обращения: 19 января 2022.
- ↑ 1 2 Александр Нойндорф (Alexander Neundorf). Why the KDE project switched to CMake — and how (англ.). lwn.net (21 июня 2006). Дата обращения: 19 января 2022.
- ↑ CMake documentation: IDE Integration Guide (англ.). cmake.org. Дата обращения: 26 января 2022.
- ↑ CMake documentation: cmake-file-api(7) (англ.). cmake.org. Дата обращения: 26 января 2022.
- ↑ CMake documentation: cmake-toolchains(7) (англ.). cmake.org. Дата обращения: 19 января 2022.
- ↑ Дэниел Пфайфер (Daniel Pfeifer). Effective CMake (англ.) (PDF). GitHub (19 мая 2017). Дата обращения: 19 января 2022.
- ↑ CMake documentation: cmake-buildsystem(7) — Object Libraries (англ.). cmake.org. Дата обращения: 19 января 2022.
- ↑ CMake documentation: target precompile headers (англ.). cmake.org. Дата обращения: 19 января 2022.
- ↑ CMake documentation: cmake-language(7) (англ.). cmake.org. Дата обращения: 19 января 2022.
- ↑ Андрей Седильник (Andrej Cedilnik). Cross-Platform Software Development Using CMake (англ.). linuxjournal (3 октября 2003). Дата обращения: 19 января 2022.
- ↑ CMake documentation: cmake-commands(7) ― add_executable (англ.). cmake.org. Дата обращения: 19 января 2022.
- ↑ CMake documentation: cmake-commands(7) ― add_library (англ.). cmake.org. Дата обращения: 19 января 2022.
- ↑ CMake documentation: cmake-commands(7) ― target_link_libraries (англ.). cmake.org. Дата обращения: 19 января 2022.
- ↑ CMake documentation: CMake 3.19 Release Notes (англ.). cmake.org. Дата обращения: 19 января 2022.
- ↑ CMake documentation: cmake-modules(7) (англ.). cmake.org. Дата обращения: 19 января 2022.
- ↑ CMake documentation: cmake-modules(7) — ExternalProject (англ.). cmake.org. Дата обращения: 19 января 2022.
- ↑ CMake:Packaging With CPack - KitwarePublic (англ.). GitLab. Дата обращения: 19 января 2022.
- ↑ CMake:CPackPackageGenerators - KitwarePublic (англ.). GitLab. Дата обращения: 19 января 2022.
- ↑ Blender wiki — Building Blender (англ.). blender.org. Дата обращения: 19 января 2022.
- ↑ KDE Adopts CMake (англ.). kitware.com. Дата обращения: 15 марта 2022.
- ↑ J. Elmsheuser, A. Krasznahorkay, E. Obreshkov, A. Undrus. Large Scale Software Building with CMake in ATLAS (англ.) (PDF). ЦЕРН. Дата обращения: 19 января 2022.
- ↑ Converting SOFA to CMake (англ.). kitware.com. Дата обращения: 15 марта 2022.
- ↑ CMake, CTest, and CDash at Netflix (англ.). kitware.com. Дата обращения: 15 марта 2022.
- ↑ Second Life Chooses CMake as its Build System (англ.). kitware.com. Дата обращения: 15 марта 2022.
Ссылки
- Официальный сайт
- Публикации
- Истории успеха
- Разработчики рассказывают о истории проекта CMake // Журнал «Открытые системы», 2007/03
- Что за штука CMake? // Журнал «Linux Format», #99 (12), Декабрь 2007 (wiki)
- Как использовать CMake в KDE4
- Статьи по CMake
- Почему KDE перешёл к использованию CMake (англ.)
- Программное обеспечение по алфавиту
- Программное обеспечение, разработанное в 2000 году
- Инструменты компиляции
- Автоматизация сборки
- Свободные системы автоматизации сборки
- Программное обеспечение с лицензией BSD
- Свободное программное обеспечение, написанное на Си
- Свободное программное обеспечение, написанное на C++
- Кроссплатформенное программное обеспечение