ci: build the arm64 targets on stable - #82
Open
LeonarddeR wants to merge 2 commits into
Open
Conversation
The arm64ec TLS-destructors->FLS fix (rust-lang/rust#148799) that forced the arm64, arm64ec and arm64x jobs onto beta has reached stable in Rust 1.98.0, so every CI target can share one toolchain again. With the pin gone the per-entry `toolchain` matrix key is uniform, so it is dropped in favour of a plain `toolchain: stable` on the install step. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Pull request overview
Updates CI and supporting docs to move ARM64-related jobs (arm64, arm64ec, arm64x) from beta to stable, aligning the workflow with the Rust 1.98.0 TLS-destructors→FLS fix rollout.
Changes:
- Switches CI Rust installation to a single
toolchain: stableacross thebuildandtestjobs (removing the per-matrixtoolchainkey). - Updates ARM64X toolchain documentation in
CLAUDE.mdto reflect a>= 1.98.0requirement. - Adds a changelog entry describing the CI toolchain change.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
.github/workflows/ci.yml |
Removes per-target toolchain selection and installs stable uniformly for build/test. |
CLAUDE.md |
Updates documented toolchain requirement and removes +beta from the manual ARM64X recipe. |
CHANGELOG.md |
Notes the CI move from beta to stable under Unreleased. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
The arm64ec TLS-destructors->FLS fix (rust-lang/rust#148799) that this crate needs first ships in Rust 1.98.0. Declaring it as `rust-version` turns a too-old toolchain into a clear "requires rustc 1.98" resolver error instead of an 0xc0000096 abort when the ARM64X EC view is loaded. The floor is enforced for every target, not just arm64ec, so there is one supported-toolchain answer for the whole crate. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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.
Moves the
arm64,arm64ecandarm64xCI jobs offbetaand ontostable, and declares the corresponding MSRV.The reason those jobs were pinned to
betais the arm64ec TLS-destructors→FLS fix (rust-lang/rust#148799): without it, an ARM64X image aborts with0xc0000096when its EC view is loaded (rust-lang/rust#145154). That fix rides the train into Rust 1.98.0.Changes:
stable. With the pin gone the per-entrytoolchainmatrix key was uniform, so it is dropped in favour of a plaintoolchain: stableon thedtolnay/rust-toolchainstep in bothbuildandtest.Cargo.tomldeclaresrust-version = "1.98". The requirement originates with arm64ec, but the floor is enforced for every target so there is a single supported-toolchain answer, and a too-old toolchain fails as a clearrequires rustc 1.98resolver error rather than a crash at DLL load.CLAUDE.mdis restated as "at least 1.98.0" instead of "at least beta", the MSRV is noted inCLAUDE.md+readme.md, thecargo +betaoverrides drop out of the manual ARM64X validation recipe, and there's aCHANGELOG.mdentry.Stable is currently 1.97.1 (2026-07-14), which predates the fix. 1.98.0 is due ~2026-08-20. Please hold this PR until then, re-run CI, and it should go green with no further changes.
Note that with the MSRV declared, every job now fails the resolver check, not just the arm64ec one. That is the intended trade-off — one obvious error message everywhere beats one cryptic crash in a single job.
Verified: this is not a leftover from the tokio era
Before the MSRV commit, CI ran the toolchain change alone on stable 1.97.1 (run 30385266526).
Test (arm64x-on-arm64ec)failed exactly as predicted:This is worth recording because the v0.9.0 tokio drop (2026-07-24) landed after the last beta verification (2026-07-17), so it was an open question whether a pre-fix toolchain still broke a tokio-free tree. It does. The 34 passing tests are the in-crate unit tests that never load the merged DLL; all 21 aborts are
dll_smoke+dvc_emulation, i.e. every test thatLoadLibrarys it — the crash is at load, before any crate code runs.Test (arm64ec)(plain, unmerged DLL) passes on the same toolchain, and there is nothread_local!in first-party code at all. The TLS-with-destructors that #148799 moves to FLS is std's own; tokio was a heavy user of thread-locals but never what put that machinery in the image.Also confirmed:
arm64ec-pc-windows-msvcships a prebuiltrust-stdonstable, the crate uses no#![feature(...)]gates, andactionlintis clean on the edited workflow.🤖 Generated with Claude Code