Repository navigation
BLD: add option to build future-compatible abi3 wheels - #1600
neutrinoceros wants to merge 11 commits into
Conversation
|
|
||
| # restrict LIMITED_API usage: | ||
| # - require an env var PYPROJ_LIMITED_API=1 | ||
| # - LIMITED_API is not compatible with free-threading (as of CPython 3.14) |
There was a problem hiding this comment.
note this comment is going to age like milk because there's a new version of the Limited API coming up in Python 3.15 that's compatible with both GIL-enabled and free-threaded builds. However there are a couple other blockers right now (Cython and setuptools both have work-in-progress patches to support this). I'd be happy to revisit this later this year to add cp315-abi3.abi3t as a target
2da1367 to
029ffef
Compare
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #1600 +/- ##
=======================================
Coverage 95.81% 95.81%
=======================================
Files 20 20
Lines 1886 1886
=======================================
Hits 1807 1807
Misses 79 79 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|
Mind enabling this in the wheel builds to test? |
b3a69bb to
a577583
Compare
|
enabling this in CI revealed that it is currently blocked by cython and indeed, compilation then predictibly fails because the generated module isn't limited-api-compliant |
|
You could test it by adding a flag to use the slower alternative: Line 20 in 40d7cf8 |
8721db0 to
0ef9dbf
Compare
|
thanks for the pointer. I now expect the current CI run to succeed. Should I drop the second commit before undrafting ? |
0ef9dbf to
0482753
Compare
|
I appreciate your work on this and have learned a few things in the process. I hesitate to add this in. It doesn't significantly reduce the wheel count and makes the code slower. Someone could enable this without being aware of the consequences. I would probably want a more performant alternative when this is enabled before merging. |
|
Note that the branch currently implements my second suggested approach, but I actually would favor the first one if you like it best |
|
I should have read your comment. The first approach sounds like a good strategy. |
|
I think I won't be able to avoid duplication between jobs, but it should be possible to mitigate it by moving the static part of your cibw configuration to pyproject.toml first. It could absolutely be a separate, preliminary PR, though I do not know yet when I'll have time for it. Does it seem like an acceptable plan to you ? |
|
Feel free to try it and see what it looks like. |
|
see gh-1661 |
|
I'm planning to rebase this atop #1663 once stable |
0482753 to
4ce2dfc
Compare
|
so the current PR tower is |
43a46ba to
75114bd
Compare
c2b2a5e to
08efe53
Compare
08efe53 to
ba4cd3d
Compare
8b414b2 to
9fc7f5e
Compare
This allows targeting CPython's LimitedAPI (and stable ABI) by setting
PYPROJ_LIMITED_API=1at build time. Resulting wheels are future compatible with yet-unreleased Python versions.The trade-off is that runtime performance might be impacted, though I suggest measuring it against real load-bearing applications, as I found that in many numpy-based extensions the impact to be negligible or even non-measurable.
I could successfully build the package and run the test suite with this locally.
I suggest a couple possible approaches to leverage this:
cp314-abi3target to the existing build matrix. Version-specific wheels will still be prefered by installers when available but will default to these otherwise, instead of having to, and often failing to build pyproj from source.cp311-abi3wheel per platform. If there are no visible performance regressions this is definitely the way to go.Blocked by