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

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
м Пример: оформление, стилевые правки
Спасено источников — 30, отмечено мёртвыми — 0. Сообщить об ошибке. См. FAQ.) #IABot (v2.0.8.7
Строка 1: Строка 1:
{{Карточка программы|состояние = активное}}
{{Карточка программы|состояние = активное}}
'''CMake''' (<small>[[МФА]]</small> {{МФА2|ˈ|s|i|ː|m|e|ɪ|k}}; от {{lang-en|'''C'''ross-platform [[Make|'''M'''ake]]}} — {{s|«Кроссплатформенный Make»}}<ref>
'''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
{{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
|title = Embracing Modern CMake How to recognize and use modern CMake interfaces
|lang = en
|format = PDF
|format = PDF
|access-date = 2022-04-04
|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>) — это [[кроссплатформенность|кроссплатформенная]] [[утилита]], обладающая возможностями [[Автоматизация сборки|автоматизации сборки]] программного обеспечения из [[исходный код|исходного кода]]. Сам CMake не занимается непосредственно сборкой, а лишь генерирует файлы сборки из предварительно написанного [[Скрипт|скрипт-файла]] «<tt>CMakeLists.txt</tt>» и предоставляет простой единый интерфейс управления. Помимо этого, CMake способен автоматизировать процесс [[Установка программного обеспечения|установки]] и [[Система управления пакетами|пакетирования]].
}}</ref>) — это [[кроссплатформенность|кроссплатформенная]] [[утилита]], обладающая возможностями [[Автоматизация сборки|автоматизации сборки]] программного обеспечения из [[исходный код|исходного кода]]. Сам CMake не занимается непосредственно сборкой, а лишь генерирует файлы сборки из предварительно написанного [[Скрипт|скрипт-файла]] «<tt>CMakeLists.txt</tt>» и предоставляет простой единый интерфейс управления. Помимо этого, CMake способен автоматизировать процесс [[Установка программного обеспечения|установки]] и [[Система управления пакетами|пакетирования]].


Считается альтернативой распространённой в сообществе [[GNU]] системе [[Autotools]], разработанной на базе [[Perl]] и [[Макропроцессор m4|M4]], которая требует определённых навыков для практического использования, а существующие версии в ряде случаев несовместимы друг с другом.
Считается альтернативой распространённой в сообществе [[GNU]] системе [[Autotools]], разработанной на базе [[Perl]] и [[Макропроцессор m4|M4]], которая требует определённых навыков для практического использования, а существующие версии в ряде случаев несовместимы друг с другом.
Строка 15: Строка 16:


== История ==
== История ==
Разработка 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>.
}}</ref>.
Проект финансируемый [[Национальная библиотека медицины США|национальной библиотекой медицины США]], как часть проекта «{{iw|Проект видимый человек|Visible Human Project|en|Visible Human Project}}». Задача по разработке была возложена на небольшую компанию {{iw|Kitware|Kitware|en|Kitware}}. На него повлияла более ранняя система под названием pcmaker, созданная Кеном Мартином (Ken Martin) и другими разработчиками для поддержки инструментария визуализации (VTK)<ref>
Проект финансируемый [[Национальная библиотека медицины США|национальной библиотекой медицины США]], как часть проекта «{{iw|Проект видимый человек|Visible Human Project|en|Visible Human Project}}». Задача по разработке была возложена на небольшую компанию {{iw|Kitware|Kitware|en|Kitware}}. На него повлияла более ранняя система под названием pcmaker, созданная Кеном Мартином (Ken Martin) и другими разработчиками для поддержки инструментария визуализации (VTK)<ref>{{cite web
{{cite web
|url = https://cmake.org/overview/
|url = https://cmake.org/overview/
|title = About CMake
|title = About CMake
|lang = en
|lang = en
|website = cmake.org
|website = cmake.org
|access-date = 2022-03-15
|access-date = 2022-03-15
|archive-date = 2022-03-14
}}
|archive-url = https://web.archive.org/web/20220314234009/https://cmake.org/overview/
</ref>.
|deadlink = no
}}</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>.


=== Настраиваемая структура проекта ===
=== Настраиваемая структура проекта ===
Строка 80: Строка 86:
*А также [[Ninja (система сборки)|Ninja]], как на Windows, так и на Unix-подобных платформах.
*А также [[Ninja (система сборки)|Ninja]], как на Windows, так и на Unix-подобных платформах.


Для упрощения внедрения поддержки CMake в новые ИСР, рекомендуется использовать файлы преднастройки «<tt>CMakePresets.json</tt>»<ref>
Для упрощения внедрения поддержки CMake в новые ИСР, рекомендуется использовать файлы преднастройки «<tt>CMakePresets.json</tt>»<ref>{{cite web
|url = https://cmake.org/cmake/help/latest/guide/ide-integration/index.html
{{cite web
|title = CMake documentation: IDE Integration Guide
|url = https://cmake.org/cmake/help/latest/guide/ide-integration/index.html
|title = CMake documentation: IDE Integration Guide
|lang = en
|lang = en
|website = cmake.org
|website = cmake.org
|access-date = 2022-01-26
|access-date = 2022-01-26
|archive-date = 2022-01-26
|archive-url = https://web.archive.org/web/20220126123301/https://cmake.org/cmake/help/latest/guide/ide-integration/index.html
}}
|deadlink = no
</ref>,
}}</ref>,
для более удобного конфигурирования процесса сборки, а также «[[API|File API]]»<ref>
для более удобного конфигурирования процесса сборки, а также «[[API|File API]]»<ref>{{cite web
{{cite web
|url = https://cmake.org/cmake/help/latest/manual/cmake-file-api.7.html
|url = https://cmake.org/cmake/help/latest/manual/cmake-file-api.7.html
|title = CMake documentation: cmake-file-api(7)
|title = CMake documentation: cmake-file-api(7)
|lang = en
|lang = en
|website = cmake.org
|website = cmake.org
|access-date = 2022-01-26
|access-date = 2022-01-26
|archive-date = 2022-01-26
}}
|archive-url = https://web.archive.org/web/20220126123311/https://cmake.org/cmake/help/latest/manual/cmake-file-api.7.html
</ref>,
|deadlink = no
}}</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 поддерживает обширный список компиляторов<ref>{{cite web
|url = https://cmake.org/cmake/help/latest/manual/cmake-compile-features.7.html#supported-compilers
{{cite web
|title = Supported Compilers
|url = https://cmake.org/cmake/help/latest/manual/cmake-compile-features.7.html#supported-compilers
|title = Supported Compilers
|lang = en
|lang = en
|website = CMake.org
|website = CMake.org
|access-date = 2022-04-04
|access-date = 2022-04-04
|archive-date = 2022-02-21
|archive-url = https://web.archive.org/web/20220221083623/https://cmake.org/cmake/help/latest/manual/cmake-compile-features.7.html#supported-compilers
}}
|deadlink = no
</ref>,
}}</ref>,
в который входят:
в который входят:
* [[Xcode|Apple Clang]];
* [[Xcode|Apple Clang]];
Строка 130: Строка 140:


== Процесс сборки ==
== Процесс сборки ==
Сборка программы или библиотеки с помощью 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" /><ref>{{cite web
|url = https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html
{{cite web
|url = https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html
|title = CMake documentation: cmake-toolchains(7)
|title = CMake documentation: cmake-toolchains(7)
|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/20220119174935/https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html
}}
|deadlink = no
</ref>.
}}</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>.


=== Типы целей сборки ===
=== Типы целей сборки ===
Строка 162: Строка 174:
*псевдо цели (включая псевдонимы).
*псевдо цели (включая псевдонимы).


CMake может создавать объектные файлы, которые могут быть связаны с исполняемыми двоичными файлами / библиотеками, избегая динамического (во время выполнения) связывания и вместо этого используя статическое (во время компиляции). Это обеспечивает гибкость в настройке различных оптимизаций (зависимости сборки могут определяться автоматически)<ref>
CMake может создавать объектные файлы, которые могут быть связаны с исполняемыми двоичными файлами / библиотеками, избегая динамического (во время выполнения) связывания и вместо этого используя статическое (во время компиляции). Это обеспечивает гибкость в настройке различных оптимизаций (зависимости сборки могут определяться автоматически)<ref>{{cite web
|url = https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html#object-libraries
{{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
|title = CMake documentation: cmake-buildsystem(7) — Object Libraries
|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/20220119174946/https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html#object-libraries
}}
|deadlink = no
</ref>.
}}</ref>.


=== Предкомпилированные заголовочные файлы ===
=== Предкомпилированные заголовочные файлы ===
Начиная с версии CMake 3.6, можно создавать предварительно скомпилированные [[Заголовочный файл|заголовочные файлы]]<ref>
Начиная с версии CMake 3.6, можно создавать предварительно скомпилированные [[Заголовочный файл|заголовочные файлы]]<ref>{{cite web
|url = https://cmake.org/cmake/help/git-stage/command/target_precompile_headers.html
{{cite web
|title = CMake documentation: target precompile headers
|url = https://cmake.org/cmake/help/git-stage/command/target_precompile_headers.html
|lang = en
|title = CMake documentation: target precompile headers
|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/20220119174935/https://cmake.org/cmake/help/git-stage/command/target_precompile_headers.html
}}
|deadlink = no
</ref>.
}}</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<ref>{{cite web
|url = https://cmake.org/cmake/help/latest/manual/cmake-language.7.html
{{cite web
|url = https://cmake.org/cmake/help/latest/manual/cmake-language.7.html
|title = CMake documentation: cmake-language(7)
|title = CMake documentation: cmake-language(7)
|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/20220221083627/https://cmake.org/cmake/help/latest/manual/cmake-language.7.html
}}
|deadlink = no
</ref>.
}}</ref>.


=== Синтаксис команд ===
=== Синтаксис команд ===
Строка 202: Строка 217:
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 = linuxjournal
|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
|deadlink = no
}}</ref>:
* {{code|add_executable(...)|lang=cmake}} — определяет цель (исполняемый файл, например <tt>.exe</tt>, зависит от целевой платформы);
* {{code|add_executable(...)|lang=cmake}} — определяет цель (исполняемый файл, например <tt>.exe</tt>, зависит от целевой платформы);
* {{code|add_library(...)|lang=cmake}} — определяет цель (библиотеку, например <tt>.so</tt> или <tt>.dll</tt>);
* {{code|add_library(...)|lang=cmake}} — определяет цель (библиотеку, например <tt>.so</tt> или <tt>.dll</tt>);
Строка 244: Строка 263:


=== Поддержка JSON ===
=== Поддержка JSON ===
CMake поддерживает извлечение значений данных в переменные из строк [[JSON]] (начиная с версии 3.19)<ref>
CMake поддерживает извлечение значений данных в переменные из строк [[JSON]] (начиная с версии 3.19)<ref>{{cite web
|url = https://cmake.org/cmake/help/v3.19/release/3.19.html
{{cite web
|title = CMake documentation: CMake 3.19 Release Notes
|url = https://cmake.org/cmake/help/v3.19/release/3.19.html
|lang = en
|title = CMake documentation: CMake 3.19 Release Notes
|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
}}
|deadlink = no
</ref>.
}}</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
}}</ref>:
* '''ctest''' — используется для тестирования целей, заданных в <tt>CMakeLists.txt</tt>;
* '''ctest''' — используется для тестирования целей, заданных в <tt>CMakeLists.txt</tt>;
* '''ccmake''' и '''cmake-gui''' — настраивает и обновляет переменные конфигурации, предназначенные для целевой системы сборки;
* '''ccmake''' и '''cmake-gui''' — настраивает и обновляет переменные конфигурации, предназначенные для целевой системы сборки;
Строка 277: Строка 299:


=== CPack ===
=== CPack ===
Начиная с версии 2.4.2<ref>
Начиная с версии 2.4.2<ref>{{Cite web
|url = https://gitlab.kitware.com/cmake/community/-/wikis/doc/cpack/Packaging-With-CPack
{{Cite web
|url = https://gitlab.kitware.com/cmake/community/-/wikis/doc/cpack/Packaging-With-CPack
|title = CMake:Packaging With CPack - KitwarePublic
|title = CMake:Packaging With CPack - KitwarePublic
|lang = en
|lang = en
|website = [[GitLab]]
|website = [[GitLab]]
|accessdate = 2022-01-19
|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>,
}}</ref>,
в состав CMake включены система автоматизированной сборки пакетов программного обеспечения [[CPack]] и модуль CMake для взаимодействия с ней. Система позволяет создавать пакеты программного обеспечения для популярных [[Система управления пакетами|пакетных менеджеров]] ([[Deb (формат файлов)|DEB]], [[RPM]], [[DMG (формат)|DMG]]), средства [[Установка программного обеспечения|установки программного обеспечения]] ([[Nullsoft Scriptable Install System|NSIS]] для [[Windows|Microsoft Windows]]), а также архивы со сборкой ([[TGZ]], [[Bzip2|TBZ2]], [[ZIP]], [[Самораспаковывающийся архив|самораспаковывающийся TGZ]])<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
{{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
|lang = en
|lang = en
|website = [[GitLab]]
|website = [[GitLab]]
|accessdate = 2022-01-19
|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
</ref>.
|deadlink = no
}}</ref>.


== Программные проекты использующие CMake ==
== Программные проекты использующие CMake ==
Строка 302: Строка 326:
* [[Apache Qpid]] (система сообщений);
* [[Apache Qpid]] (система сообщений);
* [[Boost]] (набор C++ библиотек);
* [[Boost]] (набор C++ библиотек);
* [[Blender]] (программа 3D моделирования)<ref>
* [[Blender]] (программа 3D моделирования)<ref>{{Cite web
|url = https://wiki.blender.org/wiki/Building_Blender
{{Cite web
|url = https://wiki.blender.org/wiki/Building_Blender
|title = Blender wiki — Building Blender
|title = Blender wiki — Building Blender
|lang = en
|lang = en
|website = blender.org
|website = blender.org
|accessdate = 2022-01-19
|accessdate = 2022-01-19
|archive-date = 2022-01-24
|archive-url = https://web.archive.org/web/20220124234115/https://wiki.blender.org/wiki/Building_Blender
}}
|deadlink = no
</ref>;
}}</ref>;
* [[ReactOS]] (операционная система совместимая с [[Windows]] программами и [[драйвер]]ами);
* [[ReactOS]] (операционная система совместимая с [[Windows]] программами и [[драйвер]]ами);
* [[MySQL]] (система управления базами данных);
* [[MySQL]] (система управления базами данных);
* [[KDE]] (среда рабочего стола и смежные проекты)<ref>
* [[KDE]] (среда рабочего стола и смежные проекты)<ref>{{Cite web
|url = https://www.kitware.com/kde-adopts-cmake/
{{Cite web
|url = https://www.kitware.com/kde-adopts-cmake/
|title = KDE Adopts CMake
|title = KDE Adopts CMake
|lang = en
|lang = en
|website = kitware.com
|website = kitware.com
|accessdate = 2022-03-15
|accessdate = 2022-03-15
|archive-date = 2022-03-14
|archive-url = https://web.archive.org/web/20220314224739/https://www.kitware.com/kde-adopts-cmake/
}}
|deadlink = no
</ref>;
}}</ref>;
* [[KiCad]] ([[САПР]]);
* [[KiCad]] ([[САПР]]);
* [[FreeCAD]] (САПР);
* [[FreeCAD]] (САПР);
Строка 328: Строка 354:


=== Научно исследовательские проекты ===
=== Научно исследовательские проекты ===
Программное обеспечение, используемое в [[Эксперимент ATLAS|эксперименте ATLAS]], создано с использованием CMake. Само программное обеспечение написано на C/C++ и Python<ref>
Программное обеспечение, используемое в [[Эксперимент ATLAS|эксперименте ATLAS]], создано с использованием CMake. Само программное обеспечение написано на C/C++ и Python<ref>{{Cite web
|url = https://cds.cern.ch/record/2243765/files/ATL-SOFT-PROC-2017-033.pdf
{{Cite web
|author = J. Elmsheuser, A. Krasznahorkay, E. Obreshkov, A. Undrus
|url = https://cds.cern.ch/record/2243765/files/ATL-SOFT-PROC-2017-033.pdf
|title = Large Scale Software Building with CMake in ATLAS
|author = J. Elmsheuser, A. Krasznahorkay, E. Obreshkov, A. Undrus
|lang = en
|title = Large Scale Software Building with CMake in ATLAS
|lang = en
|format = PDF
|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
}}
|deadlink = no
</ref>.
}}</ref>.


Исследовательский институт во франции [[INRIA]] применил CMake в медицинском исследовании в проекте {{iw|Simulation Open Framework Architecture|SOFA|en|Simulation Open Framework Architecture}}<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/
{{Cite web
|url = https://www.kitware.com/converting-sofa-to-cmake/
|title = Converting SOFA to CMake
|title = Converting SOFA to CMake
|lang = en
|lang = en
|website = kitware.com
|website = kitware.com
|accessdate = 2022-03-15
|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/
}}
|deadlink = no
</ref>.
}}</ref>.


=== Компании и проекты с закрытым кодом ===
=== Компании и проекты с закрытым кодом ===
* [[Netflix]] (стриминговый сервис фильмов и сериалов)<ref>
* [[Netflix]] (стриминговый сервис фильмов и сериалов)<ref>{{Cite web
|url = https://www.kitware.com/cmake-ctest-and-cdash-at-netflix/
{{Cite web
|url = https://www.kitware.com/cmake-ctest-and-cdash-at-netflix/
|title = CMake, CTest, and CDash at Netflix
|title = CMake, CTest, and CDash at Netflix
|lang = en
|lang = en
|website = kitware.com
|website = kitware.com
|accessdate = 2022-03-15
|accessdate = 2022-03-15
|archive-date = 2022-03-14
|archive-url = https://web.archive.org/web/20220314231804/https://www.kitware.com/cmake-ctest-and-cdash-at-netflix/
}}
|deadlink = no
</ref>;
}}</ref>;
* [[Second Life]] (виртуальный мир с элементами социальной сети)<ref>
* [[Second Life]] (виртуальный мир с элементами социальной сети)<ref>{{Cite web
{{Cite web
|url = https://www.kitware.com/second-life-chooses-cmake-as-its-build-system/
|url = https://www.kitware.com/second-life-chooses-cmake-as-its-build-system/
|title = Second Life Chooses CMake as its Build System
|title = Second Life Chooses CMake as its Build System
|lang = en
|lang = en
|website = kitware.com
|website = kitware.com
|accessdate = 2022-03-15
|accessdate = 2022-03-15
|archive-date = 2022-03-14
}}
|archive-url = https://web.archive.org/web/20220314232003/https://www.kitware.com/second-life-chooses-cmake-as-its-build-system/
</ref>.
|deadlink = no
}}</ref>.


== Пример ==
== Пример ==

Версия от 16:27, 5 мая 2022

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]) — это кроссплатформенная утилита, обладающая возможностями автоматизации сборки программного обеспечения из исходного кода. Сам CMake не занимается непосредственно сборкой, а лишь генерирует файлы сборки из предварительно написанного скрипт-файла «CMakeLists.txt» и предоставляет простой единый интерфейс управления. Помимо этого, CMake способен автоматизировать процесс установки и пакетирования.

Считается альтернативой распространённой в сообществе GNU системе Autotools, разработанной на базе Perl и M4, которая требует определённых навыков для практического использования, а существующие версии в ряде случаев несовместимы друг с другом.

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

История

Разработка CMake началась в 1999 году в ответ на потребность в кроссплатформенной системе сборки для ITK[англ.][11]. Проект финансируемый национальной библиотекой медицины США, как часть проекта «Visible Human Project[англ.]». Задача по разработке была возложена на небольшую компанию Kitware[англ.]. На него повлияла более ранняя система под названием pcmaker, созданная Кеном Мартином (Ken Martin) и другими разработчиками для поддержки инструментария визуализации (VTK)[12].

В то время было нормой использовать конфигурационные скрипты и Make файлы для сборки программных проектов на Unix платформах и файлы проектов Visual Studio в среде Windows. Такой подход к разработке вызывал огромное неудобство, так как к примеру добавление обыкновенного файла исходного кода в проект, приводило к большим трудностям. Ведь для каждой платформы, это приходилось делать по отдельности и совершенно разными методами. Очевидно, что разработчики хотели иметь единую унифицированную систему сборки, не отнимающую лишнее время и имеющую все преимущества существующих систем сборки, но при этом не имеющую их недостатков[13][14].

Возможности

Ключевой особенностью является возможность (необязательно) размещать выходные данные компилятора (например, объектные файлы) вне дерева исходного кода. Это позволяет выполнять несколько вариаций сборок из одного и того же исходного кода, а также кросскомпиляцию. Такой подход разделения файлов исходного кода и файлов сборки даёт гарантию, что удаление каталога сборки не приведет к удалению исходного кода. Однако сами пользователи не защищены от случайного удаления каталога с исходными файлами[15].

Настраиваемая структура проекта

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

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

Поддержка разных сред разработки

CMake может создавать файлы проектов для нескольких популярных ИСР, таких как Microsoft Visual Studio, Xcode и Eclipse CDT.

Он также может создавать сценарии сборки для:

  • MSBuild и Nmake в Windows;
  • Unix Make на Unix-подобных платформах, таких как Linux, BSD, macOS и Cygwin;
  • А также Ninja, как на Windows, так и на Unix-подобных платформах.

Для упрощения внедрения поддержки CMake в новые ИСР, рекомендуется использовать файлы преднастройки «CMakePresets.json»[16], для более удобного конфигурирования процесса сборки, а также «File API»[17], содержащий всю необходимую для ИСР информацию.

Поддержка компиляторов

CMake позволяет определять свойства, которые компилятор должен поддерживать, чтобы скомпилировать целевую программу или библиотеку[18].

CMake поддерживает обширный список компиляторов[19], в который входят:

Процесс сборки

Сборка программы или библиотеки с помощью CMake, представляет собой двухэтапный процесс. Во-первых, стандартные файлы сборки создаются (генерируются) из файлов конфигурации (CMakeLists.txt), которые написаны на языке CMake. Затем задействуются системные инструменты сборки (Make, Ninja и т. п.) используемые для фактического создания программ[15][20].

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

Каждый проект после сборки, в поддиректориях содержит «CMakeCache.txt» и каталог файлов Make, что помогает избежать или ускорить этап «перегенерации», после повторного запуска сборки[21].

Типы целей сборки

В зависимости от конфигурации CMakeLists.txt и выбранной цели, файлы сборки могут создавать:

CMake может создавать объектные файлы, которые могут быть связаны с исполняемыми двоичными файлами / библиотеками, избегая динамического (во время выполнения) связывания и вместо этого используя статическое (во время компиляции). Это обеспечивает гибкость в настройке различных оптимизаций (зависимости сборки могут определяться автоматически)[22].

Предкомпилированные заголовочные файлы

Начиная с версии CMake 3.6, можно создавать предварительно скомпилированные заголовочные файлы[23].

Язык

CMake имеет относительно простой интерпретируемый императивный язык сценариев. Он поддерживает переменные, методы обработки строк, массивы, объявления функций и макросов, включение модулей (импортирование). Команды языка CMake (или директивы) считываются CMake из файла CMakeLists.txt. В этом файле указываются исходные файлы и параметры сборки, которые CMake размещает в спецификации сборки проекта (например, в файле Make). Кроме того, файлы с приставкой .cmake, могут содержать сценарии используемые CMake[24].

Синтаксис команд

Аргументы команд разделены пробелами и могут содержать ключевые слова, для разделения групп аргументов. Например, в команде

# Команда установки
install(TARGETS ...                # ЦЕЛИ
        CONFIGURATIONS ...         # КОНФИГУРАЦИИ (Debug, Release…)
        RUNTIME DESTINATION ...)   # (Исполняемый файл, MACOSX_BUNDLE, DLL) МЕСТО_НАЗНАЧЕНИЯ

ключевые слова — TARGETS, CONFIGURATIONS и RUNTIME DESTINATION. В данном случае TARGETS и CONFIGURATIONS служат разделителями между «целями» и «конфигурациями»[25].

Примеры команд CMake, которые определяют цели и их зависимости[26][27][28]:

  • add_executable(...) — определяет цель (исполняемый файл, например .exe, зависит от целевой платформы);
  • add_library(...) — определяет цель (библиотеку, например .so или .dll);
  • target_link_libraries(...) — определяет зависимости указанной цели.

Поддержка JSON

CMake поддерживает извлечение значений данных в переменные из строк JSON (начиная с версии 3.19)[29].

Модули и инструменты

CMake поставляется с большим количеством модулей и инструментов «.cmake». Они облегчают такую работу, как поиск зависимостей (как встроенных, так и внешних, например, FindXYZ модули), инструменты для тестирования исполняемых файлов, упаковка (модуль CPack и команда cpack) и управление зависимостями от внешних проектов (модуль ExternalProject)[30][31]:

  • ctest — используется для тестирования целей, заданных в CMakeLists.txt;
  • ccmake и cmake-gui — настраивает и обновляет переменные конфигурации, предназначенные для целевой системы сборки;
  • cpack — помогает упаковывать и устанавливать программное обеспечение.

CPack

Начиная с версии 2.4.2[32], в состав CMake включены система автоматизированной сборки пакетов программного обеспечения CPack и модуль CMake для взаимодействия с ней. Система позволяет создавать пакеты программного обеспечения для популярных пакетных менеджеров (DEB, RPM, DMG), средства установки программного обеспечения (NSIS для Microsoft Windows), а также архивы со сборкой (TGZ, TBZ2, ZIP, самораспаковывающийся TGZ)[33].

Программные проекты использующие CMake

CMake получил очень широкое распространение среди проектов с открытым исходным кодом, а также среди коммерческих и академических программных проектов.

Проекты с открытым исходным кодом

Научно исследовательские проекты

Программное обеспечение, используемое в эксперименте ATLAS, создано с использованием CMake. Само программное обеспечение написано на C/C++ и Python[36].

Исследовательский институт во франции INRIA применил CMake в медицинском исследовании в проекте SOFA[англ.][37].

Компании и проекты с закрытым кодом

  • Netflix (стриминговый сервис фильмов и сериалов)[38];
  • Second Life (виртуальный мир с элементами социальной сети)[39].

Пример

Пример простого «Hello, World!» проекта на языке CMake.

# Файл — «CMakeLists.txt»

cmake_minimum_required(VERSION 3.16)     # Выбираем минимальную необходимую версию cmake

set(PROJECT_NAME my_project)             # Записываем имя в переменную

project(${PROJECT_NAME})                 # Присваиваем имя проекту

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.3 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. About CMake (англ.). cmake.org. Дата обращения: 15 марта 2022. Архивировано 14 марта 2022 года.
  13. Перевод главы о CMake из книги «The Architecture of Open Source Applications». rus-linux.net (28 августа 2012). Дата обращения: 19 января 2022. Архивировано 7 мая 2021 года.
  14. Глава о CMake из книги «The Architecture of Open Source Applications» (англ.). aosabook.org (2012). Дата обращения: 19 января 2022. Архивировано 7 апреля 2022 года.
  15. 1 2 Александр Нойндорф (Alexander Neundorf). Why the KDE project switched to CMake — and how (англ.). lwn.net (21 июня 2006). Дата обращения: 19 января 2022. Архивировано 20 ноября 2021 года.
  16. CMake documentation: IDE Integration Guide (англ.). cmake.org. Дата обращения: 26 января 2022. Архивировано 26 января 2022 года.
  17. CMake documentation: cmake-file-api(7) (англ.). cmake.org. Дата обращения: 26 января 2022. Архивировано 26 января 2022 года.
  18. CMake compiler feature detect (англ.). scivision.dev (15 ноября 2020). Дата обращения: 4 апреля 2022. Архивировано 22 января 2022 года.
  19. Supported Compilers (англ.). CMake.org. Дата обращения: 4 апреля 2022. Архивировано 21 февраля 2022 года.
  20. CMake documentation: cmake-toolchains(7) (англ.). cmake.org. Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
  21. Дэниел Пфайфер (Daniel Pfeifer). Effective CMake (англ.) (PDF). GitHub (19 мая 2017). Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
  22. CMake documentation: cmake-buildsystem(7) — Object Libraries (англ.). cmake.org. Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
  23. CMake documentation: target precompile headers (англ.). cmake.org. Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
  24. CMake documentation: cmake-language(7) (англ.). cmake.org. Дата обращения: 19 января 2022. Архивировано 21 февраля 2022 года.
  25. Андрей Седильник (Andrej Cedilnik). Cross-Platform Software Development Using CMake (англ.). linuxjournal (3 октября 2003). Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
  26. CMake documentation: cmake-commands(7) ― add_executable (англ.). cmake.org. Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
  27. CMake documentation: cmake-commands(7) ― add_library (англ.). cmake.org. Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
  28. CMake documentation: cmake-commands(7) ― target_link_libraries (англ.). cmake.org. Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
  29. CMake documentation: CMake 3.19 Release Notes (англ.). cmake.org. Дата обращения: 19 января 2022. Архивировано 29 апреля 2022 года.
  30. CMake documentation: cmake-modules(7) (англ.). cmake.org. Дата обращения: 19 января 2022. Архивировано 9 декабря 2021 года.
  31. CMake documentation: cmake-modules(7) — ExternalProject (англ.). cmake.org. Дата обращения: 19 января 2022. Архивировано 21 февраля 2022 года.
  32. CMake:Packaging With CPack - KitwarePublic (англ.). GitLab. Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
  33. CMake:CPackPackageGenerators - KitwarePublic (англ.). GitLab. Дата обращения: 19 января 2022. Архивировано 19 января 2022 года.
  34. Blender wiki — Building Blender (англ.). blender.org. Дата обращения: 19 января 2022. Архивировано 24 января 2022 года.
  35. KDE Adopts CMake (англ.). kitware.com. Дата обращения: 15 марта 2022. Архивировано 14 марта 2022 года.
  36. J. Elmsheuser, A. Krasznahorkay, E. Obreshkov, A. Undrus. Large Scale Software Building with CMake in ATLAS (англ.) (PDF). ЦЕРН. Дата обращения: 19 января 2022. Архивировано 10 ноября 2021 года.
  37. Converting SOFA to CMake (англ.). kitware.com. Дата обращения: 15 марта 2022. Архивировано 14 марта 2022 года.
  38. CMake, CTest, and CDash at Netflix (англ.). kitware.com. Дата обращения: 15 марта 2022. Архивировано 14 марта 2022 года.
  39. Second Life Chooses CMake as its Build System (англ.). kitware.com. Дата обращения: 15 марта 2022. Архивировано 14 марта 2022 года.

Ссылки