This minimal extension demoes wide Stable ABI compatibility.
Four wheels to cover 3 CPython versions × 3 operating systems × 2 GIL/free-threading variants.
Note that up-to date tools -- ones that are aware of the abi3t wheel tag
(for example, pip >= 26.1, packaging >= 26.1, uv >= 0.11.3).
CPython versions: 3.13, 3.14, and 3.15.0b1+.
OSs: Linux (64-bit x86), macOS (universal2), Windows (64-bit x86) (Covering other CPU architectures is possible but would mostly just complicate this demo.)
The shim
The file ft_compat.h contains the compatibility shim needed to make the
new API necessary for abi3t (PEP 793 PyModExport & PEP 803 PySlot)
work on older versions of Python.
It's intended to be reusable, and includes a usage comment.
Note that the extension must be compiled with CPython 3.15+.
Installation
python -m pip install abi3-abi3t-universal
Usage
There's one trivial function that increments and returns a number, mostly to demo module state.
>>> import abi3_abi3t_universal
>>> abi3_abi3t_universal.increment_value()
0
>>> abi3_abi3t_universal.increment_value()
1
>>> abi3_abi3t_universal.increment_value()
2
Caveats
As abi3t is not widely supported in build tools at
the time of writing, we use Setuptools, and reach into its internals
to select the appropriate tags.
Windows
On Windows, until CPython 3.15.0b2, separate abi3 and abi3t wheels
are required due to DLL linkage details.
(This will not be fixed for 3.13 and 3.14.)
This project builds two wheels:
- abi3_abi3t_universal-0.2-cp313-abi3-win_amd64.whl
- abi3_abi3t_universal-0.2-cp313-abi3t-win_amd64.whl
For real libraries, it might be more practical to build 4 wheels, three of which can be dropped when 3.13 & 3.14 support is removed:
- abi3_abi3t_universal-0.2-cp313-cp313t-win_amd64.whl (for 3.13 FT)
- abi3_abi3t_universal-0.2-cp314-cp314t-win_amd64.whl (for 3.14 FT)
- abi3_abi3t_universal-0.2-cp313-abi3-win_amd64.whl (for 3.13 GIL & 3.14 GIL)
- abi3_abi3t_universal-0.2-cp315-abi3.abi3t-win_amd64.whl (3.15+)
(The first two can be merged into cp313.cp314-cp313t.cp314t but I'd be a bit worried about tool support for such a tag.)
Licence
All my contributions are marked CC0 1.0, see LICENCE.CC0.
The file ft_compat.h copies/adapts definitions from CPython headers,
as necessary for compatibility.
I'm pretty sure that's fair use, but I'm not a lawyer.
Follow the PSF licence to be safe.
Metadata
Release files for abi3-abi3t-universal 0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Actions Reset | |||
|---|---|---|---|---|
| abi3_abi3t_universal-0.2-cp313-abi3t-win_amd64.whl | CPython 3.13 | abi3t | Windows x86-64 | Details for abi3_abi3t_universal-0.2-cp313-abi3t-win_amd64.whl |
| abi3_abi3t_universal-0.2-cp313-abi3.abi3t-manylinux1_x86_64.manylinux_2_5_x86_64.whl | CPython 3.13 | abi3, abi3t | Linux glibc 2.5+ x86-64 | Details for abi3_abi3t_universal-0.2-cp313-abi3.abi3t-manylinux1_x86_64.manylinux_2_5_x86_64.whl |
| abi3_abi3t_universal-0.2-cp313-abi3.abi3t-macosx_10_15_universal2.whl | CPython 3.13 | abi3, abi3t | macOS 10.15+ universal2 (ARM64, x86-64) | Details for abi3_abi3t_universal-0.2-cp313-abi3.abi3t-macosx_10_15_universal2.whl |
| abi3_abi3t_universal-0.2-cp313-abi3-win_amd64.whl | CPython 3.13 | abi3 | Windows x86-64 | Details for abi3_abi3t_universal-0.2-cp313-abi3-win_amd64.whl |
Total release size: 47.6 kB
Release files / abi3_abi3t_universal-0.2-cp313-abi3t-win_amd64.whl
| Download URL | abi3_abi3t_universal-0.2-cp313-abi3t-win_amd64.whl |
|---|---|
| Size | 11.4 kB |
| Tags | CPython 3.13 Windows x86-64 abi3t |
|
SHA-256 checksum How to use checksums |
613cb2cdc8b44ac962150a82b1f4508cb56ad37f02234e7ba0965d7c129d712e
|
|
BLAKE2b-256 checksum How to use checksums |
9369e79d6bc92581cf266ede96cfe374bbfd85deae33299bd2e5770434f4f91c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 18, 2026.
Transparency logRelease files / abi3_abi3t_universal-0.2-cp313-abi3.abi3t-manylinux1_x86_64.manylinux_2_5_x86_64.whl
| Download URL | abi3_abi3t_universal-0.2-cp313-abi3.abi3t-manylinux1_x86_64.manylinux_2_5_x86_64.whl |
|---|---|
| Size | 14.0 kB |
| Tags | CPython 3.13 Linux glibc 2.5+ x86-64 abi3 abi3t |
|
SHA-256 checksum How to use checksums |
9156ea7a9c144193f2456bd7663fafa7d8b44e5ba75f39aa069feff3b4b07dec
|
|
BLAKE2b-256 checksum How to use checksums |
bc111413e559c5164d1299786977c41db640100d47e2b0d96aab13d7eb6c0cbe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 18, 2026.
Transparency logRelease files / abi3_abi3t_universal-0.2-cp313-abi3.abi3t-macosx_10_15_universal2.whl
| Download URL | abi3_abi3t_universal-0.2-cp313-abi3.abi3t-macosx_10_15_universal2.whl |
|---|---|
| Size | 10.8 kB |
| Tags | CPython 3.13 abi3 abi3t macOS 10.15+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
84ecaca439eb99db8d071fb926047ad6e460e2c42671cee653839c134f1c6a31
|
|
BLAKE2b-256 checksum How to use checksums |
867bbd6a19d275524e9635b1fa336547da7665a0a36d483d01cbf611051b9075
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 18, 2026.
Transparency logRelease files / abi3_abi3t_universal-0.2-cp313-abi3-win_amd64.whl
| Download URL | abi3_abi3t_universal-0.2-cp313-abi3-win_amd64.whl |
|---|---|
| Size | 11.4 kB |
| Tags | CPython 3.13 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
b27fc30b3d85e69b080b55deb87027755f3fce3a0a8a96bd6aecae53fced2347
|
|
BLAKE2b-256 checksum How to use checksums |
ba7479bc37a63ae0c1b7bf16a7b4a058f7561f2fdde1931c1249fa7e8f689bd9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 18, 2026.
Transparency logSecurity for abi3-abi3t-universal 0.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 4 files in this release have been uploaded with provenance metadata.
Attestation for abi3_abi3t_universal-0.2-cp313-abi3t-win_amd64.whl
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 18, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.