Перейти к содержанию

CMake

Материал из Мегавики — свободной энциклопедии
CMake
Логотип программы CMake
Скриншот программы CMake
Тип Автоматизация сборки, свободное и открытое программное обеспечение и утилита
Автор
  • Kitware[вд]
Разработчики Kitware[вд], Александр Нойндорф[вд], Кен Мартин[вд], Андрей Седильник[вд], Уильям Хоффман[вд] и Брэд Кинг[вд]
Написана на C++ и Си[2]
Интерфейс Qt[3][4][…]
Операционные системы Unix-подобная операционная система[5] и Microsoft Windows[5]
Языки интерфейса английский
Дата выпуска 2000
Аппаратная платформа кроссплатформенность[6]
Последняя версия
Репозиторий gitlab.kitware.com/cmake…
Состояние активное
Лицензия модифицированная лицензия BSD[вд][7][8][…]
Сайт cmake.org (англ.)
Логотип Викисклада Медиафайлы на Викискладе

CMake (МФА [ˈsiːmeɪk]; от англ. Cross-platform Make — «Кроссплатформенный Make»[9]) — это кроссплатформенная утилита, обладающая возможностями автоматизации сборки программного обеспечения из исходного кода. Сам CMake не занимается непосредственно сборкой, а лишь генерирует файлы сборки из предварительно написанного скрипт-файла «CMakeLists.txt» и предоставляет простой единый интерфейс управления. Помимо этого, CMake способен автоматизировать процесс установки и пакетирования.

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

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

История[править]

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

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

Возможности[править]

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

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

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»[15], для более удобного конфигурирования процесса сборки, а также «File API»[16], содержащий всю необходимую для ИСР информацию.

Следующие ИСР поддерживают CMake изначально[17]:

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

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

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

Процесс сборки[править]

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

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. ↑ Parent J. CMake 3.26.3 available for download — 2023.
  2. ↑ The cmake Open Source Project on Open Hub: Languages Page — 2006.
  3. ↑ https://cmake.org/cmake/help/latest/manual/cmake-gui.1.html
  4. ↑ https://cmake.org/runningcmake
  5. ↑ 5,0 5,1 https://cmake.org/download/
  6. ↑ https://cmake.org/
  7. ↑ https://gitlab.kitware.com/cmake/cmake/blob/master/Copyright.txt
  8. ↑ The cmake Open Source Project on Open Hub: Licenses Page — 2006.
  9. ↑ Embracing Modern CMake How to recognize and use modern CMake interfaces (англ.) (PDF). Дата обращения: 4 апреля 2022. Архивировано 20 января 2022 года.
  10. ↑ FLOSS Weekly 111: CMake (англ.). podcast. TWiT Network.. Дата обращения: 19 января 2022. Архивировано 6 октября 2014 года.
  11. ↑ About CMake (англ.). cmake.org. Дата обращения: 15 марта 2022. Архивировано 14 марта 2022 года.
  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. ↑ 14,0 14,1 Александр Нойндорф (Alexander Neundorf). Why the KDE project switched to CMake — and how (англ.). lwn.net (21 июня 2006). Дата обращения: 19 января 2022. Архивировано 20 ноября 2021 года.
  15. ↑ CMake documentation: IDE Integration Guide (англ.). cmake.org. Дата обращения: 26 января 2022. Архивировано 26 января 2022 года.
  16. ↑ CMake documentation: cmake-file-api(7) (англ.). cmake.org. Дата обращения: 26 января 2022. Архивировано 26 января 2022 года.
  17. ↑ CMake documentation: IDEs with CMake integration (англ.). cmake.org. Дата обращения: 11 июля 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 года.

Ссылки[править]

Источник — https://megawiki.ru/wiki/CMake