[devel] Py_LIMITED_API
Daniel
kotopesutility на altlinux.org
Вт Авг 4 23:26:29 MSK 2026
Hi!
rpm-build-python3 теперь умеет работать с Py_LIMITED_API:
1. Появился волшебный макрос %set_python3_limited_api, который через
%optflags выставляет Py_LIMITED_API в используемую версию python3.[1]
2. Появился специальный brp-скрипт, который, проходя по $RPM_PYTHON3_PATH
проверяет, какие Python3 символы использует python3 so-модуль и какой у него
ABI-суффикс:
2.1.1 Если ABI-суффикс .abi3 (то есть типа использует стабильное Python3
API), а у самого зависимость на нестабильные символы, то brp-скрипт карает
криком и падением (контролируется макросом
%{relax,strict}_python3_verify_abi)
2.1.2 Если ABI-суффикс .cpython3-.* (то есть он типа ABI-зависим от
конкретного субмажора python3), а у самого зависимость только лишь на
стабильные символы, то brp-скрипт извещает об этом явлении и переименовывает
модуль в .abi3.so
3. python3.req.py проверяет и требуемые от python3 символы so-модуля, и
ABI-суффикс:
3.1 Если символы стабильные, суффикс .abi3 или пустой, то зависимость
генерируется на python3-ABI(%arch) (без суффикса .{субмажор})
3.2 Если символов вообще нет, суффикс пустой, то зависимость вообще не
генерируется
3.3 Во всех остальных случаях генерируется та же зависимость, что и раньше
Новые макросы:
1. %_python3_verify_abi - контролирует реакцию brp-скрипта на несовпадение
заявленной и реальной стабильности требуемых python3 символов
1.1 %strict_python3_verify_abi - включает жесткую проверку (по умолчанию,
уже включено)
1.2 %relax_python3_verify_abi - облегчает эту проверку
2. %_python3_modules_rename_path - контролирует пути, по которым brp-скрипт
может переименовывать модули (по умолчанию, в site-packages):
2.1 %none_python3_modules_rename - нигде нельзя переименовывать
2.2 %all_python3_modules_rename - везде можно
2.3 %add_python3_modules_rename_path() - добавляет путь, по которому можно
переименовывать
FAQ:
1. Зачем нужен brp-скрипт?
- С одной стороны, жестоко обманывать пользователей, ложно заявляя
использование стабильных символов. С другой, если модуль использует
лишь стабильные символы и у него .abi3 суффикс (мб, после
переименования), то его не нужно пересобирать
2. Зачем проверять символы в python3.req.py:
- Безопасно ослабляя зависимости модулей, мы можем ослабить и зависимости
пакета, возможно, уменьшая тем самым размер задания с бутстрапом новой
субмажорной версией python3
3. Можно ли еще в каких пакетах добиться зависимости лишь от стабильного
C-API python3?
- Да, как правило, upstream сам это делает, либо явно врубая
Py_LIMITED_API средствами сборки, либо неявно просто используя
ограниченный список символов. Но есть все тот же макрос
%set_python3_limited_api. Проверяйте, собирается ли Ваш пакет с ним.
Но будьте осторожны, так как возможно такое, что модуль НЕ соберется,
но сборочная система это прожует и либо не сгенерит модуль, либо
заменит его на код на голом python3. Так что ошибки не будет, тесты
пройдут, а состав пакета изменится. Также макрос может
не подействовать, как, например, в случае
python3-module-logbook или python3-module-pycryptodome
4. А можно везде поврубать Py_LIMITED_API и отрубить лишь в некоторых?
- Нет. К сожалению, тех, в которых можно, меньше, чем тех, в которых
нельзя
5. Много ли пакетов, где brp-скрипт выдал ошибку на несоответствие реальной
и заявленной стабильности требуемых от python3 символов в so-модуле?
- Нет, мы нашли всего 1 (python3-module-yyjson). И там апстрим уже сидит
с готовыми исправлениями.
6. Часто ли приходится запрещать brp-скрипту переименование модулей?
- Мы увидели необходимость лишь в одном случае[2], когда:
+ Оставались модули, которые требовали нестабильных символов,
следовательно, зависимость пакета не облегчилась бы;
+ Требовалась явная модификация спека, поскольку в списке файлов
модуль перечислялся со старым суффиксом (cpython3-*).
7. А если модуль собирается с Py_LIMITED_API версии 3.X, а
в sisyphus 3.X+1?
- Все-таки попробуйте врубить %set_python3_limited_api,
скорее всего, прокатит. В большинстве отловленных
случаев проблема сводится к нехватке include-ов и мы
это починили на стороне python3.
Спасибо Ване (imz@) за соучастие во всем этом, включая ревью и идеи по
дизайну. Также спасибо Грише (grenka@) за выявление ряда недочетов,
а также Глебу (glebfm@) за обсуждения вот этого всего.
[1] -
https://git.altlinux.org/gears/b/blueman.git?p=blueman.git;a=commitdiff;h=4fb56a7b612bc45ab48743beb6e750392ffb76e8
[2] -
https://git.altlinux.org/people/kotopesutility/packages/python3-module-pygobject3.git?p=python3-module-pygobject3.git;a=commitdiff;h=be71b30703929686b80a45822e7551835b1af603
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : signature.asc
Тип : application/pgp-signature
Размер : 833 байтов
Описание: отсутствует
Url : <http://lists.altlinux.org/pipermail/devel/attachments/20260804/1277d769/attachment-0001.bin>
Подробная информация о списке рассылки Devel