Interested Article - CMake

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

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

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

История

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

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

Возможности

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

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

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

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

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

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

Может создавать сценарии сборки для MSBuild и в Windows, make на Unix-подобных системах, Ninja . Для упрощения внедрения поддержки CMake в новые среды разработки используются файлы преднастройки CMakePresets.json . Среди сред, изначально поддерживающих CMake — CLion , KDevelop , Qt Creator , Visual Studio .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример

Проект « 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. — 2006.
  2. — 2006.
  3. (англ.) (PDF). Дата обращения: 4 апреля 2022. 20 января 2022 года.
  4. (англ.) . podcast. TWiT Network. . Дата обращения: 19 января 2022. 6 октября 2014 года.
  5. . rus-linux.net (28 августа 2012). Дата обращения: 19 января 2022. 7 мая 2021 года.
  6. (англ.) . aosabook.org (2012). Дата обращения: 19 января 2022. 7 апреля 2022 года.
  7. Alexander Neundorf. (англ.) . lwn.net (21 июня 2006). Дата обращения: 19 января 2022. 20 ноября 2021 года.
  8. (англ.) . scivision.dev (15 ноября 2020). Дата обращения: 4 апреля 2022. 22 января 2022 года.
  9. Daniel Pfeifer. (англ.) (PDF). GitHub (19 мая 2017). Дата обращения: 19 января 2022. 19 января 2022 года.
  10. Андрей Седильник (Andrej Cedilnik). (англ.) . Linux Journal (3 октября 2003). Дата обращения: 19 января 2022. 19 января 2022 года.
  11. (англ.) . cmake.org . Дата обращения: 19 января 2022. 19 января 2022 года.
  12. (англ.) . cmake.org . Дата обращения: 19 января 2022. 19 января 2022 года.
  13. (англ.) . cmake.org . Дата обращения: 19 января 2022. 19 января 2022 года.
  14. (англ.) . cmake.org . Дата обращения: 19 января 2022. 29 апреля 2022 года.
  15. (англ.) . cmake.org . Дата обращения: 19 января 2022. 9 декабря 2021 года.
  16. (англ.) . cmake.org . Дата обращения: 19 января 2022. 21 февраля 2022 года.
  17. (англ.) . GitLab . Дата обращения: 19 января 2022. 19 января 2022 года.
  18. (англ.) . GitLab . Дата обращения: 19 января 2022. 19 января 2022 года.
  19. J. Elmsheuser, A. Krasznahorkay, E. Obreshkov, A. Undrus. (англ.) (PDF). ЦЕРН . Дата обращения: 19 января 2022. 10 ноября 2021 года.
  20. (англ.) . kitware.com . Дата обращения: 15 марта 2022. 14 марта 2022 года.
  21. (англ.) . kitware.com . Дата обращения: 15 марта 2022. 14 марта 2022 года.
  22. (англ.) . kitware.com . Дата обращения: 15 марта 2022. 14 марта 2022 года.

Ссылки

  • // Журнал «Открытые системы», 2007/03
  • // Журнал «Linux Format», #99 (12), Декабрь 2007 (wiki)
  • (англ.)
Источник —

Same as CMake