[Rpm-maint] [rpm-software-management/rpm] WIP: Use Python Stable ABI for the bindings (PR #2674)

Petr Viktorin notifications at github.com
Mon Oct 2 13:51:32 UTC 2023


> Requiring Python >= 3.7 is not a problem, I'm just curious as to what makes that particular version special.

[`PySlice_GetIndicesEx`](https://docs.python.org/3/c-api/slice.html#c.PySlice_GetIndicesEx) uses a deprecated implementation (on all Python versions) if ABI compatibility with 3.6 is needed.
That implementation is only unsafe in rather exotic edge cases ([indexing by an object that has side-effects on conversion to `int`, or another thread changing a sequence size](https://github.com/python/cpython/issues/72054)), but it does emit a compile-time warning.
If y'all can live with the warning, I think (but haven't checked), that would allow ABI compatibility with Python 3.4+. But, IMO it's better to use version-specific ABI for such old Python versions.

> Requiring Python >= 3.7 is not a problem, I'm just curious as to what makes that particular version special. Cmake >= 3.26 is too new for us to require though, but this shouldn't be hard to do manually. Looking at the cmake's FindPython module, something like target_compile_definitions(_rpm PRIVATE Py_LIMITED_API=x) (where x is the desired version obviosly) for in python/CMakeLists.txt I suppose. There's something about linking to a specific library too, but according to https://docs.python.org/3/c-api/stable.html that's a Windows-only thing.

Here's what's different for stable ABI builds:

- Compiling with `Py_LIMITED_API=0x03070000`, so only “stable” API is allowed.
- Naming the `.so` appropriately. Currently `cmake` outputs `_rpm.so`, which doesn't need to change -- any Python will load it. In the future CMake *might* switch to `_rpm.cpython-311-x86_64-linux-gnu.so`/`_rpm.abi3.so`, but I bet it'll use a `cmake_policy` for that kind of change, so there'll be plenty of time to adjust.
- On Windows, linking with a different Python library if appropriate

So, yeah, adding `target_compile_definitions(_rpm PRIVATE Py_LIMITED_API=Py_LIMITED_API=0x03070000)` will do the trick.
But it might be better to use CMake's `Development.SABIModule` if it's available?


-- 
Reply to this email directly or view it on GitHub:
https://github.com/rpm-software-management/rpm/pull/2674#issuecomment-1743057129
You are receiving this because you are subscribed to this thread.

Message ID: <rpm-software-management/rpm/pull/2674/c1743057129 at github.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rpm.org/pipermail/rpm-maint/attachments/20231002/11755dd7/attachment-0001.html>


More information about the Rpm-maint mailing list