Comments 19
Такое ощущение, что это написано под дулом CHATGPT. Простыня похожа на json, но не похожа на cmake.
Json тут правильный, просто автор - кэп, открыл для себя cacheVariables
.
Так механизм пресетов в CMake работает через JSON
Модульность библиотеки достигается наличием в CMakeLists.txt условных конструкций, проверяющих определенные флаги, вынести эту логику за скобки пресеты не могут
кое-что таки могут, там же есть поля condition.
А вообще да, крайне полезный механизм. По личному опыту, в большинстве коммерческих проектов пользуются давно устаревшими сборочными системами (или, в случае с cmake, устаревшими фичами из устаревших версий), обмазанными поверх какими-нибудь костылями на питоне, и даже не задумываются о том что сейчас все это можно написать в 2 раза проще и короче. Пользуясь только стандартными фичами из новых версий и серьезно сократив затраты на разработку и поддержку.
Да, известная проблема cmake в том, что никто не знает, как с ней работать. Всему причина корявая документация и постоянная переделка API. Проще на питоне написать костыли, чем постоянно следить что там добавили/убрали в cmake
Пример кривой документации? Какой API переделали?
Официальная документация не проясняет как правильно писать хорошие CMake Config и CMake Modules. Абстракция опции для сборки протекла под Windows с релизом толи MSVC 2012, то ли MSVC 2015, и архитектура указывается теперь специальным образом. Синтаксис условных конструкций с разрешением переменных и значений переменных - как минное поле. Как выше уже отметили, JSON и не-JSON для одного инструмента, для ручного редактирования - ну такое. А если еще и CMakeCache.txt в расчет брать, то вообще 3 разных синтаксиса, один из которых - вообще для машиночитаемости.
Но что есть, то есть. Мне CMake все равно нравится больше всех остальных систем сборки и генерации.
Ещё оно как бы декларативное, но не совсем. Какие то части синтаксиса case sensitive, но в основном нет. Интересное ;)
оно как бы декларативное, но не совсем
В идеальном мире система сборки должна быть на 100% декларативной.
Увы, в реальности это практически невозможно. Всегда будет целая куча моментов, которые заранее в системе сборки предусмотреть невозможно, и которые будут скриптовать, кастомизировать, автоматизировать и т. д. и т. п. Остается только выбор будет ли это скрипт в рамках самой системы сборки (хоть сколько-нибудь единообразный и интегрируемый в остальную систему), или внешний костыль на bash/Python/etc.
CMake давным давно начал как по большей части императивный скрипт, с тех пор старается все сделать максимально декларативно, но полностью от императивности никогда не избавится.
Абстракция опции для сборки протекла под Windows с релизом толи MSVC 2012, то ли MSVC 2015, и архитектура указывается теперь специальным образом.
Не думаю, что это CMake виноват, что задание архитерктуры формализовано/стандартизовано только для системы сборки MSBuild.
Если бы у других систем сборки (Makefiles, Ninja и т. п.) были бы какие-то стандартные механизмы для выбора архитектуры, тогда наверное CMake смог бы абстрагировать эту опцию единым для всех образом.
Как выше уже отметили, JSON и не-JSON для одного инструмента, для ручного редактирования - ну такое.
Выглядит конечно так себе, но есть ли какие-то другие варианты?
Конфигурационный файл пресетов на языке CMake? CMakeLists.txt на JSON? Один другого хуже.
Кроме того, CMakeLists.txt это вынужденно императивный язык. А конфиги пресетов -- это именно конфиги, просто декларативный набор данных. В какой-то мере это как жаловаться что у C++ и clang-format разный синтаксис =).
Вообще если уж придираться к формату -- я бы пожаловался на выбор JSON для конфигов, которые явно будут часто редактироваться вручную. Ну есть же YAML (напоминаю, что JSON это подмножество YAML, по сути YAML это JSON с возможностью нормального, человеческого форматирования).
А если еще и CMakeCache.txt в расчет брать
А не надо CMakeCache.txt брать =) это внутренние дела CMake. Могут вообще в любой момент его формат поменять и будут правы.
сейчас все это можно написать в 2 раза проще и короче
Переписать же . А уже написанное работает, кушать не просит.
Истинное предназначение пресетов в СMake