ci: build Windows ARM64 with Visual Studio 2026 - #91
Merged
Merged
Conversation
GitHub is migrating the windows-11-arm label to the Windows 11 Arm64 with Visual Studio 2026 image between 2026-09-21 and 2026-09-30 (actions/runner-images#14602). That image has no VS 2022 instance, so the windows-arm64-full preset's hardcoded "Visual Studio 17 2022" generator fails at configure. Native release run 35976011426 lost both arm64 lanes (blas, vulkan) this way; the same lanes passed on the VS 2022 image in run 35850331498 on the same commit. Switch the preset to "Visual Studio 18 2026" and pin the arm64 jobs to windows-11-vs2026-arm so the image cannot flip mid-rollout. ClangCL, the ARM64 and x64 MSVC tools, and CMake 4.4 are all present on that image.
leehack
added a commit
that referenced
this pull request
Sep 24, 2026
leehack
added a commit
that referenced
this pull request
Sep 24, 2026
This was referenced Sep 24, 2026
leehack
added a commit
that referenced
this pull request
Sep 24, 2026
leehack
added a commit
that referenced
this pull request
Sep 24, 2026
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.
Fixes the two Windows ARM64 failures in the scheduled v0.5.0 release run 35976011426 (
build-windows (arm64, …, blas)and(arm64, …, vulkan)). The cause is the runner image, not v0.5.0.Cause
Both jobs fail at configure:
Runner image for the same two jobs:
14d4f0bwindows-11-arm6420260914/2026092014d4f0bwindows-11-vs2026-arm6420260914.159.1/20260920.164.1The native commit is the same in both runs. Only the image behind
windows-11-armchanged: actions/runner-images#14602 moves that label to the VS 2026 image, rolling out from 2026-09-21 to 2026-09-30. That image has only VS 18.CMakePresets.jsonhardcoded"generator": "Visual Studio 17 2022"forwindows-arm64-full. No other job changed image between the two runs.Change
windows-arm64-fullgenerator:Visual Studio 18 2026. The architecture (ARM64) and the toolset name (ClangCL) are unchanged, but the compiler behind them moves from Clang 19.1.5 / MSVC 14.4x (VS 2022 image) to Clang 22.1.3 / MSVC 14.51 (VS 2026 image). The move comes with the image and happens whether or not this PR merges. Windows ARM64 has no ISA audit comparable to Android's. The only compiled evidence is the wrapper ctest inwindows-arm64-kleidiai; Kleidi selector/compute qualification runs in the Linux QEMU lane.native_release.ymland thewindows-arm64-kleidiailane invalidate_wrapper.ymlnow run onwindows-11-vs2026-arm. That is the image the plain label is moving to, but the explicit label cannot flip back and forth during the rollout. After Sep 30 both labels resolve to the same image.docs/platform_backend_strategy.mdrecords the requirement.tools/build.py windows --arch arm64now needs VS 2026. VS 2022-only users can configure directly withcmake --preset windows-arm64-full -G "Visual Studio 17 2022"in a fresh build dir. Verified locally that a command-line-Goverrides a preset's generator (CMake 4.4.3). The presets file still declarescmakeMinimumRequired3.23, so older CMake fails with a generator error rather than a version message.windows-11-vs2026-armis the label #14602 offers for testing. After the rollout ends (Sep 30) both labels resolve to the same image, so a later switch back towindows-11-armis optional.The image readme lists everything the arm64 lanes use:
VC.Llvm.ClangToolset,VC.Tools.ARM64,VC.Tools.x86.x64(for the host-x64vulkan-shaders-gentoolchain incmake/windows-host-x64-toolchain.cmake), Windows SDK 26100, vcpkg, and CMake 4.4.3. TheVisual Studio 18 2026generator needs CMake 4.2 or later.cmake/kleidiai_windows.cmakematches^Visual Studioand is unaffected. The fixture's simulatedVisual Studio 17 2022generator string only exercises that match, so it is left as is.Validation
validate_wrapper→windows-arm64-kleidiai(pinned and post-v0.4.0) configures this preset on the VS 2026 image. It builds with ClangCL and the Kleidi ARMASM customization and runs the wrapper ctest contracts.python3 -m unittest discover -s tests: 157 tests OK.Not covered by PR CI
native_release.ymlruns only on dispatch, so the following are first exercised on VS 2026 by the next release dispatch:vulkan-shaders-genbuild throughcmake/windows-host-x64-toolchain.cmake. That toolchain resolvesVCToolsInstallDir, so it follows VS 18.vcpkg-Windows-arm64-windows-v1(built on the VS 2022 image) is restored, and failed job 107556830067 loggedOpenBLAS already present in cache. The release will therefore ship the VS 2022-built OpenBLAS DLL, which is ABI-compatible. vcpkg's OpenBLAS build on VS 2026 stays untested until that cache is evicted orVCPKG_CACHE_VERSIONis bumped.windows-arm64-kleidiairow is added in the stacked v0.5.0 qualification PR, Qualify v0.5.0 Android CPU dispatch and source policy #93.Independent review
A fresh reviewer re-derived the cause from both runs' logs and the image changelog. It confirmed the hosted lane ran on
windows-11-vs2026-arm64with ClangCL 22.1.3 and passed ctest 4/4. It found no blockers. Its disclosure points (compiler jump, build.py fallback, vcpkg cache, v0.5.0 coverage) are addressed above.