Pull to refresh

Comments 19

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

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

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

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

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

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

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

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

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

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

Sign up to leave a comment.

Articles