Каждый день я создаю множество однотипных проектов C++ с системой сборки cmake. И открывая проекты в IDE, каждый раз снимаю галочки с типа сборки, оставляя только Debug. А ещё меняю путь к папке сборки. Мелочь, а утомляет.
Первое открытие проекта (без пресета)
Я решил изучить, как сделать эти действия автоматически, а в итоге узнал про удобный метод обмена настройками cmake между программистами.
Оказывается, существуют пресеты. Пресеты позволяют вынести параметры сборки из CMakeLists.txt. Это нужно для того, чтобы ваши проекты без проблем собирались под разные платформы и тулчейны. Пресет представляет из себя json-файл, в котором задаются различные параметры, влияющие на сборку проекта (опции конфигурации, флаги компилятора и т. д.).
Так я познакомился с CMakePresets.json. В принципе, ничего сложного, но обилие настроек, о которых расскажет официальная документация может отбить желание в этом разбирать. Я решил разместить здесь минималистичный пример. Другие примеры от The Qt Company доступны здесь.
Не смотря на то, что далее будет показан пример, как это работает в Ubuntu 22 с IDE Qt Creator и проектом Qt, cmake пресеты поддерживаются и в других IDE и могут быть применены в любых cmake проектах. Итак, требования к пресету:
- Только Debug сборка;
- Чтобы промежуточные файлы компиляции и исполняемый файл приложения лежали в смежной с исходниками папке под названием build;
- У меня много экзотических кастомных сборок Qt, но по-умолчанию мне нужна одна конкретная сборка (известен полный путь);
- Работа ведётся в 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 а если он уже существует, удалите его.
Структура каталога:
Теперь при первой попытке открыть проект IDE использует cmake пресет, как показано на рисунке ниже.
Первое открытие проекта с пресетом:
Кстати, что касается именно Qt Creator, то единожды обнаруженный пресет он запоминает в своей внутренней базе. Удалить (remove) его можно так
Qt Creator's Preferences dialog:
Также приведенный здесь пример доступен в репозитории:
git clone https://github.com/AndreiCherniaev/cmake-presets-linux_qt_simple_example.git
Не только Qt Creator воспринимает CMakePresets.json. Предлагаю вам поделиться своей историей использования cmake пресета и привести свои примеры в комментариях.