[devel] в защиту __cargo

Arseny Maslennikov arseny на altlinux.org
Ср Окт 28 15:11:03 MSK 2026


On Tue, Dec 06, 2005 at 07:52:44PM +0300, Dmitry V. Levin wrote:
> > > Почему?  Одно другого не исключает.  Чрезмерное
> > > употребление макросов снижает читабельность spec-файлов.
> > Тогда было бы неплохо увидеть более официальное обоснование
> > существования %__mv и компании, чем догадки. :)
> %__mv и компания -- это внутренняя кухня rpmbuild, используется
> для запуска mv и компании внутри rpmbuild.
Это утверждение истинно.
Но ведь rpmbuild в тех местах, где он в коде на Си подставляет фрагменты
шелльного текста, мог бы тоже вызывать `mv` словом, без слоя косвенности.
Зачем-то при разработке rpmbuild вставить _такой_ шарнир (i. e. слой косвенности)
понадобилось. Зачем? Полагаю, что чёткий ответ на этот вопрос нам всем
поможет договориться и прочертить границу между чрезмерным и уместным.

Уточню свою мысль.
Например, в пресловутых участках кода rpmbuild можно было бы фрагменты
целиком (или их контекстно малозависимые части) макрообозвать и вытащить
в macros.in. Но почему-то авторы обернули именно пачку утилит. Видимо,
в таких обёртках есть ценность за пределами участков кода rpmbuild.

> Появление этих
> макросов в spec-файлах, видимо, и есть злоупотребление
> макросами.
В спеках явно обращаться к этим __ (т. е. предусматривать перегрузку)
действительно нужно нечасто.
А вот в сложных макрообёртках вроде %cmake, %configure это полезно, и
торчащих зубов __ в спеке не будет.

Если возражение против %__mv было связано только с тем, что у
человеческого читателя спеков дёргается глаз, то избавиться от этого
можно кучей способов, среди которых %define mv __mv, или же просто
забить и писать в спеке по имени. (Там в PATH есть каталог для
обёрток, он стоит первым. Тот, кто желает разок собрать пакет так, чтобы
в окружении были обёртки, может добавить ещё и нагенерить туда обёрток от души.)

On Wed Oct 28, 2026 at 1:43 PM MSK, Rx wrote:
> Здраствуйте!
>
> Первая мысль которая приходит в голову при виде чего либо, что 
> начинается с "_" это то, что это часть внутреннего интерфейса которую 
> стоит трогать только если ты работаешь над ней и знаешь за что она 
> отвечает.  На этот счёт даже есть отдельная старенькая статья  2009-ого 
> TypicalPackagingErrors/InternalMacros 
> <https://www.altlinux.org/TypicalPackagingErrors/InternalMacros>.
Ага. Я забыл про эту страницу :)

> Я подозревал что все макросы с префиксами __ это глобальное 
> переопределение утилит, но насколько глобальные? Было бы неплохо 
> зафиксировать данное соглашение статьёй либо же полноценной политикой.
По итогам обсуждения в сообществе буду готов составить.

> 28.10.2026 11:13, Arseny Maslennikov пишет:
>> On Wed, Oct 28, 2026 at 11:08:02AM +0300, Arseny Maslennikov wrote:
>>> On Wed, Oct 28, 2026 at 10:27:54AM +0300, Rx wrote:
>>>>         По результатам пересборки пакетов картина следующая:
>>>>
>>>> Из 432 пакетов упало 29:
>>>> phrog   aris - Пакет использует устаревший макрос %__cargo. Исправление:
>>> Здравствуйте!
>>>
>>> Я хотел бы предложить оставить макрос __cargo.
>> И, наверное,
>>
>>      __rustc %_bindir/rustc
>>
>> тоже нужен, если его вдруг нет.
> Не особо представляю потребителя данного макроса, сейчас единственным 
> таким потребителем является сам rust. Все остальные вызовы rustc это 
> извлечение версии llvm, хостовой архитектуры и прочей информации которую 
> можно вывести в отдельные макросы.

Потребитель номер раз — ядро Linux (нас это коснётся в конце концов).
Потребитель номер два — с недавних пор systemd.
> - Only the core, alloc and libc crates. Rust code is no_std and there
>   are no other crates. The libc crate isn't needed yet, the bindings
>   generated from the tree's own headers cover libc. And like the
>   kernel we don't use alloc either. Its collections abort when memory
>   runs out. systemd_shared has its own Box and Vec instead, which work
>   like the kernel's: everything that allocates returns an error and
>   there's no global allocator.
> - C linkage only. libsystemd-shared and the dlopen machinery stay as
>   they are. A program written in Rust links libsystemd-shared
>   dynamically just like the C programs do and declares its dlopen()
>   dependencies in .note.dlopen. The Rust crates are linked statically
>   into the programs using them.
> 
> So nothing of the Rust standard library ends up in a program or in
> libsystemd-shared. Per HACKING.md the stripped test-cli-rust binary is
> 32 KB with LTO against 20 KB for its C twin.
https://github.com/systemd/systemd/commit/021112961bd64aec54a1f1e6a6c8fda8b732b705

Я не сомневаюсь, что последуют ещё. :)

>>> Эти бла-бла в начале не просто так; такой макрос по (конечно, не очень
>>> явному) соглашению предназначен для того, чтобы можно было передефайнить
>>> все обращения к %_bindir/cargo в генерируемых скриптах.
>>> Аналогично устроены __make, __ninja,
>>> __mv, __cp, __rm, __install, __chmod, __chown,
>>> __tar, __cpio, __gzip, __bzip2, __xz,
>>> и все остальные.
>>>
>>> Оператор может заменить любую из этих утилит на собственную обёртку, на подкоманду в
>>> multi-call binary навроде busybox, на taskset -c, что угодно.
>>>
>>>      rpmbuild --define "__tar /usr/local/bin/busybox tar" "$@"
>>>      rpmbuild --define "__ninja taskset -c $(</sys/devices/cpu_atom/cpus) ninja" "$@"
>>>      rpmbuild --define '__make bear -- make' "$@"
>>>
>>> Примеры, ясное дело, не исчерпывающие. :)
>>>
>>> Это предусмотренный в подвижной системе дополнительный шарнир:
>>> он нужен не всем и не всегда, но существует.
>> Можно, конечно, оставить оба.
>> "%__cargo" как обозначение "как вызвать программу cargo",
>> "%cargo" как обращение к прагматике cargo.
>>
>> Тогда packager сможет, например, сказать:
>>
>>      rpmbuild --define 'cargo %__cargo auditable' "$@"
>>
>> и у него заработает всё, что сегодня у вас раскрывает "%cargo".
>>
>> В любом случае надо это всё задокументировать, чтобы не пропало.
>
> Если заменить cargo на cargo auditable для всех пакетов и оставить 
> возможность отката на "оригинальный" cargo, то возможно в таком случае 
> есть смысл сохранить макрос, но как будто бы "%define cargo cargo" будет 
> более чем достаточно.

OK, так тоже можно, убедили.
По этому вопросу я амбивалентен; интеллектуальный оператор и так и
так справится, а детерминированную программу, наверное, можно и
подхакать всегда.
Видимо, надо дойти до результата обсуждения выше и тогда решить. :)
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : signature.asc
Тип     : application/pgp-signature
Размер  : 870 байтов
Описание: отсутствует
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20261028/13098843/attachment.bin>


Подробная информация о списке рассылки Devel