Найти в Дзене
Программист-практик

CMake от начинающего до опытного. Часть 1 - Введение.

Оглавление

Данный материал открывает серию статей о моем опыте практического использования СМаке. Надеюсь серия поможет начинающим программистам в освоении этого крайне важного инструмента в арсенале C++ разработчика.

Так что же такое СМакe? Согласно Википедии, CMake (от англ. cross-platform make — кросс платформенный make) — это кросс платформенное программное средство автоматизации сборки программного обеспечения из исходного кода. При этом сборка в данном случае - это не только процесс получения библиотеки или исполняемого файла из исходного текста программы. Под сборкой понимается комплексный процесс, который может охватывать множество различных аспектов:

• Компиляция исполняемых файлов и библиотек.

• Управление зависимостями разрабатываемого ПО от сторонних библиотек, таких как boost, fmt, poco и т.д.

• Тестирование на предмет соответствия функционала разработанного ПО установленным требованиям.

• Упаковка собранного ПО в формате, подходящем для его последующей установки на целевую систему.

• Установка собранного пакета на целевой системе.

• Создание документации на основании исходных текстов.

Хотя первая версия CMake была реализована более 20 лет назад, проблема автоматизации процесса сборки кода намного старше, поэтому существует множество альтернативных продуктов, например: GNU Make, Autotools, SCons, Ninja, Premake и другие. Некоторый из них могут использоваться в процессе работы CMake. Каковы же причины успеха, позволившие CMake стать отраслевым стандартом для программистов на C и C++?

  1. CMake кросс платформенный — он поддерживает сборку для различных ОС, в том числе Windows, Linux, macOS.
  2. Он позволяет генерировать файлы проектов для популярных IDE, таких как Microsoft Visual Studio, Xcode, Qt и т.д. Также разработку можно вести и без использования IDE.
  3. CMake вводит в обиход разработчика новые уровни абстракции — позволяет группировать файлы в повторно используемые цели и проекты. Благодаря этому существует множество проектов, которые собраны с помощью CMake, и предлагают простой способ их подключения к вашему проекту.
  4. CMake рассматривает тестирование собранного приложения, его упаковку и установку как неотъемлемую часть процесса сборки.

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

Процесс состоит из трех этапов:

  1. Конфигурация.
  2. Генерация.
  3. Сборка.

Давайте рассмотрим их подробнее.

Этап конфигурации

На этом этапе считываются данные проекта, хранящиеся в каталоге, называемом деревом исходников, и подготавливается выходной каталог (дерево сборки) для этапа генерации. CMake начинает с проверки того, был ли проект настроен ранее и считывает кэшированные переменные конфигурации из файла CMakeCache.txt. При первом запуске процесса сборки файла конфигурации нет, поэтому создается пустое дерево сборки и собираются все сведения о среде, в которой работает CMake. В том числе, какова архитектура ЦП, какие компиляторы установлены и т.д. Для сборки проекта нужен файл конфигурации, который называется CMakeLists.txt и находится в корневой папке проекта. В CMakeLists.txt записана программа сборки проекта, написанная на специальном языке. Эта программа сообщает CMake о структуре проекта, его целях и зависимостях (библиотеках, используемых в проекте, а также других пакетах CMake, необходимых для сборки). CMake сохраняет собранную информацию(сведения о системе, конфигурации проекта, журналы и временные файлы, которые используются для следующего шага) в дереве сборки. В частности, создается файл CMakeCache.txt для хранения таких данных как пути к компиляторам и другим инструментам), что экономит время при повторном выполнении процесса сборки.

этап генерации

После считывания конфигурации проекта CMake генерирует систему сборки для среды, в которой он работает. Система сборки — это файлы конфигурации для других инструментов сборки (например, Makefiles для GNU Make или Ninja и файлы проекта IDE для Visual Studio). Этап генерации выполняется автоматически после этапа конфигурации.

этап сборки

Чтобы создать результаты сборки, указанные в CMakeLists.txt (например, исполняемые файлы и библиотеки), CMake должен запустить соответствующий инструмент сборки. Его можно вызвать напрямую, через IDE или с помощью соответствующей команды CMake. В свою очередь, эти инструменты сборки будут выполнять шаги для создания целевых артефактов с помощью компиляторов, компоновщиков, инструментов статического и динамического анализа, тестовых фреймворков и т.д.

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

В следующей статье начнем рассмотрение языка написания файла CMakeLists.txt. Продолжение следует...