Skip to content

python: move to abi3 / py_limited_api build? #1282

@asottile-augment

Description

@asottile-augment

it would be nice to not need to recompile jsonnet for each new python version and instead rely on an abi3 wheel

I believe enabling this isn't too terribly difficult -- essentially following the pattern in this setup.py here: https://github.com/anthonywritescode/explains/blob/c81e7d3c8335daa70c696a04d7c6621932ba1cdf/sample_code/ep135/rev04/setup.py (sample code from my video on the subject)

and an additional carve-out for free threaded python: https://github.com/asottile/ukkonen/blob/5fa9858f0997927d9f9c1794e1741fe8dbd4c1e8/setup.py#L11 (which doesn't support limited api)

and adjusting the c sources to only use functions in the limited api

after that you'd only need to build a single wheel per (platform, architecture) rather than a wheel for each (python, platform, architecture) -- and that wheel would continue to work when new python versions are released. for example for ukkonen above the cp310-abi3 wheels work on any newer python version (matching that platform) without needing to recompile


in the C sources there's not too many things to update it seems:

  • PyUnicode_AsUTF8 -> PyUnicode_AsUTF8AndSize (in stable api as of python 3.10)
  • PySequence_Fast_GET_SIZE -> PySequence_Size (in stable api)
  • PySequence_Fast_GET_ITEM -> PySequence_GetItem (in stable api)

the one downside in this case is the GET_SIZE / GET_ITEM "functions" are macros and converting them to function calls has ever-so-slight overhead (though likely near zero in this particular case -- and depending on link time optimizations might actually be zero)


related / unrelated -- does the jsonnet build still support python 2 ? I see ifdefs for it in the c sources that might be able to be simplified at the same time

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions