Pull to refresh
2048.7
Timeweb Cloud
То самое облако

Выносим за скобки настройки CMake

Level of difficultyEasy
Reading time3 min
Views5.6K
Fanny image about cmake

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

First time opening project without any preset. Qt Creator's Configure dialog 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 а если он уже существует, удалите его.

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

Right folder structure image


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

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

First time opening project with my preset. Qt Creator's Configure dialog image

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

Qt Creator's Preferences dialog:

Qt Creator's Preferences dialog image

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

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

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

Tags:
Hubs:
Total votes 25: ↑25 and ↓0+25
Comments1

Articles

Information

Website
timeweb.cloud
Registered
Founded
Employees
201–500 employees
Location
Россия
Representative
Timeweb Cloud