CMake: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
м Преамбула: исправление
Новый логотип
Метки: с мобильного устройства из мобильной версии через расширенный мобильный режим
 
(не показано 9 промежуточных версий 6 участников)
Строка 1: Строка 1:
{{Карточка программы
{{Карточка программы
| логотип = Cmake.svg
| логотип = CMake logo.svg
| состояние = активное
| состояние = активное
}}
}}
Строка 16: Строка 16:
Считается альтернативой распространённой в сообществе [[GNU]] системе [[Autotools]], разработанной на базе [[Perl]] и [[Макропроцессор m4|M4]], основными недостатками которой считаются необходимость нетривиальных навыков для практического использования и несовместимость версий в ряде случаев.
Считается альтернативой распространённой в сообществе [[GNU]] системе [[Autotools]], разработанной на базе [[Perl]] и [[Макропроцессор m4|M4]], основными недостатками которой считаются необходимость нетривиальных навыков для практического использования и несовместимость версий в ряде случаев.


В сравнении с другой альтернативой [[Autotools]] — системой [[SCons]], основанной на [[Python]], является более быстродействующей, поскольку написана на [[Си (язык программирования)|Си]] и использует крайне простой [[Макрокоманда|макроязык]], но при этом SCons обладает большими возможностями по расширению.
В сравнении с другой альтернативой [[Autotools]] — основанной на [[Python]] системой [[SCons]] является более быстродействующей, поскольку написана на [[Си (язык программирования)|Си]] и использует крайне простой [[Макрокоманда|макроязык]], но при этом SCons обладает большими возможностями по расширению.


== История ==
== История ==
Разработка CMake началась в [[1999|1999 году]] в ответ на потребность в кроссплатформенной системе сборки для {{iw|Инструментарий для исследования сегментации и регистрации|ITK|en|Insight Segmentation and Registration Toolkit}}<ref>{{cite web
Разработка CMake началась в [[1999|1999 году]] в ответ на потребность в кроссплатформенной системе сборки для {{iw|Инструментарий для исследования сегментации и регистрации|ITK|en|Insight Segmentation and Registration Toolkit}}<ref>{{cite web
|url = http://twit.tv/floss111
|url = http://twit.tv/floss111
|title = FLOSS Weekly 111: CMake
|title = FLOSS Weekly 111: CMake
Строка 28: Строка 28:
|archive-url = https://web.archive.org/web/20141006075004/http://twit.tv/floss111
|archive-url = https://web.archive.org/web/20141006075004/http://twit.tv/floss111
|deadlink = no
|deadlink = no
}}</ref> финансируемой [[Национальная библиотека медицины США|национальной библиотекой медицины США]] части {{iw|Visible Human Project}}. Задача по разработке была возложена на небольшую компанию {{iw|Kitware|Kitware|en|Kitware}}. На него повлияла более ранняя система pcmaker, созданная Кеном Мартином (''Ken Martin'') и другими разработчиками для поддержки инструментария визуализации ([[Visualization Toolkit|VTK]]).
}}</ref>, финансируемой [[Национальная библиотека медицины США|национальной библиотекой медицины США]] части {{iw|Visible Human Project}}. Задача по разработке была возложена на небольшую компанию {{iw|Kitware|Kitware|en|Kitware}}. На него повлияла более ранняя система pcmaker, созданная Кеном Мартином (''Ken Martin'') и другими разработчиками для поддержки инструментария визуализации ([[Visualization Toolkit|VTK]]).


