Build cp314 wheels: bump cibuildwheel, keep the manylinux baseline - #597
Merged
tbonald merged 2 commits intoSep 1, 2026
Merged
Conversation
CIBW_BUILD already asks for cp314-*, but pypa/cibuildwheel@v2.23.3 does not
know that identifier, so the selector matches nothing, the job succeeds, and
releases publish cp310-cp313 only. 0.33.5 shipped that way despite cp314 having
been requested the day before.
Reproducible either way:
$ CIBW_BUILD='cp310-* cp311-* cp312-* cp313-* cp314-*' \
CIBW_SKIP='cp*-musllinux*' CIBW_PLATFORM=linux CIBW_ARCHS=auto64 \
cibuildwheel==2.23.3 --print-build-identifiers
cp310-... cp311-... cp312-... cp313-... # cp314 absent
... cibuildwheel==4.2.0 --print-build-identifiers
cp310-... cp311-... cp312-... cp313-... cp314-...
cp314 first resolves at cibuildwheel 3.1.4; 3.0.0 does not have it either.
The manylinux pin keeps the bump additive. cibuildwheel's default image moved
from manylinux2014 to manylinux_2_28 in 3.0, which would raise the glibc floor
of every published wheel from 2.17 to 2.28 - a breaking change for users on
older distros, unrelated to adding 3.14. Pinning the previous default leaves
existing wheel tags exactly as they are. manylinux2014 does carry cp314
(/opt/python has cp314-cp314 and cp314-cp314t), so nothing is given up.
Moving to manylinux_2_28 is a reasonable thing to want - just as its own
decision, not a side effect of this one.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## develop #597 +/- ##
========================================
Coverage 98.22% 98.22%
========================================
Files 182 182
Lines 8356 8356
========================================
Hits 8208 8208
Misses 148 148 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Closed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The bug
CIBW_BUILDalready asks forcp314-*(added in 5a3bc4d, "add python 3.14, drop python 3.9"), butpypa/cibuildwheel@v2.23.3doesn't know that build identifier. The selector matches nothing, the job still succeeds, and the release publishes cp310–cp313 only.That's why 0.33.5 has no cp314 wheel on PyPI despite cp314 being requested the day before it was cut — nothing failed, so there was nothing to notice.
Downstream effect: on Python 3.14,
pip/uvfall back to the sdist, so every install compiles the Cython/C++ extensions. That needs a C++ toolchain, which slim CI images and many containers don't have — it surfaces aserror: [Errno 2] No such file or directory: 'c++'rather than anything mentioning wheels.Reproducing it
cp314 first resolves at 3.1.4 — worth noting that 3.0.0 doesn't have it either, so a bump to 3.0 wouldn't have fixed this.
Why the manylinux pin is in the same change
A bare bump to 4.x would do something you probably don't want. cibuildwheel's default manylinux image changed from
manylinux2014tomanylinux_2_28in 3.0, which would raise the glibc floor of every published wheel from 2.17 → 2.28. Users on older distros who currently get a wheel would start building from source — a breaking change with nothing to do with Python 3.14.Pinning the previous default keeps existing wheel tags byte-identical, so this PR only adds cp314. And nothing is lost by staying:
quay.io/pypa/manylinux2014_x86_64:latestships cp314 (/opt/pythoncontainscp314-cp314andcp314-cp314t).Moving to
manylinux_2_28is a perfectly reasonable thing to want — just as its own deliberate decision. Happy to drop those two lines if you'd rather take it here.Scope
Both
release.ymlandwheels_build.yml, so the pre-merge wheel build and the publishing build stay in step.Verified by resolving your exact
CIBW_*config at 4.2.0 across linux/macos/windows — no errors or deprecation warnings, and the identifier set is the five you intend. I haven't run a full build, so a maintainer eye onCIBW_BEFORE_BUILDunder 4.x is worth having.Disclosure: prepared with AI assistance (Claude Code); the reproduction commands above were run and their output is quoted verbatim.