Skip to content

ci(py): build the aarch64 wheel on an arm64 runner - #40

Merged
m62624 merged 7 commits into
mainfrom
fix/py-aarch64-wheel-runner
Aug 5, 2026
Merged

ci(py): build the aarch64 wheel on an arm64 runner#40
m62624 merged 7 commits into
mainfrom
fix/py-aarch64-wheel-runner

Conversation

@m62624

@m62624 m62624 commented Aug 5, 2026

Copy link
Copy Markdown
Owner

No description provided.

m62624 and others added 2 commits August 5, 2026 23:38
The aarch64-linux wheel was cross-built from an x86_64 runner, where
`maturin-action` selects `ghcr.io/rust-cross/manylinux2014-cross:aarch64`
and builds with the `aarch64-unknown-linux-gnu-gcc` that image ships.
That compiler does not define `__ARM_ARCH` while assembling, so `ring`
(rustls -> ureq -> plugmem-host) stops at

    #error "ARM assembler must define __ARM_ARCH"

and the job dies before maturin ever gets a wheel. It is the one cell in
the matrix that cross-compiles C: every other target either builds
natively or, on aarch64-windows, hands the assembly to MSVC's arm64
tools.

Running the row on `ubuntu-24.04-arm` removes the cross compiler
instead of patching around it -- the action picks the native
`quay.io/pypa/manylinux2014_aarch64` when the host is arm64. GitHub's
arm64 runners are free for public repositories. The alternative,
`manylinux: 2_28`, would also dodge the old gcc, but by raising the
wheel's glibc floor from 2.17 to 2.28 for that architecture alone.

Two things follow from the container being native:

  * the row can build the free-threaded wheel after all. The reason it
    could not was that the only 3.14t interpreter in reach belonged to
    the host and had the wrong architecture; the manylinux image carries
    its own `/opt/python/cp314-cp314t` and the action puts it on PATH.
    Eleven wheels now, not ten.
  * `setup-python` is skipped on both linux rows. `maturin-action`
    mounts the workspace into the container and nothing else -- the
    hosted tool cache is not visible in there -- so on those rows it was
    installing an interpreter the build could never see.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`py-build` lives in release.yml and only runs on a `pin/v*` tag, which
is how the `ring` cross-compile failure this PR fixes could only be
found mid-release. This copies that matrix into CI with the publishing
removed, so the six targets are exercised on the pull request.

The job is not in `ci-pass`'s `needs`, so deleting it needs no other
edit and a failure here does not block the merge gate. Banners in
ci.yml mark exactly what to remove.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@github-actions github-actions Bot added the ci label Aug 5, 2026
m62624 and others added 5 commits August 5, 2026 23:50
The dry run did its job: all six targets built, eleven wheels and the
sdist came out, nothing was published. The aarch64-linux row that this
branch fixes is green on a native arm64 runner, so the matrix in
release.yml is now known-good before a tag depends on it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: codex <codex@openai.com>
Co-authored-by: codex <codex@openai.com>
Co-authored-by: codex <codex@openai.com>
Co-authored-by: codex <codex@openai.com>
@m62624
m62624 merged commit e007c61 into main Aug 5, 2026
31 checks passed
@m62624
m62624 deleted the fix/py-aarch64-wheel-runner branch August 5, 2026 19:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant