ALT Linux Team development discussions
 help / color / mirror / Atom feed
* [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