Skip to content

Fix 1875#1902

Merged
oberstet merged 4 commits into
crossbario:masterfrom
oberstet:fix_1875
Jul 1, 2026
Merged

Fix 1875#1902
oberstet merged 4 commits into
crossbario:masterfrom
oberstet:fix_1875

Conversation

@oberstet

@oberstet oberstet commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

fixes #1875

oberstet added 4 commits July 1, 2026 20:33
…ssbario#1875)

The aarch64 CPython 3.14 wheel in 26.6.x shipped the free-threaded ABI
(cp314-cp314t-...aarch64.whl) in the GIL cp314 slot, so there was no GIL
cp314 aarch64 wheel and those users fell back to the sdist. Root cause: an
older uv resolved `cpython-3.14` to the free-threaded interpreter on the
aarch64 manylinux container.

Verified under QEMU aarch64 on asgard1 that current uv (0.11.26) resolves
`cpython-3.14` -> GIL (Py_GIL_DISABLED=0) and `cpython-3.14t` -> free-threaded
(Py_GIL_DISABLED=1), so the interpreter spec is already correct; a rebuild
now yields the right cp314 wheel.

To make it regression-proof (the wheel ABI tag is fixed by the building
interpreter), add a `_check-venv-abi` guard invoked by `just build`: it
asserts the interpreter's GIL/free-threaded status matches the env name
(cpy314 -> GIL, cpy314t -> free-threaded, pypy skipped) and aborts on
mismatch. Also add a reserved `cpy314t` -> `cpython-3.14t` spec for the future
free-threaded wheel variant (Part 2, gated on an NVX free-threading
assessment).

Verified locally on x86_64: the guard passes for cpy314 (GIL) and cpy314t
(free-threaded), skips pypy311, and rejects a free-threaded interpreter in a
GIL slot.

Note: the `_check-venv-abi` recipe exceeds the 10-line new-logic guideline in
AI_POLICY.md and warrants explicit human review.

Note: This work was completed with AI assistance (Claude Code).
…e gate) (crossbario#1875)

Advance the .cicd (wamp-cicd) submodule f77ca2b -> f9a9a7e, which includes the
exact CPython ABI-tag matching fix in the shared check-release-fileset action
(wamp-cicd crossbario#11). This is the release-gate companion to the build-time
_check-venv-abi guard: a cp314t wheel in a cp314 slot now fails both the build
and the release fileset check. The action is consumed at @main, so the fix is
already effective in CI; this pins the vendored .cicd tooling to match.

Note: This work was completed with AI assistance (Claude Code).
…rossbario#1875)

CI proved the real root cause: the ARM64 manylinux_2_28 image pre-installs both
GIL (/opt/python/cp314-cp314) and free-threaded (/opt/python/cp314-cp314t) 3.14
and prepends both to PATH, with the free-threaded dir ahead of the GIL one. uv
0.11.26 then resolved `cpython-3.14` to the free-threaded interpreter (log:
"Using CPython 3.14.6+freethreaded ... cp314-cp314t"), which the _check-venv-abi
guard correctly caught (Py_GIL_DISABLED=1) and aborted the build. (My earlier
QEMU/debian test missed this because bare debian has no system 3.14, so uv
downloaded a managed GIL build.)

Fix in the shared `create` recipe: for GIL envs, drop free-threaded `…t/bin`
dirs from PATH before `uv venv`, so uv selects the GIL /opt/python interpreter
(the reserved cpy314t env keeps them for building free-threaded wheels). No-op
off manylinux (local builds download a managed GIL python as before). The
build-time guard stays as defence-in-depth.

Verified locally: the PATH filter strips cp314t/cp315t and keeps cp314 (GIL)
against the exact failing CI PATH; `just create cpy314` still builds a GIL venv
(Py_GIL_DISABLED=0) and passes the guard.

Note: the create PATH filter and the guard exceed the 10-line new-logic
guideline in AI_POLICY.md and warrant explicit human review.

Note: This work was completed with AI assistance (Claude Code).
@oberstet oberstet merged commit c103d73 into crossbario:master Jul 1, 2026
39 checks passed
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.

[FEATURE] Publish CPython 3.14 wheels for both free-threaded (no-GIL) and regular (GIL) builds on all platforms

1 participant