image

Каждый день я создаю множество однотипных проектов C++ с системой сборки cmake. И открывая проекты в IDE, каждый раз снимаю галочки с типа сборки, оставляя только Debug. А ещё меняю путь к папке сборки. Мелочь, а утомляет.

image
Первое открытие проекта (без пресета)

Я решил изучить, как сделать эти действия автоматически, а в итоге узнал про удобный метод обмена настройками cmake между программистами.

Оказывается, существуют пресеты. Пресеты позволяют вынести параметры сборки из CMakeLists.txt. Это нужно для того, чтобы ваши проекты без проблем собирались под разные платформы и тулчейны. Пресет представляет из себя json-файл, в котором задаются различные параметры, влияющие на сборку проекта (опции конфигурации, флаги компилятора и т. д.).

Так я познакомился с CMakePresets.json. В принципе, ничего сложного, но обилие настроек, о которых расскажет официальная документация может отбить желание в этом разбирать. Я решил разместить здесь минималистичный пример. Другие примеры от The Qt Company доступны здесь.

Не смотря на то, что далее будет показан пример, как это работает в Ubuntu 22 с IDE Qt Creator и проектом Qt, cmake пресеты поддерживаются и в других IDE и могут быть применены в любых cmake проектах. Итак, требования к пресету:

  1. Только Debug сборка;
  2. Чтобы промежуточные файлы компиляции и исполняемый файл приложения лежали в смежной с исходниками папке под названием build;
  3. У меня много экзотических кастомных сборок Qt, но по-умолчанию мне нужна одна конкретная сборка (известен полный путь);
  4. Работа ведётся в Ubuntu 22.

В результате получился файл CMakePresets.json:

{
  "version": 3,
  "configurePresets": [
    {
      "name": "HabrPresetName",
      "displayName": "GoodPreset",
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/../build",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Debug"
      },
      "environment": {
        "PATH": "/home/user/Qt/6.6.0/gcc_64/lib/cmake/Qt6"
      }
    }
  ],
  "buildPresets": [
    {
      "name": "debug",
      "displayName": "Ninja Debug",
      "configurePreset": "HabrPresetName",
      "configuration": "Debug"
    }
  ]
}

где:

  • «PATH» задаёт полный путь до Qt, которую я использую;
  • «binaryDir» задаёт пусть для промежуточных файлов сборки и артефактов сборки;
  • «version» кодирует минимально необходимую версию cmake. Если у вас старый cmake, то его cmake довольно просто собирается из исходных кодов;
  • Описание остальных полей лучше смотреть в документации.

Обратите внимание, что в данном примере путь захардкожен да и ещё с кавычками в определенную сторону.

Файл-пресет CMakePresets.json должен находиться рядом с файлом CMakeLists.txt Также не должно существовать файла CMakeLists.txt.user а если он уже существует, удалите его.

Структура каталога:

image


Теперь при первой попытке открыть проект IDE использует cmake пресет, как показано на рисунке ниже.

Первое открытие проекта с пресетом:

image

Кстати, что касается именно Qt Creator, то единожды обнаруженный пресет он запоминает в своей внутренней базе. Удалить (remove) его можно так

Qt Creator's Preferences dialog:

image

Также приведенный здесь пример доступен в репозитории:

git clone https://github.com/AndreiCherniaev/cmake-presets-linux_qt_simple_example.git

Не только Qt Creator воспринимает CMakePresets.json. Предлагаю вам поделиться своей историей использования cmake пресета и привести свои примеры в комментариях.

Комментарии (1)


  1. abagnale
    16.06.2023 09:29
    +3

    «version» кодирует минимально необходимую версию cmake

    Поле version указывает на версию схемы, которая уже да, требует наличия определённой версии CMake. В вашем примере схема/спецификация версии 3 требует использования CMake как минимум 3.21 (кстати, у вас в репозитории минимальная указана 3.16). В случае с Ubuntu 22.04 дефолтная версия CMake 3.22 (вроде бы), так что здесь нормально (ну и конечно можно поставить последнюю из репозитория Kitware, только надо быть готовым вашим клиентам/пользователям это тоже объяснить, если вдруг у них более старый дистрибутив).

    Также не уверен, что нужно указывать "configuration": "Debug" в buildPresets, раз у вас уже есть "CMAKE_BUILD_TYPE": "Debug", а генератором выбран Ninja.

    Ещё я бы возможно не стал хардкодить весь PATH так безапелляционно, путь до желаемой версии Qt обычно задаётся иными способами, но вы видимо знаете, что делаете, раз отдельно обращаете на это внимание в тексте.

    Ну и вообще у вас как-то всё оказалось про Qt Creator, хотя ничто не предвещало из заголовка. И название CMake неправильно написано :)

    А так да, пресеты это очень здорово, нам они особенно пригодились, когда мы начали использовать vcpkg (а то команды конфигурации стали слишком длинными и разнообразными).