CMake: различия между версиями
[непроверенная версия] | [отпатрулированная версия] |
Dr64h (обсуждение | вклад) →Возможности: дополнение, источники, внутренние ссылки |
Alter73 (обсуждение | вклад) Новый логотип Метки: с мобильного устройства из мобильной версии через расширенный мобильный режим |
||
(не показаны 24 промежуточные версии 10 участников) | |||
Строка 1: | Строка 1: | ||
{{Карточка программы|состояние = активное |
{{Карточка программы |
||
| логотип = CMake logo.svg |
|||
| состояние = активное |
|||
'''CMake''' (<small>[[МФА]]</small> {{МФА2|ˈ|s|i|ː|m|e|ɪ|k}}; от {{lang-en|'''C'''ross-platform [[Make|'''M'''ake]]}} — {{s|«Кроссплатформенный Make»}}<ref> |
|||
{{cite web |
|||
|url = http://www.steveire.com/embracing-modern-cmake.pdf |
|||
|title = Embracing Modern CMake How to recognize and use modern CMake interfaces |
|||
|lang = en |
|||
|format = PDF |
|||
|access-date = 2022-04-04 |
|||
}} |
}} |
||
'''CMake''' (<small>[[МФА]]</small> {{МФА2|ˈ|s|i|ː|m|e|ɪ|k}}; от {{lang-en|cross-platform make}} — кроссплатформенный make<ref>{{cite web |
|||
</ref>) — это [[кроссплатформенность|кроссплатформенная]] [[утилита]], обладающая возможностями [[Автоматизация сборки|автоматизации сборки]] программного обеспечения из [[исходный код|исходного кода]]. Сам CMake не занимается непосредственно сборкой, а лишь генерирует файлы сборки из предварительно написанного [[Скрипт|скрипт-файла]] «<tt>CMakeLists.txt</tt>» и предоставляет простой единый интерфейс управления. Помимо этого, CMake способен автоматизировать процесс [[Установка программного обеспечения|установки]] и [[Система управления пакетами|пакетирования]]. |
|||
|url = http://www.steveire.com/embracing-modern-cmake.pdf |
|||
|title = Embracing Modern CMake How to recognize and use modern CMake interfaces |
|||
|lang = en |
|||
|format = PDF |
|||
|access-date = 2022-04-04 |
|||
|archive-date = 2022-01-20 |
|||
|archive-url = https://web.archive.org/web/20220120063923/http://www.steveire.com/embracing-modern-cmake.pdf |
|||
|deadlink = no |
|||
}}</ref>) — [[кроссплатформенность|кроссплатформенное]] программное средство [[Автоматизация сборки|автоматизации сборки]] программного обеспечения из [[исходный код|исходного кода]]. Не занимается непосредственно сборкой, а лишь генерирует файлы сборки из предварительно написанного файла сценария <tt>CMakeLists.txt</tt> и предоставляет простой единый интерфейс управления. Помимо этого, способно автоматизировать процесс [[Установка программного обеспечения|установки]] и [[Система управления пакетами|сборки пакетов]]. |
|||
Считается альтернативой распространённой в сообществе [[GNU]] системе [[Autotools]], разработанной на базе [[Perl]] и [[Макропроцессор m4|M4]], |
Считается альтернативой распространённой в сообществе [[GNU]] системе [[Autotools]], разработанной на базе [[Perl]] и [[Макропроцессор m4|M4]], основными недостатками которой считаются необходимость нетривиальных навыков для практического использования и несовместимость версий в ряде случаев. |
||
В сравнении с другой альтернативой Autotools |
В сравнении с другой альтернативой [[Autotools]] — основанной на [[Python]] системой [[SCons]] — является более быстродействующей, поскольку написана на [[Си (язык программирования)|Си]] и использует крайне простой [[Макрокоманда|макроязык]], но при этом SCons обладает большими возможностями по расширению. |
||
== История |
== История == |
||
Разработка CMake началась в [[1999|1999 |
Разработка CMake началась в [[1999|1999 году]] в ответ на потребность в кроссплатформенной системе сборки для {{iw|Инструментарий для исследования сегментации и регистрации|ITK|en|Insight Segmentation and Registration Toolkit}}<ref>{{cite web |
||
|url = http://twit.tv/floss111 |
|||
{{cite web |
|||
| |
|title = FLOSS Weekly 111: CMake |
||
| |
|lang = en |
||
| |
|website = podcast. TWiT Network. |
||
|access-date = 2022-01-19 |
|||
|website = podcast. TWiT Network. |
|||
| |
|archive-date = 2014-10-06 |
||
|archive-url = https://web.archive.org/web/20141006075004/http://twit.tv/floss111 |
|||
}} |
|||
|deadlink = no |
|||
</ref>. |
|||
}}</ref>, финансируемой [[Национальная библиотека медицины США|национальной библиотекой медицины США]] части {{iw|Visible Human Project}}. Задача по разработке была возложена на небольшую компанию {{iw|Kitware|Kitware|en|Kitware}}. На него повлияла более ранняя система pcmaker, созданная Кеном Мартином (''Ken Martin'') и другими разработчиками для поддержки инструментария визуализации ([[Visualization Toolkit|VTK]]). |
|||
{{cite web |
|||
|url = https://cmake.org/overview/ |
|||
|title = About CMake |
|||
|lang = en |
|||
|website = cmake.org |
|||
|access-date = 2022-03-15 |
|||
}} |
|||
</ref>. |
|||
В то время |
В то время обычным считалось использование [[Конфигурационный файл|конфигурационных сценариев]] и [[Makefile|make-файлов]] для сборки программных проектов на [[Unix-подобная операционная система|Unix-платформах]] и файлов проектов [[Visual Studio]] в среде [[Microsoft Windows|Windows]]. Такой подход к разработке вызывал огромное неудобство, например, добавление одного файла исходного кода в проект приводило к большим трудностям, так как для каждой платформы это приходилось делать по отдельности и совершенно разными методами. Очевидно, что разработчики нуждались в единой унифицированной системе сборки, не отнимающей лишнее время<ref>{{cite web |
||
|url = http://rus-linux.net/MyLDP/BOOKS/Architecture-Open-Source-Applications/Vol-1/cmake.html |
|||
{{cite web |
|||
| |
|title = Перевод главы о CMake из книги «The Architecture of Open Source Applications» |
||
|lang = ru |
|||
|title = Перевод главы о CMake из книги «The Architecture of Open Source Applications» |
|||
| |
|website = rus-linux.net |
||
| |
|date = 2012-08-28 |
||
|date |
|access-date = 2022-01-19 |
||
| |
|archive-date = 2021-05-07 |
||
|archive-url = https://web.archive.org/web/20210507164752/http://rus-linux.net/MyLDP/BOOKS/Architecture-Open-Source-Applications/Vol-1/cmake.html |
|||
}} |
|||
|deadlink = no |
|||
</ref><ref> |
|||
{{cite web |
}}</ref><ref>{{cite web |
||
|url = https://www.aosabook.org/en/cmake.html |
|url = https://www.aosabook.org/en/cmake.html |
||
|title = Глава о CMake из книги «The Architecture of Open Source Applications» |
|title = Глава о CMake из книги «The Architecture of Open Source Applications» |
||
|lang = en |
|lang = en |
||
|website = aosabook.org |
|website = aosabook.org |
||
|date = 2012 |
|date = 2012 |
||
|access-date = 2022-01-19 |
|access-date = 2022-01-19 |
||
|archive-date = 2022-04-07 |
|||
}} |
|||
|archive-url = https://web.archive.org/web/20220407132847/http://aosabook.org/en/cmake.html |
|||
</ref>. |
|||
|deadlink = no |
|||
}}</ref>. |
|||
== Возможности == |
== Возможности == |
||
Ключевой особенностью является возможность |
Ключевой особенностью является возможность размещать выходные данные компилятора (например, объектные файлы) вне [[Файловая система#Иерархия каталогов|дерева]] исходного кода. Это позволяет выполнять несколько вариаций сборок из одного и того же исходного кода, а также [[Кросс-компилятор#Кросс-компиляция с gcc|кросскомпиляцию]]. Такой подход разделения файлов исходного кода и файлов сборки даёт гарантию, что удаление каталога сборки не приведёт к удалению исходного кода. Однако сами пользователи не защищены от случайного удаления каталога с исходными файлами<ref name="KDE и переход на CMake">{{cite web |
||
|url = https://lwn.net/Articles/188693/ |
|||
{{cite web |
|||
|author = Alexander Neundorf |
|||
|url = https://lwn.net/Articles/188693/ |
|||
|title = Why the KDE project switched to CMake — and how |
|||
|author = Александр Нойндорф (Alexander Neundorf) |
|||
|lang = en |
|||
|title = Why the KDE project switched to CMake — and how |
|||
| |
|website = lwn.net |
||
| |
|date = 2006-06-21 |
||
|date |
|access-date = 2022-01-19 |
||
| |
|archive-date = 2021-11-20 |
||
|archive-url = https://web.archive.org/web/20211120010120/https://lwn.net/Articles/188693/ |
|||
}} |
|||
|deadlink = no |
|||
</ref>. |
|||
}}</ref>. |
|||
=== Настраиваемая структура проекта === |
=== Настраиваемая структура проекта === |
||
CMake может находить общесистемные и пользовательские каталоги исполняемых файлов, файлов конфигураций и библиотек. Эти местоположения хранятся в [[кэш]]е, который можно конфигурировать перед созданием целевых файлов сборки. CMake |
CMake может находить общесистемные и пользовательские каталоги исполняемых файлов, файлов конфигураций и библиотек. Эти местоположения хранятся в [[кэш]]е, который можно конфигурировать перед созданием целевых файлов сборки. CMake-кэш можно редактировать с помощью графического редактора, который поставляется вместе с CMake, либо в [[Интерфейс командной строки|командной строке]] с помощью команд CMake. |
||
Сложные иерархии каталогов проектов, рассчитанные на разные конфигурации, |
Сложные иерархии каталогов проектов, рассчитанные на разные конфигурации, сборка с разными библиотеками и инструментами также хорошо поддерживаются CMake. По сути CMake предоставляет возможность создавать подпроекты, собираемые перед сборкой основного проекта, что позволяет создавать цепочки зависимостей, собираемые в необходимой разработчику последовательности. |
||
=== Поддержка разных сред разработки === |
=== Поддержка разных сред разработки === |
||
CMake может создавать файлы проектов для нескольких популярных [[Интегрированная среда разработки| |
CMake может создавать файлы проектов для нескольких популярных [[Интегрированная среда разработки|интегрированных средств разработки]], в том числе [[Microsoft Visual Studio]], [[Xcode]] и [[Eclipse (среда разработки)|Eclipse CDT]]. |
||
Может создавать сценарии сборки для [[MSBuild]] и [[nmake]] в Windows, make на Unix-подобных системах, [[Ninja (система сборки)|Ninja]]. Для упрощения внедрения поддержки CMake в новые среды разработки используются файлы преднастройки <tt>CMakePresets.json</tt>. Среди сред, изначально поддерживающих CMake — [[CLion]], [[KDevelop]], [[Qt Creator]], [[Visual Studio]]. |
|||
Он также может создавать сценарии сборки для: |
|||
*[[MSBuild]] и [[make|Nmake]] в Windows; |
|||
*[[Make|Unix Make]] на Unix-подобных платформах, таких как [[Linux]], [[BSD]], [[macOS]] и [[Cygwin]]; |
|||
*А также [[Ninja (система сборки)|Ninja]], как на Windows, так и на Unix-подобных платформах. |
|||
Для упрощения внедрения поддержки CMake в новые ИСР, рекомендуется использовать файлы преднастройки «<tt>CMakePresets.json</tt>»<ref> |
|||
{{cite web |
|||
|url = https://cmake.org/cmake/help/latest/guide/ide-integration/index.html |
|||
|title = CMake documentation: IDE Integration Guide |
|||
|lang = en |
|||
|website = cmake.org |
|||
|access-date = 2022-01-26 |
|||
}} |
|||
</ref>, |
|||
для более удобного конфигурирования процесса сборки, а также «[[API|File API]]»<ref> |
|||
{{cite web |
|||
|url = https://cmake.org/cmake/help/latest/manual/cmake-file-api.7.html |
|||
|title = CMake documentation: cmake-file-api(7) |
|||
|lang = en |
|||
|website = cmake.org |
|||
|access-date = 2022-01-26 |
|||
}} |
|||
</ref>, |
|||
содержащий всю необходимую для ИСР информацию. |
|||
=== Поддержка компиляторов === |
=== Поддержка компиляторов === |
||
CMake позволяет определять свойства, которые компилятор должен поддерживать, чтобы скомпилировать целевую программу или библиотеку<ref> |
CMake позволяет определять свойства, которые компилятор должен поддерживать, чтобы скомпилировать целевую программу или библиотеку<ref>{{cite web |
||
|url = https://www.scivision.dev/cmake-compiler-language-feature-detect/ |
|||
{{cite web |
|||
| |
|title = CMake compiler feature detect |
||
| |
|lang = en |
||
| |
|website = scivision.dev |
||
| |
|date = 2020-11-15 |
||
|date |
|access-date = 2022-04-04 |
||
| |
|archive-date = 2022-01-22 |
||
|archive-url = https://web.archive.org/web/20220122005021/https://www.scivision.dev/cmake-compiler-language-feature-detect/ |
|||
}} |
|||
|deadlink = no |
|||
</ref>. |
|||
}}</ref>. |
|||
CMake поддерживает обширный список компиляторов |
CMake поддерживает обширный список компиляторов, в который входят в том числе [[Clang]] (включая Clang из [[Xcode]]), [[GNU Compiler Collection|GNU GCC]], [[Microsoft Visual C++|MSVC]], [[Oracle Solaris Studio|SunPro]], [[Intel C++ compiler|Intel C++]]. |
||
{{cite web |
|||
|url = https://cmake.org/cmake/help/latest/manual/cmake-compile-features.7.html#supported-compilers |
|||
|title = Supported Compilers |
|||
|lang = en |
|||
|website = CMake.org |
|||
|access-date = 2022-04-04 |
|||
}} |
|||
</ref>, |
|||
в который входят: |
|||
* [[Xcode|Apple Clang]]; |
|||
* [[Clang]]; |
|||
* [[GNU Compiler Collection|GNU GCC]]; |
|||
* [[Microsoft Visual C++|MSVC]]; |
|||
* [[Oracle Solaris Studio|SunPro]]; |
|||
* [[Intel C++ compiler|Intel C++]]. |
|||
== Процесс сборки == |
== Процесс сборки == |
||
Сборка программы или библиотеки с помощью CMake |
Сборка программы или библиотеки с помощью CMake представляет собой двухэтапный процесс. На первом этапе стандартные файлы сборки генерируются из файлов конфигурации (<tt>CMakeLists.txt</tt>), которые написаны на языке CMake. Затем задействуются системные инструменты сборки, такие как make, Ninja, используемые для непосредственной компиляции программ<ref name="KDE и переход на CMake" />. |
||
{{cite web |
|||
|url = https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html |
|||
|title = CMake documentation: cmake-toolchains(7) |
|||
|lang = en |
|||
|website = cmake.org |
|||
|access-date = 2022-01-19 |
|||
}} |
|||
</ref>. |
|||
Файлы сборки конфигурируются в зависимости от используемого генератора (например, генератор «Unix Makefiles» |
Файлы сборки конфигурируются в зависимости от используемого генератора (например, генератор «Unix Makefiles» — для make-фaйлов). Продвинутые пользователи могут создавать и включать свои собственные генераторы файлов Make для поддержки новых компиляторов и операционных систем. Сгенерированные файлы обычно помещаются (с помощью флага CMake) во внешний каталог, за пределами исходных файлов, например в каталог <tt>build</tt>. |
||
После сборки каждый проект в подкаталогах содержит <tt>CMakeCache.txt</tt> и каталог make-файлов, что помогает избежать или ускорить этап «перегенерации» в случае повторного запуска сборки<ref>{{cite web |
|||
|url = https://github.com/boostcon/cppnow_presentations_2017/blob/master/05-19-2017_friday/effective_cmake__daniel_pfeifer__cppnow_05-19-2017.pdf |
|||
{{cite web |
|||
|author = Daniel Pfeifer |
|||
|url = https://github.com/boostcon/cppnow_presentations_2017/blob/master/05-19-2017_friday/effective_cmake__daniel_pfeifer__cppnow_05-19-2017.pdf |
|||
|title = Effective CMake |
|||
|author = Дэниел Пфайфер (Daniel Pfeifer) |
|||
| |
|lang = en |
||
| |
|format = PDF |
||
| |
|website = [[GitHub]] |
||
| |
|date = 2017-05-19 |
||
|date |
|access-date = 2022-01-19 |
||
| |
|archive-date = 2022-01-19 |
||
|archive-url = https://web.archive.org/web/20220119174924/https://github.com/boostcon/cppnow_presentations_2017/blob/master/05-19-2017_friday/effective_cmake__daniel_pfeifer__cppnow_05-19-2017.pdf |
|||
}} |
|||
|deadlink = no |
|||
</ref>. |
|||
}}</ref>. |
|||
В зависимости от конфигурации <tt>CMakeLists.txt</tt> и выбранной цели файлы сборки могут создавать: |
|||
=== Типы целей сборки === |
|||
* [[Исполняемый файл|исполняемые файлы]]; |
|||
В зависимости от конфигурации <tt>CMakeLists.txt</tt> и выбранной цели, файлы сборки могут создавать: |
|||
* [[Разделяемая библиотека|разделяемые библиотеки]] (например, <tt>libxyz</tt>, <tt>xyz.dll</tt> и т. п.); |
|||
*[[Исполняемый файл|исполняемые файлы]]; |
|||
* [[Объектный модуль|библиотеки объектных файлов]]; |
|||
*[[Разделяемая библиотека|разделяемые библиотеки]] (например, <tt>libxyz</tt>, <tt>xyz.dll</tt> и т. п.); |
|||
* псевдоцели (включая псевдонимы). |
|||
*[[Объектный модуль|библиотеки объектных файлов]]; |
|||
*псевдо цели (включая псевдонимы). |
|||
CMake может создавать объектные файлы, которые могут быть связаны с исполняемыми |
CMake может создавать объектные файлы, которые могут быть связаны с исполняемыми программами или библиотеками, избегая [[Динамическая библиотека|динамического]] (во время выполнения) связывания, вместо этого используя статическое связывание. Это обеспечивает гибкость в настройке различных оптимизаций (зависимости сборки могут определяться автоматически). |
||
{{cite web |
|||
|url = https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html#object-libraries |
|||
|title = CMake documentation: cmake-buildsystem(7) — Object Libraries |
|||
|lang = en |
|||
|website = cmake.org |
|||
|access-date = 2022-01-19 |
|||
}} |
|||
</ref>. |
|||
Начиная с версии CMake 3.6 можно создавать предварительно скомпилированные [[Заголовочный файл|заголовочные файлы]]. |
|||
=== Предкомпилированные заголовочные файлы === |
|||
Начиная с версии CMake 3.6, можно создавать предварительно скомпилированные [[Заголовочный файл|заголовочные файлы]]<ref> |
|||
{{cite web |
|||
|url = https://cmake.org/cmake/help/git-stage/command/target_precompile_headers.html |
|||
|title = CMake documentation: target precompile headers |
|||
|lang = en |
|||
|website = cmake.org |
|||
|access-date = 2022-01-19 |
|||
}} |
|||
</ref>. |
|||
== Язык == |
== Язык == |
||
CMake имеет относительно простой [[Интерпретатор|интерпретируемый]] [[Императивное программирование|императивный]] [[Сценарный язык|язык сценариев]] |
CMake имеет относительно простой [[Интерпретатор|интерпретируемый]] [[Императивное программирование|императивный]] [[Сценарный язык|язык сценариев]], поддерживающий [[Переменная (программирование)|переменные]], [[Строковый тип#Операции|методы обработки строк]], [[Массив (тип данных)|массивы]], объявления [[Функция (программирование)|функций]] и [[макрос]]ов, включение [[Модульное программирование|модулей]] (импортирование). Команды языка CMake (или директивы) считываются CMake из файла <tt>CMakeLists.txt</tt>. В этом файле указываются исходные файлы и параметры сборки, которые CMake размещает в спецификации сборки проекта (например, в make-файле). Кроме того, файлы с приставкой <tt>.cmake</tt> могут содержать сценарии, используемые CMake. |
||
{{cite web |
|||
|url = https://cmake.org/cmake/help/latest/manual/cmake-language.7.html |
|||
|title = CMake documentation: cmake-language(7) |
|||
|lang = en |
|||
|website = cmake.org |
|||
|access-date = 2022-01-19 |
|||
}} |
|||
</ref>. |
|||
Аргументы команд разделены пробелами и могут содержать ключевые слова для разделения групп аргументов. Например, в команде: |
|||
=== Синтаксис команд === |
|||
Аргументы команд разделены пробелами и могут содержать ключевые слова, для разделения групп аргументов. Например, в команде |
|||
<syntaxhighlight lang=cmake> |
<syntaxhighlight lang=cmake> |
||
# Команда установки |
# Команда установки |
||
install(TARGETS ... # |
install(TARGETS ... # цели |
||
CONFIGURATIONS ... # |
CONFIGURATIONS ... # конфигурации (Debug, Release…) |
||
RUNTIME DESTINATION ...) # ( |
RUNTIME DESTINATION ...) # (исполняемый файл, MACOSX_BUNDLE, DLL) место_назначения |
||
</syntaxhighlight> |
</syntaxhighlight> |
||
ключевые слова |
ключевые слова — {{code|TARGETS}}, {{code|CONFIGURATIONS}} и {{code|RUNTIME DESTINATION}}. В данном случае {{code|TARGETS}} и {{code|CONFIGURATIONS}} служат разделителями между «целями» и «конфигурациями»<ref>{{cite web |
||
|url = https://www.linuxjournal.com/article/6700 |
|||
{{cite web |
|||
|author = Андрей Седильник (Andrej Cedilnik) |
|||
|url = https://www.linuxjournal.com/article/6700 |
|||
|title = Cross-Platform Software Development Using CMake |
|||
|author = Андрей Седильник (Andrej Cedilnik) |
|||
|lang = en |
|||
|title = Cross-Platform Software Development Using CMake |
|||
| |
|website = Linux Journal |
||
| |
|date = 2003-10-03 |
||
|date |
|access-date = 2022-01-19 |
||
| |
|archive-date = 2022-01-19 |
||
|archive-url = https://web.archive.org/web/20220119191623/https://www.linuxjournal.com/article/6700 |
|||
}} |
|||
|deadlink = no |
|||
</ref>. |
|||
}}</ref>. |
|||
Примеры команд CMake, которые определяют цели и их зависимости<ref> |
Примеры команд CMake, которые определяют цели и их зависимости<ref>{{cite web |
||
|url = https://cmake.org/cmake/help/latest/command/add_executable.html |
|||
{{cite web |
|||
| |
|title = CMake documentation: cmake-commands(7) ― add_executable |
||
|lang = en |
|||
|title = CMake documentation: cmake-commands(7) ― add_executable |
|||
| |
|website = cmake.org |
||
| |
|access-date = 2022-01-19 |
||
| |
|archive-date = 2022-01-19 |
||
|archive-url = https://web.archive.org/web/20220119191622/https://cmake.org/cmake/help/latest/command/add_executable.html |
|||
}} |
|||
|deadlink = no |
|||
</ref><ref> |
|||
{{cite web |
}}</ref><ref>{{cite web |
||
|url = https://cmake.org/cmake/help/latest/command/add_library.html |
|url = https://cmake.org/cmake/help/latest/command/add_library.html |
||
|title = CMake documentation: cmake-commands(7) ― add_library |
|title = CMake documentation: cmake-commands(7) ― add_library |
||
|lang = en |
|lang = en |
||
|website = cmake.org |
|website = cmake.org |
||
|access-date = 2022-01-19 |
|access-date = 2022-01-19 |
||
|archive-date = 2022-01-19 |
|||
}} |
|||
|archive-url = https://web.archive.org/web/20220119191643/https://cmake.org/cmake/help/latest/command/add_library.html |
|||
</ref><ref> |
|||
|deadlink = no |
|||
{{cite web |
|||
}}</ref><ref>{{cite web |
|||
|url = https://cmake.org/cmake/help/latest/command/target_link_libraries.html?highlight=target_link_libraries |
|||
| |
|url = https://cmake.org/cmake/help/latest/command/target_link_libraries.html?highlight=target_link_libraries |
||
|title = CMake documentation: cmake-commands(7) ― target_link_libraries |
|||
|lang = en |
|||
| |
|lang = en |
||
|website = cmake.org |
|||
|access-date = 2022-01-19 |
|||
|access-date = 2022-01-19 |
|||
}} |
|||
|archive-date = 2022-01-19 |
|||
</ref>: |
|||
|archive-url = https://web.archive.org/web/20220119191632/https://cmake.org/cmake/help/latest/command/target_link_libraries.html?highlight=target_link_libraries |
|||
* {{code|add_executable(...)|lang=cmake}} — определяет цель (исполняемый файл, например <tt>.exe</tt>, зависит от целевой платформы); |
|||
|deadlink = no |
|||
* {{code|add_library(...)|lang=cmake}} — определяет цель (библиотеку, например <tt>.so</tt> или <tt>.dll</tt>); |
|||
}}</ref>: |
|||
* {{code|target_link_libraries(...)|lang=cmake}} — определяет зависимости указанной цели. |
|||
* {{code|add_executable(...)|lang=cmake}} — определяет цель (исполняемый файл, например <tt>.exe</tt>, зависит от целевой платформы); |
|||
* {{code|add_library(...)|lang=cmake}} — определяет цель (библиотеку, например <tt>.so</tt> или <tt>.dll</tt>); |
|||
=== Поддержка JSON === |
|||
* {{code|target_link_libraries(...)|lang=cmake}} — определяет зависимости указанной цели. |
|||
CMake поддерживает извлечение значений данных в переменные из строк [[JSON]] (начиная с версии 3.19)<ref> |
|||
CMake поддерживает извлечение значений данных в переменные из строк [[JSON]] (начиная с версии 3.19)<ref>{{cite web |
|||
{{cite web |
|||
|url = https://cmake.org/cmake/help/v3.19/release/3.19.html |
|url = https://cmake.org/cmake/help/v3.19/release/3.19.html |
||
|title = CMake documentation: CMake 3.19 Release Notes |
|title = CMake documentation: CMake 3.19 Release Notes |
||
|lang = en |
|lang = en |
||
|website = cmake.org |
|website = cmake.org |
||
|access-date = 2022-01-19 |
|access-date = 2022-01-19 |
||
|archive-date = 2022-04-29 |
|||
}} |
|||
|archive-url = https://web.archive.org/web/20220429152454/https://cmake.org/cmake/help/v3.19/release/3.19.html |
|||
</ref>. |
|||
|deadlink = no |
|||
}}</ref>. |
|||
== Модули и инструменты == |
== Модули и инструменты == |
||
CMake поставляется с большим количеством модулей и инструментов |
CMake поставляется с большим количеством модулей и инструментов <tt>.cmake</tt>. Они облегчают такую работу, как поиск зависимостей (как встроенных, так и внешних, например, модули <tt>FindXYZ</tt>), инструменты для тестирования исполняемых файлов, упаковка (модуль <tt>CPack</tt> и команда <tt>cpack</tt>) и управление зависимостями от внешних проектов (модуль <tt>ExternalProject</tt>)<ref>{{cite web |
||
|url = https://cmake.org/cmake/help/latest/manual/cmake-modules.7.html |
|||
{{cite web |
|||
| |
|title = CMake documentation: cmake-modules(7) |
||
| |
|lang = en |
||
| |
|website = cmake.org |
||
| |
|access-date = 2022-01-19 |
||
| |
|archive-date = 2021-12-09 |
||
|archive-url = https://web.archive.org/web/20211209090213/https://cmake.org/cmake/help/latest/manual/cmake-modules.7.html |
|||
}} |
|||
|deadlink = no |
|||
</ref><ref> |
|||
{{cite web |
}}</ref><ref>{{cite web |
||
|url = https://cmake.org/cmake/help/latest/module/ExternalProject.html |
|url = https://cmake.org/cmake/help/latest/module/ExternalProject.html |
||
|title = CMake documentation: cmake-modules(7) — ExternalProject |
|title = CMake documentation: cmake-modules(7) — ExternalProject |
||
|lang = en |
|lang = en |
||
|website = cmake.org |
|website = cmake.org |
||
|access-date = 2022-01-19 |
|access-date = 2022-01-19 |
||
|archive-date = 2022-02-21 |
|||
}} |
|||
|archive-url = https://web.archive.org/web/20220221083709/https://cmake.org/cmake/help/latest/module/ExternalProject.html |
|||
</ref>: |
|||
|deadlink = no |
|||
* '''ctest''' — используется для тестирования целей, заданных в <tt>CMakeLists.txt</tt>; |
|||
}}</ref>: |
|||
* '''ccmake''' и '''cmake-gui''' — настраивает и обновляет переменные конфигурации, предназначенные для целевой системы сборки; |
|||
* '''ctest''' — используется для тестирования целей, заданных в <tt>CMakeLists.txt</tt>; |
|||
* '''cpack''' — помогает упаковывать и устанавливать программное обеспечение. |
|||
* '''ccmake''' и '''cmake-gui''' — настраивает и обновляет переменные конфигурации, предназначенные для целевой системы сборки; |
|||
* '''cpack''' — помогает упаковывать и устанавливать программное обеспечение. |
|||
Начиная с версии 2.4.2<ref>{{Cite web |
|||
|url = https://gitlab.kitware.com/cmake/community/-/wikis/doc/cpack/Packaging-With-CPack |
|||
|title = CMake:Packaging With CPack - KitwarePublic |
|||
|lang = en |
|||
|website = [[GitLab]] |
|||
|accessdate = 2022-01-19 |
|||
|archive-date = 2022-01-19 |
|||
|archive-url = https://web.archive.org/web/20220119214524/https://gitlab.kitware.com/cmake/community/-/wikis/doc/cpack/Packaging-With-CPack |
|||
|deadlink = no |
|||
}}</ref> |
|||
в состав CMake включены система автоматизированной сборки пакетов программного обеспечения [[CPack]] и модуль CMake для взаимодействия с ней. Система позволяет создавать пакеты программного обеспечения для популярных [[Система управления пакетами|пакетных менеджеров]] ([[Deb (формат файлов)|DEB]], [[RPM]], [[DMG (формат)|DMG]]), средства [[Установка программного обеспечения|установки программного обеспечения]] ([[Nullsoft Scriptable Install System|NSIS]] для [[Windows|Microsoft Windows]], Qt Installer Framework для систем, работающих с [[Qt]]), а также архивы со сборкой ([[TGZ]], [[Bzip2|TBZ2]], [[ZIP]], [[Самораспаковывающийся архив|самораспаковывающийся TGZ]])<ref>{{Cite web |
|||
|url = https://gitlab.kitware.com/cmake/community/-/wikis/doc/cpack/PackageGenerators |
|||
|title = CMake:CPackPackageGenerators - KitwarePublic |
|||
|lang = en |
|||
|website = [[GitLab]] |
|||
|accessdate = 2022-01-19 |
|||
|archive-date = 2022-01-19 |
|||
|archive-url = https://web.archive.org/web/20220119214529/https://gitlab.kitware.com/cmake/community/-/wikis/doc/cpack/PackageGenerators |
|||
|deadlink = no |
|||
}}</ref>. |
|||
== Распространение == |
|||
=== CPack === |
|||
Среди проектов с открытым исходным кодом, использующих CMake — [[Boost]], [[Blender]], [[ReactOS]], [[MySQL]], [[KDE]], [[FreeCAD]], [[WebKit]]. Среди закрытых проектов, собираемых с использованием CMake — программное обеспечение [[Эксперимент ATLAS|эксперимента ATLAS]]<ref>{{Cite web |
|||
{{основная статья|CPack}} |
|||
|url = https://cds.cern.ch/record/2243765/files/ATL-SOFT-PROC-2017-033.pdf |
|||
Начиная с версии 2.4.2<ref> |
|||
|author = J. Elmsheuser, A. Krasznahorkay, E. Obreshkov, A. Undrus |
|||
{{Cite web |
|||
|title = Large Scale Software Building with CMake in ATLAS |
|||
|url = https://gitlab.kitware.com/cmake/community/-/wikis/doc/cpack/Packaging-With-CPack |
|||
| |
|lang = en |
||
| |
|format = PDF |
||
|website = [[ |
|website = [[ЦЕРН]] |
||
|accessdate = 2022-01-19 |
|accessdate = 2022-01-19 |
||
|archive-date = 2021-11-10 |
|||
}} |
|||
|archive-url = https://web.archive.org/web/20211110134705/https://cds.cern.ch/record/2243765/files/ATL-SOFT-PROC-2017-033.pdf |
|||
</ref>, |
|||
|deadlink = no |
|||
в состав CMake включены система автоматизированной сборки пакетов программного обеспечения [[CPack]] и модуль CMake для взаимодействия с ней. Система позволяет создавать пакеты программного обеспечения для популярных [[Система управления пакетами|пакетных менеджеров]] ([[Deb (формат файлов)|DEB]], [[RPM]], [[DMG (формат)|DMG]]), средства [[Установка программного обеспечения|установки программного обеспечения]] ([[Nullsoft Scriptable Install System|NSIS]] для [[Windows|Microsoft Windows]]), а также архивы со сборкой ([[TGZ]], [[Bzip2|TBZ2]], [[ZIP]], [[Самораспаковывающийся архив|самораспаковывающийся TGZ]])<ref> |
|||
}}</ref>, медицинский проект {{iw|Simulation Open Framework Architecture|SOFA|en|Simulation Open Framework Architecture}}<ref>{{Cite web |
|||
{{Cite web |
|||
|url = https:// |
|url = https://www.kitware.com/converting-sofa-to-cmake/ |
||
|title = |
|title = Converting SOFA to CMake |
||
|lang = en |
|lang = en |
||
|website = |
|website = kitware.com |
||
|accessdate = 2022- |
|accessdate = 2022-03-15 |
||
|archive-date = 2022-03-14 |
|||
}} |
|||
|archive-url = https://web.archive.org/web/20220314230410/https://www.kitware.com/converting-sofa-to-cmake/ |
|||
</ref>. |
|||
|deadlink = no |
|||
}}</ref>, внутренние системы [[Netflix]]<ref>{{Cite web |
|||
== Программные проекты использующие CMake == |
|||
|url = https://www.kitware.com/cmake-ctest-and-cdash-at-netflix/ |
|||
|title = CMake, CTest, and CDash at Netflix |
|||
=== Проекты с открытым исходным кодом === |
|||
|lang = en |
|||
* [[Apache Qpid]] (система сообщений); |
|||
|website = kitware.com |
|||
* [[Boost]] (набор C++ библиотек); |
|||
|accessdate = 2022-03-15 |
|||
* [[Blender]] (программа 3D моделирования)<ref> |
|||
|archive-date = 2022-03-14 |
|||
{{Cite web |
|||
|archive-url = https://web.archive.org/web/20220314231804/https://www.kitware.com/cmake-ctest-and-cdash-at-netflix/ |
|||
|url = https://wiki.blender.org/wiki/Building_Blender |
|||
|deadlink = no |
|||
|title = Blender wiki — Building Blender |
|||
}}</ref> и [[Second Life]]<ref>{{Cite web |
|||
|lang = en |
|||
|url = https://www.kitware.com/second-life-chooses-cmake-as-its-build-system/ |
|||
|website = blender.org |
|||
|title = Second Life Chooses CMake as its Build System |
|||
|accessdate = 2022-01-19 |
|||
|lang = en |
|||
}} |
|||
|website = kitware.com |
|||
</ref>; |
|||
|accessdate = 2022-03-15 |
|||
* [[ReactOS]] (операционная система совместимая с [[Windows]] программами и [[драйвер]]ами); |
|||
|archive-date = 2022-03-14 |
|||
* [[MySQL]] (система управления базами данных); |
|||
|archive-url = https://web.archive.org/web/20220314232003/https://www.kitware.com/second-life-chooses-cmake-as-its-build-system/ |
|||
* [[KDE]] (среда рабочего стола и смежные проекты)<ref> |
|||
|deadlink = no |
|||
{{Cite web |
|||
}}</ref>. |
|||
|url = https://www.kitware.com/kde-adopts-cmake/ |
|||
|title = KDE Adopts CMake |
|||
|lang = en |
|||
|website = kitware.com |
|||
|accessdate = 2022-03-15 |
|||
}} |
|||
</ref>; |
|||
* [[KiCad]] ([[САПР]]); |
|||
* [[FreeCAD]] (САПР); |
|||
* [[WebKit]] (веб движок); |
|||
* [[Hierarchical Data Format]] (иерархический формат данных). |
|||
=== Научно исследовательские проекты === |
|||
Программное обеспечение, используемое в [[Эксперимент ATLAS|эксперименте ATLAS]], создано с использованием CMake. Само программное обеспечение написано на C/C++ и Python<ref> |
|||
{{Cite web |
|||
|url = https://cds.cern.ch/record/2243765/files/ATL-SOFT-PROC-2017-033.pdf |
|||
|author = J. Elmsheuser, A. Krasznahorkay, E. Obreshkov, A. Undrus |
|||
|title = Large Scale Software Building with CMake in ATLAS |
|||
|lang = en |
|||
|format = PDF |
|||
|website = [[ЦЕРН]] |
|||
|accessdate = 2022-01-19 |
|||
}} |
|||
</ref>. |
|||
Исследовательский институт во франции [[INRIA]] применил CMake в медицинском исследовании в проекте {{iw|Simulation Open Framework Architecture|SOFA|en|Simulation Open Framework Architecture}}<ref> |
|||
{{Cite web |
|||
|url = https://www.kitware.com/converting-sofa-to-cmake/ |
|||
|title = Converting SOFA to CMake |
|||
|lang = en |
|||
|website = kitware.com |
|||
|accessdate = 2022-03-15 |
|||
}} |
|||
</ref>. |
|||
=== Компании и проекты с закрытым кодом === |
|||
* [[Netflix]] (стриминговый сервис фильмов и сериалов)<ref> |
|||
{{Cite web |
|||
|url = https://www.kitware.com/cmake-ctest-and-cdash-at-netflix/ |
|||
|title = CMake, CTest, and CDash at Netflix |
|||
|lang = en |
|||
|website = kitware.com |
|||
|accessdate = 2022-03-15 |
|||
}} |
|||
</ref>; |
|||
* [[Second Life]] (виртуальный мир с элементами социальной сети)<ref> |
|||
{{Cite web |
|||
|url = https://www.kitware.com/second-life-chooses-cmake-as-its-build-system/ |
|||
|title = Second Life Chooses CMake as its Build System |
|||
|lang = en |
|||
|website = kitware.com |
|||
|accessdate = 2022-03-15 |
|||
}} |
|||
</ref>. |
|||
== Пример == |
== Пример == |
||
Проект «[[Hello, World!]]» на языке CMake: |
|||
В отдельном каталоге создаём файл с названием — «<tt>CMakeLists.txt</tt>» со следующим кодом. |
|||
<syntaxhighlight lang="cmake" line> |
<syntaxhighlight lang="cmake" line> |
||
# Файл — «CMakeLists.txt» |
|||
cmake_minimum_required(VERSION 3.16) # Выбираем минимальную необходимую версию cmake |
cmake_minimum_required(VERSION 3.16) # Выбираем минимальную необходимую версию cmake |
||
project(my_project) # Присваиваем имя проекту |
|||
project(${PROJECT_NAME}) # Присваиваем имя проекту |
|||
add_executable( # Создаём цель (исполняемый файл) |
add_executable( # Создаём цель (исполняемый файл) |
||
${PROJECT_NAME} # |
${PROJECT_NAME} # Имя файла |
||
main.cpp # |
main.cpp # Список файлов исходного кода |
||
) |
) |
||
Строка 392: | Строка 291: | ||
# "/usr/local" + "/bin" |
# "/usr/local" + "/bin" |
||
</syntaxhighlight> |
</syntaxhighlight> |
||
В этом же каталоге создаём файл — «<tt>main.cpp»</tt> (исходный код [[C++]]). |
|||
<syntaxhighlight lang="C++" line> |
<syntaxhighlight lang="C++" line> |
||
// файл — «main.cpp» |
|||
# include <iostream> |
# include <iostream> |
||
Строка 402: | Строка 303: | ||
} |
} |
||
</syntaxhighlight> |
</syntaxhighlight> |
||
Помимо CMake, для сборки необходим базовый набор программ — любой [[компилятор]] С++ ([[Clang|clang++]], [[GNU Compiler Collection|g++]]) и система сборки ([[Ninja (система сборки)|Ninja]], [[Make]]). |
|||
Далее для сборки необходимы выполнить ряд следующих команд (находясь в том же каталоге): |
|||
<syntaxhighlight lang="console"> |
|||
$ cmake . # Вызываем генерацию файлов сборки |
|||
$ cmake --build . # Собираем проект, на выходе получаем исполняемый файл |
|||
$ cmake --install . # По необходимости устанавливаем |
|||
</syntaxhighlight> |
|||
Для команды установки могут потребоваться [[Права доступа|повышенные права доступа]]. |
|||
Сборка осуществляется посредством следующих команд в каталоге с файлами: |
|||
Чтобы получить более подробную информацию, воспользуйтесь командой {{code|help}}. |
|||
<syntaxhighlight lang=" |
<syntaxhighlight lang="shell"> |
||
cmake . # Вызываем генерацию файлов сборки |
|||
$ cmake --help |
|||
cmake --build . # Собираем цель, на выходе получаем исполняемый файл |
|||
$ cmake --help-command-list |
|||
cmake --install . # По необходимости устанавливаем |
|||
$ cmake --help-command install |
|||
</syntaxhighlight> |
</syntaxhighlight> |
||
При этом есть возможность получить справочную информацию об отдельном элементе языка CMake и его команд. |
|||
== См. также == |
|||
<syntaxhighlight lang="shell"> |
|||
* [[Автоматизация сборки]] |
|||
cmake --help |
|||
* [[Make]] |
|||
cmake --help-command-list |
|||
* [[Ninja (система сборки)|Ninja]] |
|||
cmake --help-command install |
|||
* [[Autotools]] |
|||
</syntaxhighlight> |
|||
* [[SCons]] |
|||
* [[Meson (система сборки)|Meson]] |
|||
* [[Premake]] |
|||
== Примечания == |
== Примечания == |
||
Строка 435: | Строка 326: | ||
}} |
}} |
||
* [http://www.cmake.org/ Официальный сайт] |
* [http://www.cmake.org/ Официальный сайт] |
||
* [https://cmake.org/publications/ Публикации] |
|||
* [https://cmake.org/success/ Истории успеха] |
|||
* [http://www.osp.ru/os/2007/03/4158385/ Разработчики рассказывают о истории проекта CMake] // Журнал «Открытые системы», 2007/03 |
* [http://www.osp.ru/os/2007/03/4158385/ Разработчики рассказывают о истории проекта CMake] // Журнал «Открытые системы», 2007/03 |
||
* [http://wiki.linuxformat.ru/wiki/LXF99:CMake Что за штука CMake?] // Журнал «Linux Format», #99 (12), Декабрь 2007 (wiki) |
* [http://wiki.linuxformat.ru/wiki/LXF99:CMake Что за штука CMake?] // Журнал «Linux Format», #99 (12), Декабрь 2007 (wiki) |
Текущая версия от 16:13, 25 августа 2024
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 — кроссплатформенный make[10]) — кроссплатформенное программное средство автоматизации сборки программного обеспечения из исходного кода. Не занимается непосредственно сборкой, а лишь генерирует файлы сборки из предварительно написанного файла сценария CMakeLists.txt и предоставляет простой единый интерфейс управления. Помимо этого, способно автоматизировать процесс установки и сборки пакетов.
Считается альтернативой распространённой в сообществе GNU системе Autotools, разработанной на базе Perl и M4, основными недостатками которой считаются необходимость нетривиальных навыков для практического использования и несовместимость версий в ряде случаев.
В сравнении с другой альтернативой Autotools — основанной на Python системой SCons — является более быстродействующей, поскольку написана на Си и использует крайне простой макроязык, но при этом SCons обладает большими возможностями по расширению.
История
[править | править код]Разработка CMake началась в 1999 году в ответ на потребность в кроссплатформенной системе сборки для ITK[англ.][11], финансируемой национальной библиотекой медицины США части Visible Human Project[англ.]. Задача по разработке была возложена на небольшую компанию Kitware[англ.]. На него повлияла более ранняя система pcmaker, созданная Кеном Мартином (Ken Martin) и другими разработчиками для поддержки инструментария визуализации (VTK).
В то время обычным считалось использование конфигурационных сценариев и make-файлов для сборки программных проектов на Unix-платформах и файлов проектов Visual Studio в среде Windows. Такой подход к разработке вызывал огромное неудобство, например, добавление одного файла исходного кода в проект приводило к большим трудностям, так как для каждой платформы это приходилось делать по отдельности и совершенно разными методами. Очевидно, что разработчики нуждались в единой унифицированной системе сборки, не отнимающей лишнее время[12][13].
Возможности
[править | править код]Ключевой особенностью является возможность размещать выходные данные компилятора (например, объектные файлы) вне дерева исходного кода. Это позволяет выполнять несколько вариаций сборок из одного и того же исходного кода, а также кросскомпиляцию. Такой подход разделения файлов исходного кода и файлов сборки даёт гарантию, что удаление каталога сборки не приведёт к удалению исходного кода. Однако сами пользователи не защищены от случайного удаления каталога с исходными файлами[14].
Настраиваемая структура проекта
[править | править код]CMake может находить общесистемные и пользовательские каталоги исполняемых файлов, файлов конфигураций и библиотек. Эти местоположения хранятся в кэше, который можно конфигурировать перед созданием целевых файлов сборки. CMake-кэш можно редактировать с помощью графического редактора, который поставляется вместе с CMake, либо в командной строке с помощью команд CMake.
Сложные иерархии каталогов проектов, рассчитанные на разные конфигурации, сборка с разными библиотеками и инструментами также хорошо поддерживаются CMake. По сути CMake предоставляет возможность создавать подпроекты, собираемые перед сборкой основного проекта, что позволяет создавать цепочки зависимостей, собираемые в необходимой разработчику последовательности.
Поддержка разных сред разработки
[править | править код]CMake может создавать файлы проектов для нескольких популярных интегрированных средств разработки, в том числе Microsoft Visual Studio, Xcode и Eclipse CDT.
Может создавать сценарии сборки для MSBuild и nmake в Windows, make на Unix-подобных системах, Ninja. Для упрощения внедрения поддержки CMake в новые среды разработки используются файлы преднастройки CMakePresets.json. Среди сред, изначально поддерживающих CMake — CLion, KDevelop, Qt Creator, Visual Studio.
Поддержка компиляторов
[править | править код]CMake позволяет определять свойства, которые компилятор должен поддерживать, чтобы скомпилировать целевую программу или библиотеку[15].
CMake поддерживает обширный список компиляторов, в который входят в том числе Clang (включая Clang из Xcode), GNU GCC, MSVC, SunPro, Intel C++.
Процесс сборки
[править | править код]Сборка программы или библиотеки с помощью CMake представляет собой двухэтапный процесс. На первом этапе стандартные файлы сборки генерируются из файлов конфигурации (CMakeLists.txt), которые написаны на языке CMake. Затем задействуются системные инструменты сборки, такие как make, Ninja, используемые для непосредственной компиляции программ[14].
Файлы сборки конфигурируются в зависимости от используемого генератора (например, генератор «Unix Makefiles» — для make-фaйлов). Продвинутые пользователи могут создавать и включать свои собственные генераторы файлов Make для поддержки новых компиляторов и операционных систем. Сгенерированные файлы обычно помещаются (с помощью флага CMake) во внешний каталог, за пределами исходных файлов, например в каталог build.
После сборки каждый проект в подкаталогах содержит CMakeCache.txt и каталог make-файлов, что помогает избежать или ускорить этап «перегенерации» в случае повторного запуска сборки[16].
В зависимости от конфигурации CMakeLists.txt и выбранной цели файлы сборки могут создавать:
- исполняемые файлы;
- разделяемые библиотеки (например, libxyz, xyz.dll и т. п.);
- библиотеки объектных файлов;
- псевдоцели (включая псевдонимы).
CMake может создавать объектные файлы, которые могут быть связаны с исполняемыми программами или библиотеками, избегая динамического (во время выполнения) связывания, вместо этого используя статическое связывание. Это обеспечивает гибкость в настройке различных оптимизаций (зависимости сборки могут определяться автоматически).
Начиная с версии CMake 3.6 можно создавать предварительно скомпилированные заголовочные файлы.
Язык
[править | править код]CMake имеет относительно простой интерпретируемый императивный язык сценариев, поддерживающий переменные, методы обработки строк, массивы, объявления функций и макросов, включение модулей (импортирование). Команды языка CMake (или директивы) считываются CMake из файла CMakeLists.txt. В этом файле указываются исходные файлы и параметры сборки, которые CMake размещает в спецификации сборки проекта (например, в make-файле). Кроме того, файлы с приставкой .cmake могут содержать сценарии, используемые CMake.
Аргументы команд разделены пробелами и могут содержать ключевые слова для разделения групп аргументов. Например, в команде:
# Команда установки
install(TARGETS ... # цели
CONFIGURATIONS ... # конфигурации (Debug, Release…)
RUNTIME DESTINATION ...) # (исполняемый файл, MACOSX_BUNDLE, DLL) место_назначения
ключевые слова — TARGETS
, CONFIGURATIONS
и RUNTIME DESTINATION
. В данном случае TARGETS
и CONFIGURATIONS
служат разделителями между «целями» и «конфигурациями»[17].
Примеры команд CMake, которые определяют цели и их зависимости[18][19][20]:
add_executable(...)
— определяет цель (исполняемый файл, например .exe, зависит от целевой платформы);add_library(...)
— определяет цель (библиотеку, например .so или .dll);target_link_libraries(...)
— определяет зависимости указанной цели.
CMake поддерживает извлечение значений данных в переменные из строк JSON (начиная с версии 3.19)[21].
Модули и инструменты
[править | править код]CMake поставляется с большим количеством модулей и инструментов .cmake. Они облегчают такую работу, как поиск зависимостей (как встроенных, так и внешних, например, модули FindXYZ), инструменты для тестирования исполняемых файлов, упаковка (модуль CPack и команда cpack) и управление зависимостями от внешних проектов (модуль ExternalProject)[22][23]:
- ctest — используется для тестирования целей, заданных в CMakeLists.txt;
- ccmake и cmake-gui — настраивает и обновляет переменные конфигурации, предназначенные для целевой системы сборки;
- cpack — помогает упаковывать и устанавливать программное обеспечение.
Начиная с версии 2.4.2[24] в состав CMake включены система автоматизированной сборки пакетов программного обеспечения CPack и модуль CMake для взаимодействия с ней. Система позволяет создавать пакеты программного обеспечения для популярных пакетных менеджеров (DEB, RPM, DMG), средства установки программного обеспечения (NSIS для Microsoft Windows, Qt Installer Framework для систем, работающих с Qt), а также архивы со сборкой (TGZ, TBZ2, ZIP, самораспаковывающийся TGZ)[25].
Распространение
[править | править код]Среди проектов с открытым исходным кодом, использующих CMake — Boost, Blender, ReactOS, MySQL, KDE, FreeCAD, WebKit. Среди закрытых проектов, собираемых с использованием CMake — программное обеспечение эксперимента ATLAS[26], медицинский проект SOFA[англ.][27], внутренние системы Netflix[28] и Second Life[29].
Пример
[править | править код]Проект «Hello, World!» на языке CMake:
# Файл — «CMakeLists.txt»
cmake_minimum_required(VERSION 3.16) # Выбираем минимальную необходимую версию cmake
project(my_project) # Присваиваем имя проекту
add_executable( # Создаём цель (исполняемый файл)
${PROJECT_NAME} # Имя файла
main.cpp # Список файлов исходного кода
)
install( # Указываем цель и путь установки
TARGETS ${PROJECT_NAME} # Путь прибавляется к префиксу
RUNTIME DESTINATION bin # bin - binary (путь к исполняемым файлам)
) # Стандартный префикс для UNIX систем
# "/usr/local" + "/bin"
// файл — «main.cpp»
# include <iostream>
int main()
{
std::cout << "Hello, World!" << std::endl;
return 0;
}
Сборка осуществляется посредством следующих команд в каталоге с файлами:
cmake . # Вызываем генерацию файлов сборки
cmake --build . # Собираем цель, на выходе получаем исполняемый файл
cmake --install . # По необходимости устанавливаем
При этом есть возможность получить справочную информацию об отдельном элементе языка CMake и его команд.
cmake --help
cmake --help-command-list
cmake --help-command install
Примечания
[править | править код]- ↑ CMake 3.31.2 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.
- ↑ Embracing Modern CMake How to recognize and use modern CMake interfaces (англ.) (PDF). Дата обращения: 4 апреля 2022. Архивировано 20 января 2022 года.
- ↑ FLOSS Weekly 111: CMake (англ.). podcast. TWiT Network.. Дата обращения: 19 января 2022. Архивировано 6 октября 2014 года.
- ↑ Перевод главы о CMake из книги «The Architecture of Open Source Applications» . rus-linux.net (28 августа 2012). Дата обращения: 19 января 2022. Архивировано 7 мая 2021 года.
- ↑ Глава о CMake из книги «The Architecture of Open Source Applications» (англ.). aosabook.org (2012). Дата обращения: 19 января 2022. Архивировано 7 апреля 2022 года.
- ↑ 1 2 Alexander Neundorf. Why the KDE project switched to CMake — and how (англ.). lwn.net (21 июня 2006). Дата обращения: 19 января 2022. Архивировано 20 ноября 2021 года.
- ↑ CMake compiler feature detect (англ.). scivision.dev (15 ноября 2020). Дата обращения: 4 апреля 2022. Архивировано 22 января 2022 года.
- ↑ Daniel Pfeifer. Effective CMake (англ.) (PDF). GitHub (19 мая 2017). Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
- ↑ Андрей Седильник (Andrej Cedilnik). Cross-Platform Software Development Using CMake (англ.). Linux Journal (3 октября 2003). Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
- ↑ CMake documentation: cmake-commands(7) ― add_executable (англ.). cmake.org. Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
- ↑ CMake documentation: cmake-commands(7) ― add_library (англ.). cmake.org. Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
- ↑ CMake documentation: cmake-commands(7) ― target_link_libraries (англ.). cmake.org. Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
- ↑ CMake documentation: CMake 3.19 Release Notes (англ.). cmake.org. Дата обращения: 19 января 2022. Архивировано 29 апреля 2022 года.
- ↑ CMake documentation: cmake-modules(7) (англ.). cmake.org. Дата обращения: 19 января 2022. Архивировано 9 декабря 2021 года.
- ↑ CMake documentation: cmake-modules(7) — ExternalProject (англ.). cmake.org. Дата обращения: 19 января 2022. Архивировано 21 февраля 2022 года.
- ↑ CMake:Packaging With CPack - KitwarePublic (англ.). GitLab. Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
- ↑ CMake:CPackPackageGenerators - KitwarePublic (англ.). GitLab. Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
- ↑ J. Elmsheuser, A. Krasznahorkay, E. Obreshkov, A. Undrus. Large Scale Software Building with CMake in ATLAS (англ.) (PDF). ЦЕРН. Дата обращения: 19 января 2022. Архивировано 10 ноября 2021 года.
- ↑ Converting SOFA to CMake (англ.). kitware.com. Дата обращения: 15 марта 2022. Архивировано 14 марта 2022 года.
- ↑ CMake, CTest, and CDash at Netflix (англ.). kitware.com. Дата обращения: 15 марта 2022. Архивировано 14 марта 2022 года.
- ↑ Second Life Chooses CMake as its Build System (англ.). kitware.com. Дата обращения: 15 марта 2022. Архивировано 14 марта 2022 года.
Ссылки
[править | править код]- Официальный сайт
- Разработчики рассказывают о истории проекта CMake // Журнал «Открытые системы», 2007/03
- Что за штука CMake? // Журнал «Linux Format», #99 (12), Декабрь 2007 (wiki)
- Как использовать CMake в KDE4
- Статьи по CMake
- Почему KDE перешёл к использованию CMake (англ.)
- Программное обеспечение по алфавиту
- Программное обеспечение, разработанное в 2000 году
- Инструменты компиляции
- Автоматизация сборки
- Свободные системы автоматизации сборки
- Программное обеспечение с лицензией BSD
- Свободное программное обеспечение, написанное на Си
- Свободное программное обеспечение, написанное на C++
- Кроссплатформенное программное обеспечение