Как стать автором
Поиск
Написать публикацию
Обновить

Комментарии 19

Такое ощущение, что это написано под дулом CHATGPT. Простыня похожа на json, но не похожа на cmake.

Json тут правильный, просто автор - кэп, открыл для себя cacheVariables.

До этого они использовались, но одно дело когда тебе нужно запомнить 1 или 2 переменные, а когда их много как поступать?

CMakeLists.txt в статье рассмотрел, CMakePresets.json не смог.

Подразумевается, что читающий уже знаком с пресетами и это не гайд чтобы писать все от А до Я.

Кто знаком, тот не увидит ничего нового. Кто не знаком, тот не увидит воще ничего ;)

Так механизм пресетов в CMake работает через JSON

В одной системе 2 синтаксиса, красивое.

и если в серьезку завозить флаги в пресеты: да еще под дебаг-релиз там простыня такая становиться что совсем неичитаемо

За счёт вынесения пресетов в разные файлы и механизма наследования это становится приемлемым

Модульность библиотеки достигается наличием в 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. Могут вообще в любой момент его формат поменять и будут правы.

Был бы у cmake человекопонятный синтаксис представления данных.. но всё что он умеет - списки, причем максимально вс₽@тым образом. Json сбоку немного добавляет забавности.

сейчас все это можно написать в 2 раза проще и короче

Переписать же . А уже написанное работает, кушать не просит.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации