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

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
Возможности: дополнение, источники, внутренние ссылки
Новый логотип
Метки: с мобильного устройства из мобильной версии через расширенный мобильный режим
 
(не показаны 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 появившейся в [[2008 год|2008 году]] системой [[SCons]] основанной на [[Python]] — является более быстродействующей, поскольку написана на [[Си (язык программирования)|Си]] и использует крайне простой [[Макрокоманда|макроязык]], но при этом SCons обладает большими возможностями по расширению.
В сравнении с другой альтернативой [[Autotools]] основанной на [[Python]] системой [[SCons]] — является более быстродействующей, поскольку написана на [[Си (язык программирования)|Си]] и использует крайне простой [[Макрокоманда|макроязык]], но при этом SCons обладает большими возможностями по расширению.


== История создания ==
== История ==
Разработка CMake началась в [[1999|1999 году]] в ответ на потребность в кроссплатформенной системе сборки для {{iw|Инструментарий для исследования сегментации и регистрации|ITK|en|Insight Segmentation and Registration Toolkit}}<ref>
Разработка CMake началась в [[1999|1999 году]] в ответ на потребность в кроссплатформенной системе сборки для {{iw|Инструментарий для исследования сегментации и регистрации|ITK|en|Insight Segmentation and Registration Toolkit}}<ref>{{cite web
|url = http://twit.tv/floss111
{{cite web
|url = http://twit.tv/floss111
|title = FLOSS Weekly 111: CMake
|title = FLOSS Weekly 111: CMake
|lang = en
|lang = en
|website = podcast. TWiT Network.
|access-date = 2022-01-19
|website = podcast. TWiT Network.
|access-date = 2022-01-19
|archive-date = 2014-10-06
|archive-url = https://web.archive.org/web/20141006075004/http://twit.tv/floss111
}}
|deadlink = no
</ref>.
Проект финансируемый [[Национальная библиотека медицины США|национальной библиотекой медицины США]], как часть проекта «{{iw|Проект видимый человек|Visible Human Project|en|Visible Human Project}}». Задача по разработке была возложена на небольшую компанию {{iw|Kitware|Kitware|en|Kitware}}. На него повлияла более ранняя система под названием pcmaker, созданная Кеном Мартином (Ken Martin) и другими разработчиками для поддержки инструментария визуализации (VTK)<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>
В то время обычным считалось использование [[Конфигурационный файл|конфигурационных сценариев]] и [[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
|url = http://rus-linux.net/MyLDP/BOOKS/Architecture-Open-Source-Applications/Vol-1/cmake.html
|title = Перевод главы о CMake из книги «The Architecture of Open Source Applications»
|lang = ru
|title = Перевод главы о CMake из книги «The Architecture of Open Source Applications»
|lang = ru
|website = rus-linux.net
|website = rus-linux.net
|date = 2012-08-28
|date = 2012-08-28
|access-date = 2022-01-19
|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">
Ключевой особенностью является возможность размещать выходные данные компилятора (например, объектные файлы) вне [[Файловая система#Иерархия каталогов|дерева]] исходного кода. Это позволяет выполнять несколько вариаций сборок из одного и того же исходного кода, а также [[Кросс-компилятор#Кросс-компиляция с 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
|lang = en
|website = lwn.net
|website = lwn.net
|date = 2006-06-21
|date = 2006-06-21
|access-date = 2022-01-19
|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 предоставляет возможность создавать подпроекты, собираемые перед сборкой основного проекта, что позволяет создавать цепочки зависимостей, собираемые в правильной необходимой разработчику последовательности.
Сложные иерархии каталогов проектов, рассчитанные на разные конфигурации, сборка с разными библиотеками и инструментами также хорошо поддерживаются 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]] и [[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
|url = https://www.scivision.dev/cmake-compiler-language-feature-detect/
|title = CMake compiler feature detect
|title = CMake compiler feature detect
|lang = en
|lang = en
|website = scivision.dev
|website = scivision.dev
|date = 2020-11-15
|date = 2020-11-15
|access-date = 2022-04-04
|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 поддерживает обширный список компиляторов<ref>
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, представляет собой двухэтапный процесс. Во-первых, стандартные файлы сборки создаются (генерируются) из файлов конфигурации (<tt>CMakeLists.txt</tt>), которые написаны на языке CMake. Затем задействуются системные инструменты сборки (Make, Ninja и т. п.) используемые для фактического создания программ<ref name="KDE и переход на CMake" /><ref>
Сборка программы или библиотеки с помощью 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» — для Make фaйлов). Продвинутые пользователи могут создавать и включать свои собственные генераторы файлов Make, для поддержки новых компиляторов и операционных систем. Сгенерированные файлы обычно помещаются (с помощью флага CMake) во внешний каталог, за пределами исходных файлов, например в каталог «<tt>build</tt>».
Файлы сборки конфигурируются в зависимости от используемого генератора (например, генератор «Unix Makefiles» — для make-фaйлов). Продвинутые пользователи могут создавать и включать свои собственные генераторы файлов Make для поддержки новых компиляторов и операционных систем. Сгенерированные файлы обычно помещаются (с помощью флага CMake) во внешний каталог, за пределами исходных файлов, например в каталог <tt>build</tt>.


Каждый проект после сборки, в поддиректориях содержит «<tt>CMakeCache.txt</tt>» и каталог файлов Make, что помогает избежать или ускорить этап «перегенерации», после повторного запуска сборки<ref>
После сборки каждый проект в подкаталогах содержит <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)
|title = Effective CMake
|lang = en
|lang = en
|format = PDF
|format = PDF
|website = [[GitHub]]
|website = [[GitHub]]
|date = 2017-05-19
|date = 2017-05-19
|access-date = 2022-01-19
|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 может создавать объектные файлы, которые могут быть связаны с исполняемыми двоичными файлами / библиотеками, избегая динамического (во время выполнения) связывания и вместо этого используя статическое (во время компиляции). Это обеспечивает гибкость в настройке различных оптимизаций (зависимости сборки могут определяться автоматически)<ref>
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 из файла <tt>CMakeLists.txt</tt>. В этом файле указываются исходные файлы и параметры сборки, которые CMake размещает в спецификации сборки проекта (например, в файле Make). Кроме того, файлы с приставкой <tt>.cmake</tt>, могут содержать сценарии используемые CMake<ref>
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 ... # КОНФИГУРАЦИИ (Debug, Release…)
CONFIGURATIONS ... # конфигурации (Debug, Release…)
RUNTIME DESTINATION ...) # (Исполняемый файл, MACOSX_BUNDLE, DLL) МЕСТО_НАЗНАЧЕНИЯ
RUNTIME DESTINATION ...) # (исполняемый файл, MACOSX_BUNDLE, DLL) место_назначения
</syntaxhighlight>
</syntaxhighlight>
ключевые слова — {{code|TARGETS}}, {{code|CONFIGURATIONS}} и {{code|RUNTIME DESTINATION}}. В данном случае {{code|TARGETS}} и {{code|CONFIGURATIONS}} служат разделителями между «целями» и «конфигурациями»<ref>
ключевые слова — {{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
|lang = en
|website = Linux Journal
|website = linuxjournal
|date = 2003-10-03
|date = 2003-10-03
|access-date = 2022-01-19
|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
|url = https://cmake.org/cmake/help/latest/command/add_executable.html
|title = CMake documentation: cmake-commands(7) ― add_executable
|lang = en
|title = CMake documentation: cmake-commands(7) ― add_executable
|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/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
|title = CMake documentation: cmake-commands(7) ― 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
|website = cmake.org
|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 поставляется с большим количеством модулей и инструментов «<tt>.cmake</tt>». Они облегчают такую работу, как поиск зависимостей (как встроенных, так и внешних, например, <tt>FindXYZ</tt> модули), инструменты для тестирования исполняемых файлов, упаковка (модуль <tt>CPack</tt> и команда <tt>cpack</tt>) и управление зависимостями от внешних проектов (модуль <tt>ExternalProject</tt>)<ref>
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
|url = https://cmake.org/cmake/help/latest/manual/cmake-modules.7.html
|title = CMake documentation: cmake-modules(7)
|title = CMake documentation: cmake-modules(7)
|lang = en
|lang = en
|website = cmake.org
|website = cmake.org
|access-date = 2022-01-19
|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
|title = CMake:Packaging With CPack - KitwarePublic
|lang = en
|lang = en
|format = PDF
|website = [[GitLab]]
|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://gitlab.kitware.com/cmake/community/-/wikis/doc/cpack/PackageGenerators
|url = https://www.kitware.com/converting-sofa-to-cmake/
|title = CMake:CPackPackageGenerators - KitwarePublic
|title = Converting SOFA to CMake
|lang = en
|lang = en
|website = [[GitLab]]
|website = kitware.com
|accessdate = 2022-01-19
|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!]]» проекта.
Проект «[[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


set(PROJECT_NAME my_project) # Записываем имя в переменную
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="console">
<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
Логотип программы 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 года.