Skip to content

Build cp314 wheels: bump cibuildwheel, keep the manylinux baseline - #597

Merged
tbonald merged 2 commits into
sknetwork-team:developfrom
Igor-Techsee:fix/cibuildwheel-cp314
Sep 1, 2026
Merged

tbonald merged 2 commits into
sknetwork-team:developfrom
Igor-Techsee:fix/cibuildwheel-cp314

Conversation

@Igor-Techsee

Copy link
Copy Markdown

The bug

CIBW_BUILD already asks for cp314-* (added in 5a3bc4d, "add python 3.14, drop python 3.9"), but pypa/cibuildwheel@v2.23.3 doesn'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/uv fall 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 as error: [Errno 2] No such file or directory: 'c++' rather than anything mentioning wheels.

Reproducing it

$ 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-manylinux_...  cp311-manylinux_...  cp312-manylinux_...  cp313-manylinux_...
                                                              # cp314 absent

$ ... cibuildwheel==4.2.0 --print-build-identifiers
cp310-...  cp311-...  cp312-...  cp313-...  cp314-manylinux_...   ✅

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 manylinux2014 to manylinux_2_28 in 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:latest ships cp314 (/opt/python contains cp314-cp314 and cp314-cp314t).

Moving to manylinux_2_28 is 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.yml and wheels_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 on CIBW_BEFORE_BUILD under 4.x is worth having.

Disclosure: prepared with AI assistance (Claude Code); the reproduction commands above were run and their output is quoted verbatim.

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

codecov Bot commented Aug 31, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 98.22%. Comparing base (4eab026) to head (2a704eb).

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.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@tbonald
tbonald merged commit 142fac4 into sknetwork-team:develop Sep 1, 2026
12 checks passed
@tbonald tbonald mentioned this pull request Sep 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants