* [devel] Py_LIMITED_API
@ 2026-08-04 20:26 Daniel
0 siblings, 0 replies; only message in thread
From: Daniel @ 2026-08-04 20:26 UTC (permalink / raw)
To: devel
[-- Attachment #1: Type: text/plain, Size: 7800 bytes --]
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
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2026-08-04 20:26 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-08-04 20:26 [devel] Py_LIMITED_API Daniel
ALT Linux Team development discussions
This inbox may be cloned and mirrored by anyone:
git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
public-inbox-index devel
Example config snippet for mirrors.
Newsgroup available over NNTP:
nntp://lore.altlinux.org/org.altlinux.lists.devel
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git