В то время обычным считалось использование [[Конфигурационный файл|конфигурационных сценариев]] и [[Makefile|make-файлов]] для сборки программных проектов на [[Unix-подобная операционная система|Unix-платформах]] и файлов проектов [[Visual Studio]] в среде [[Microsoft Windows|Windows]]. Такой подход к разработке вызывал огромное неудобство, например, добавление одного файла исходного кода в проект приводило к большим трудностям, так как для каждой платформы это приходилось делать по отдельности и совершенно разными методами. Очевидно, что разработчики нуждались в единой унифицированной системе сборки, не отнимающей лишнее время<ref>{{cite web
В то время обычным считалось использование [[Конфигурационный файл|конфигурационных сценариев]] и [[Makefile|make-файлов]] для сборки программных проектов на [[Unix-подобная операционная система|Unix-платформах]] и файлов проектов [[Visual Studio]] в среде [[Microsoft Windows|Windows]]. Такой подход к разработке вызывал огромное неудобство, например, добавление одного файла исходного кода в проект приводило к большим трудностям, так как для каждой платформы это приходилось делать по отдельности и совершенно разными методами. Очевидно, что разработчики нуждались в единой унифицированной системе сборки, не отнимающей лишнее время<ref>{{cite web
Строка 53: Строка 53:


== Возможности ==
== Возможности ==
Ключевой особенностью является необязательная возможность размещать выходные данные компилятора (например, объектные файлы) вне [[Файловая система#Иерархия каталогов|дерева]] исходного кода. Это позволяет выполнять несколько вариаций сборок из одного и того же исходного кода, а также [[Кросс-компилятор#Кросс-компиляция с gcc|кросскомпиляцию]]. Такой подход разделения файлов исходного кода и файлов сборки даёт гарантию, что удаление каталога сборки не приведёт к удалению исходного кода. Однако сами пользователи не защищены от случайного удаления каталога с исходными файлами<ref name="KDE и переход на CMake">{{cite web
Ключевой особенностью является возможность размещать выходные данные компилятора (например, объектные файлы) вне [[Файловая система#Иерархия каталогов|дерева]] исходного кода. Это позволяет выполнять несколько вариаций сборок из одного и того же исходного кода, а также [[Кросс-компилятор#Кросс-компиляция с gcc|кросскомпиляцию]]. Такой подход разделения файлов исходного кода и файлов сборки даёт гарантию, что удаление каталога сборки не приведёт к удалению исходного кода. Однако сами пользователи не защищены от случайного удаления каталога с исходными файлами<ref name="KDE и переход на CMake">{{cite web
|url = https://lwn.net/Articles/188693/
|url = https://lwn.net/Articles/188693/
|author = Alexander Neundorf
|author = Alexander Neundorf
Строка 69: Строка 69:
CMake может находить общесистемные и пользовательские каталоги исполняемых файлов, файлов конфигураций и библиотек. Эти местоположения хранятся в [[кэш]]е, который можно конфигурировать перед созданием целевых файлов сборки. CMake-кэш можно редактировать с помощью графического редактора, который поставляется вместе с CMake, либо в [[Интерфейс командной строки|командной строке]] с помощью команд CMake.
CMake может находить общесистемные и пользовательские каталоги исполняемых файлов, файлов конфигураций и библиотек. Эти местоположения хранятся в [[кэш]]е, который можно конфигурировать перед созданием целевых файлов сборки. CMake-кэш можно редактировать с помощью графического редактора, который поставляется вместе с CMake, либо в [[Интерфейс командной строки|командной строке]] с помощью команд CMake.


Сложные иерархии каталогов проектов, рассчитанные на разные конфигурации, сборка с разными библиотеками и инструментами, также хорошо поддерживаются CMake. По сути CMake предоставляет возможность создавать подпроекты, собираемые перед сборкой основного проекта, что позволяет создавать цепочки зависимостей, собираемые в правильной необходимой разработчику последовательности.
Сложные иерархии каталогов проектов, рассчитанные на разные конфигурации, сборка с разными библиотеками и инструментами также хорошо поддерживаются CMake. По сути CMake предоставляет возможность создавать подпроекты, собираемые перед сборкой основного проекта, что позволяет создавать цепочки зависимостей, собираемые в необходимой разработчику последовательности.


=== Поддержка разных сред разработки ===
=== Поддержка разных сред разработки ===
CMake может создавать файлы проектов для нескольких популярных [[Интегрированная среда разработки|интегрированных средств разработки]], в том числе [[Microsoft Visual Studio]], [[Xcode]] и [[Eclipse (среда разработки)|Eclipse CDT]].
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]] и [[nmake]] в Windows, make на Unix-подобных системах, [[Ninja (система сборки)|Ninja]]. Для упрощения внедрения поддержки CMake в новые среды разработки используются файлы преднастройки <tt>CMakePresets.json</tt>. Среди сред, изначально поддерживающих CMake — [[CLion]], [[KDevelop]], [[Qt Creator]], [[Visual Studio]].


=== Поддержка компиляторов ===
=== Поддержка компиляторов ===
Строка 92: Строка 92:


== Процесс сборки ==
== Процесс сборки ==
Сборка программы или библиотеки с помощью CMake, представляет собой двухэтапный процесс. На первом этапе стандартные файлы сборки генерируются из файлов конфигурации (<tt>CMakeLists.txt</tt>), которые написаны на языке CMake. Затем задействуются системные инструменты сборки, такие как make, Ninja, используемые для непосредственной компиляции программ<ref name="KDE и переход на CMake" />.
Сборка программы или библиотеки с помощью CMake представляет собой двухэтапный процесс. На первом этапе стандартные файлы сборки генерируются из файлов конфигурации (<tt>CMakeLists.txt</tt>), которые написаны на языке CMake. Затем задействуются системные инструменты сборки, такие как make, Ninja, используемые для непосредственной компиляции программ<ref name="KDE и переход на CMake" />.


Файлы сборки конфигурируются в зависимости от используемого генератора (например, генератор «Unix Makefiles» — для make-фaйлов). Продвинутые пользователи могут создавать и включать свои собственные генераторы файлов Make, для поддержки новых компиляторов и операционных систем. Сгенерированные файлы обычно помещаются (с помощью флага CMake) во внешний каталог, за пределами исходных файлов, например в каталог <tt>build</tt>.
Файлы сборки конфигурируются в зависимости от используемого генератора (например, генератор «Unix Makefiles» — для make-фaйлов). Продвинутые пользователи могут создавать и включать свои собственные генераторы файлов Make для поддержки новых компиляторов и операционных систем. Сгенерированные файлы обычно помещаются (с помощью флага CMake) во внешний каталог, за пределами исходных файлов, например в каталог <tt>build</tt>.


Каждый проект после сборки, в подкаталогах содержит <tt>CMakeCache.txt</tt> и каталог make-файлов, что помогает избежать или ускорить этап «перегенерации» в случае повторного запуска сборки<ref>{{cite web
После сборки каждый проект в подкаталогах содержит <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
|url = https://github.com/boostcon/cppnow_presentations_2017/blob/master/05-19-2017_friday/effective_cmake__daniel_pfeifer__cppnow_05-19-2017.pdf
|author = Daniel Pfeifer
|author = Daniel Pfeifer
Строка 110: Строка 110:
}}</ref>.
}}</ref>.


В зависимости от конфигурации <tt>CMakeLists.txt</tt> и выбранной цели, файлы сборки могут создавать:
В зависимости от конфигурации <tt>CMakeLists.txt</tt> и выбранной цели файлы сборки могут создавать:
* [[Исполняемый файл|исполняемые файлы]];
* [[Исполняемый файл|исполняемые файлы]];
* [[Разделяемая библиотека|разделяемые библиотеки]] (например, <tt>libxyz</tt>, <tt>xyz.dll</tt> и т. п.);
* [[Разделяемая библиотека|разделяемые библиотеки]] (например, <tt>libxyz</tt>, <tt>xyz.dll</tt> и т. п.);
Строка 121: Строка 121:


== Язык ==
== Язык ==
CMake имеет относительно простой [[Интерпретатор|интерпретируемый]] [[Императивное программирование|императивный]] [[Сценарный язык|язык сценариев]], поддерживающий [[Переменная (программирование)|переменные]], [[Строковый тип#Операции|методы обработки строк]], [[Массив (тип данных)|массивы]], объявления [[Функция (программирование)|функций]] и [[макрос]]ов, включение [[Модульное программирование|модулей]] (импортирование). Команды языка CMake (или директивы) считываются CMake из файла <tt>CMakeLists.txt</tt>. В этом файле указываются исходные файлы и параметры сборки, которые CMake размещает в спецификации сборки проекта (например, в make-файле). Кроме того, файлы с приставкой <tt>.cmake</tt>, могут содержать сценарии используемые CMake.
CMake имеет относительно простой [[Интерпретатор|интерпретируемый]] [[Императивное программирование|императивный]] [[Сценарный язык|язык сценариев]], поддерживающий [[Переменная (программирование)|переменные]], [[Строковый тип#Операции|методы обработки строк]], [[Массив (тип данных)|массивы]], объявления [[Функция (программирование)|функций]] и [[макрос]]ов, включение [[Модульное программирование|модулей]] (импортирование). Команды языка CMake (или директивы) считываются CMake из файла <tt>CMakeLists.txt</tt>. В этом файле указываются исходные файлы и параметры сборки, которые CMake размещает в спецификации сборки проекта (например, в make-файле). Кроме того, файлы с приставкой <tt>.cmake</tt> могут содержать сценарии, используемые CMake.


Аргументы команд разделены пробелами и могут содержать ключевые слова, для разделения групп аргументов. Например, в команде:
Аргументы команд разделены пробелами и могут содержать ключевые слова для разделения групп аргументов. Например, в команде:
<syntaxhighlight lang=cmake>
<syntaxhighlight lang=cmake>
# Команда установки
# Команда установки
Строка 186: Строка 186:


== Модули и инструменты ==
== Модули и инструменты ==
CMake поставляется с большим количеством модулей и инструментов <tt>.cmake</tt>. Они облегчают такую работу, как поиск зависимостей (как встроенных, так и внешних, например, <tt>FindXYZ</tt> модули), инструменты для тестирования исполняемых файлов, упаковка (модуль <tt>CPack</tt> и команда <tt>cpack</tt>) и управление зависимостями от внешних проектов (модуль <tt>ExternalProject</tt>)<ref>{{cite web
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
|url = https://cmake.org/cmake/help/latest/manual/cmake-modules.7.html
|title = CMake documentation: cmake-modules(7)
|title = CMake documentation: cmake-modules(7)
Строка 217: Строка 217:
|archive-url = https://web.archive.org/web/20220119214524/https://gitlab.kitware.com/cmake/community/-/wikis/doc/cpack/Packaging-With-CPack
|archive-url = https://web.archive.org/web/20220119214524/https://gitlab.kitware.com/cmake/community/-/wikis/doc/cpack/Packaging-With-CPack
|deadlink = no
|deadlink = no
}}</ref>,
}}</ref>
в состав CMake включены система автоматизированной сборки пакетов программного обеспечения [[CPack]] и модуль CMake для взаимодействия с ней. Система позволяет создавать пакеты программного обеспечения для популярных [[Система управления пакетами|пакетных менеджеров]] ([[Deb (формат файлов)|DEB]], [[RPM]], [[DMG (формат)|DMG]]), средства [[Установка программного обеспечения|установки программного обеспечения]] ([[Nullsoft Scriptable Install System|NSIS]] для [[Windows|Microsoft Windows]]), а также архивы со сборкой ([[TGZ]], [[Bzip2|TBZ2]], [[ZIP]], [[Самораспаковывающийся архив|самораспаковывающийся TGZ]])<ref>{{Cite web
в состав 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
|url = https://gitlab.kitware.com/cmake/community/-/wikis/doc/cpack/PackageGenerators
|title = CMake:CPackPackageGenerators - KitwarePublic
|title = CMake:CPackPackageGenerators - KitwarePublic
Строка 283: Строка 283:
${PROJECT_NAME} # Имя файла
${PROJECT_NAME} # Имя файла
main.cpp # Список файлов исходного кода
main.cpp # Список файлов исходного кода
)
) # Добавлять заголовочные файлы нет необходимости


install( # Указываем цель и путь установки
install( # Указываем цель и путь установки
Строка 305: Строка 305:


Сборка осуществляется посредством следующих команд в каталоге с файлами:
Сборка осуществляется посредством следующих команд в каталоге с файлами:
<syntaxhighlight lang="console">
<syntaxhighlight lang="shell">
$ cmake . # Вызываем генерацию файлов сборки
cmake . # Вызываем генерацию файлов сборки
$ cmake --build . # Собираем цель, на выходе получаем исполняемый файл
cmake --build . # Собираем цель, на выходе получаем исполняемый файл
$ cmake --install . # По необходимости устанавливаем
cmake --install . # По необходимости устанавливаем
</syntaxhighlight>
</syntaxhighlight>


При этом, есть возможность получить справочную информацию об отдельном элементе языка CMake и его команд.
При этом есть возможность получить справочную информацию об отдельном элементе языка CMake и его команд.
<syntaxhighlight lang="console">
<syntaxhighlight lang="shell">
$ cmake --help
cmake --help
$ cmake --help-command-list
cmake --help-command-list
$ cmake --help-command install
cmake --help-command install
</syntaxhighlight>
</syntaxhighlight>



Текущая версия от 16:13, 25 августа 2024

CMake
Логотип программы CMake
Скриншот программы 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 и выбранной цели файлы сборки могут создавать:

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

Примечания

[править | править код]
  1. CMake 3.31.2 available for download (англ.) — 2024.
  2. CMake 3.31.0-rc3 is ready for testing (англ.) — 2024.
  3. The cmake Open Source Project on Open Hub: Languages Page — 2006.
  4. https://cmake.org/cmake/help/latest/manual/cmake-gui.1.html
  5. https://cmake.org/runningcmake
  6. 1 2 https://cmake.org/download/
  7. https://cmake.org/
  8. https://gitlab.kitware.com/cmake/cmake/blob/master/Copyright.txt
  9. The cmake Open Source Project on Open Hub: Licenses Page — 2006.
  10. Embracing Modern CMake How to recognize and use modern CMake interfaces (англ.) (PDF). Дата обращения: 4 апреля 2022. Архивировано 20 января 2022 года.
  11. FLOSS Weekly 111: CMake (англ.). podcast. TWiT Network.. Дата обращения: 19 января 2022. Архивировано 6 октября 2014 года.
  12. Перевод главы о CMake из книги «The Architecture of Open Source Applications». rus-linux.net (28 августа 2012). Дата обращения: 19 января 2022. Архивировано 7 мая 2021 года.
  13. Глава о CMake из книги «The Architecture of Open Source Applications» (англ.). aosabook.org (2012). Дата обращения: 19 января 2022. Архивировано 7 апреля 2022 года.
  14. 1 2 Alexander Neundorf. Why the KDE project switched to CMake — and how (англ.). lwn.net (21 июня 2006). Дата обращения: 19 января 2022. Архивировано 20 ноября 2021 года.
  15. CMake compiler feature detect (англ.). scivision.dev (15 ноября 2020). Дата обращения: 4 апреля 2022. Архивировано 22 января 2022 года.
  16. Daniel Pfeifer. Effective CMake (англ.) (PDF). GitHub (19 мая 2017). Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
  17. Андрей Седильник (Andrej Cedilnik). Cross-Platform Software Development Using CMake (англ.). Linux Journal (3 октября 2003). Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
  18. CMake documentation: cmake-commands(7) ― add_executable (англ.). cmake.org. Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
  19. CMake documentation: cmake-commands(7) ― add_library (англ.). cmake.org. Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
  20. CMake documentation: cmake-commands(7) ― target_link_libraries (англ.). cmake.org. Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
  21. CMake documentation: CMake 3.19 Release Notes (англ.). cmake.org. Дата обращения: 19 января 2022. Архивировано 29 апреля 2022 года.
  22. CMake documentation: cmake-modules(7) (англ.). cmake.org. Дата обращения: 19 января 2022. Архивировано 9 декабря 2021 года.
  23. CMake documentation: cmake-modules(7) — ExternalProject (англ.). cmake.org. Дата обращения: 19 января 2022. Архивировано 21 февраля 2022 года.
  24. CMake:Packaging With CPack - KitwarePublic (англ.). GitLab. Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
  25. CMake:CPackPackageGenerators - KitwarePublic (англ.). GitLab. Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
  26. J. Elmsheuser, A. Krasznahorkay, E. Obreshkov, A. Undrus. Large Scale Software Building with CMake in ATLAS (англ.) (PDF). ЦЕРН. Дата обращения: 19 января 2022. Архивировано 10 ноября 2021 года.
  27. Converting SOFA to CMake (англ.). kitware.com. Дата обращения: 15 марта 2022. Архивировано 14 марта 2022 года.
  28. CMake, CTest, and CDash at Netflix (англ.). kitware.com. Дата обращения: 15 марта 2022. Архивировано 14 марта 2022 года.
  29. Second Life Chooses CMake as its Build System (англ.). kitware.com. Дата обращения: 15 марта 2022. Архивировано 14 марта 2022 года.