From a90196c10bd21225eeae8dd3ca73e76b90c7635e Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Wed, 26 Nov 2025 10:47:42 +0300 Subject: [PATCH] =?utf8?q?=D0=A1=D0=BD=D0=BE=D0=B2=D0=B0=20=D0=B8=D0=B7?= =?utf8?q?=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE?= =?utf8?q?=D1=86=D0=B5=D1=81=D1=81=D0=B0=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8?= =?utf8?q?=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D1=81=D0=B1=D0=BE?= =?utf8?q?=D1=80=D0=BA=D0=B8=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Чего только не напридумывало человечество чтобы сконфигурировать параметры сборки проекта. ./configure из autohell, которому передаются различные --опции и переменные окружения. CMake со своими опциями и способами задания всего этого. Где-то только переменные окружения, возможно используемые сразу же при вызове целей из Makefile. Я точно такой же человек и у меня всякое было в проектах. В последнее годы это был "config" файл, который просто являлся sourceable shell скриптом, где выставляются различные переменные, на основе которых генерируется конфигурация сборки. Выставили переменную "CC" -- вот тебе и путь до нужного компилятора. CFLAGS, PREFIX, и т.д.. Но уже давно глаз зацепился за подход в DJB софте. Просто есть файлик conf-cc, где первая строка указывает на компилятор (или всю строку его запуска), которую можно прочитать банальным: read CC conf/local/ar -- переопределит значение ar, не делая .do цель по его поиску. Ничто не мешает его даже автоматически сгенерировать: -- conf/local/pkg-config-path.do -- PKG_CONFIG_PATH="/foobar/lib/pkgconfig:$PKG_CONFIG_PATH" PKG_CONFIG_PATH="/tmp/keks/libdata/pkgconfig:$PKG_CONFIG_PATH" echo $PKG_CONFIG_PATH $ redo conf/paths/pkg-config-path redo . ../local/pkg-config-path (0.002s) redo conf/paths/pkg-config-path (0.010s) $ cat conf/paths/pkg-config-path /tmp/keks/libdata/pkgconfig:/foobar/local/lib/pkgconfig:/home/stargrave/env/... А как было до этого? 17aa5a765f6ab4a81dc3e14bf8ecdcd5a88ac820. Имелся автоматически генерируемый, не тривиальным скриптом, список vars.list -- переменных которые можно выставить. Есть vars, где все эти переменные прописываются агрегировано из config+config.local файлов. Куча conf/* целей его source-ят и на основе переменных выставляют требуемые флаги или действия (если выставлен *_{CFLAGS,LDFLAGS,LDFLAGS}, то не будет использоваться pkgconf для их поиска для библиотеки). Сейчас все эти скрипты с Perl-ом ушли. Пропало "отображение" одного пространства настроечных параметров в виде переменных (окружения) в иное пространство опций. Надо узнать *FLAGS для такой то библиотеки? По умолчанию будет pkgconf. Надо переопределить? Просто сразу же прописываешь их в conf/local/xxx.rc файл, а не ищешь какими переменными окружения (хотя это просто переменные из config файла) можно повлиять на генерирование результирующего файла. Если в config файле по умолчанию надо поменять какую-то опцию, то возможно пришлось бы inplace редактирование файла проводить, что не очень приятно и чревато ошибками. Теперь со всем этим нет потенциальных проблем. Плюс возможность redo целями генерирования нужных значений, автоматически их кэшируя, а не делая eval config+config.local снова и снова. Недостатков пока не нашёл. Плюсов вижу много. Как минимум, исчезновение целого пласта переменных влияющих на выхлопные файлы конфигурации, меньше кода, простоту переопределения опций машиной (без хрупкого sed -i). Из-за наличия default.do файлов, доку красиво не вышло встроить. Ничто не мешает для каждого отдельного случая просто сделать отдельный .do, но тут уже просто лень. Но если бы тут не было redo, то это бы всё выродилось в в DJB-like подход, хотя цели такой не стояло. -- 2.52.0