CMake

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

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

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

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

История

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

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

Возможности

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

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

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 позволяет определять свойства, которые компилятор должен поддерживать, чтобы скомпилировать целевую программу или библиотеку[14].

CMake поддерживает обширный список компиляторов, в который входят в том числе Clang (включая Clang из Xcode), GNU GCC, MSVC, SunPro, Intel C++.

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

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

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

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

В зависимости от конфигурации 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 служат разделителями между «целями» и «конфигурациями»[16].

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

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

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

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

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

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

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

Распространение

Среди проектов с открытым исходным кодом, использующих CMake — Boost, Blender, ReactOS, MySQL, KDE, FreeCAD, WebKit. Среди закрытых проектов, собираемых с использованием CMake — программное обеспечение эксперимента ATLAS[25], медицинский проект SOFA[англ.][26], внутренние системы Netflix[27] и Second Life[28].

Пример

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

Ссылки