From abc72f55b7dfad9266257b0369fd97aad44693f8 Mon Sep 17 00:00:00 2001 From: sunrisepeak Date: Fri, 11 Sep 2026 13:58:51 +0800 Subject: [PATCH 1/2] tmp(ci): probe the three windows images for the loader and the STL, together MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TEMPORARY — delete once the windows image question is settled. #385 pinned the windows leg to `windows-2022` because `windows-latest` (= windows-2025-vs2026, MSVC STL 14.51) cannot compile `huxerui.huxerui`: clang instantiates MSVC STL's vectorized `std::find` for a 24-byte type and hits `static_assert(false, "unexpected size")` (mcpp-community/mcpp#609). The pin worked and cost three members. `vulkan`, `eui-neo-vulkan` and `vulkan-hpp-module` now fail at RUN time with 0xC0000135 (STATUS_DLL_NOT_FOUND) — they compile fine. The Vulkan loader is not a Windows component; it arrives with a GPU driver or the SDK, so whether an image carries `vulkan-1.dll` is a property of the image. So the pin is a TRADE: one compile failure removed, three load failures created. `windows-2025` was never tried, and it is the obvious candidate — old enough to miss 14.51's vectorized find, new enough to plausibly carry the loader. This asks all three images both questions at once: * does `vulkan-1.dll` exist (the vulkan members' failure), and * does `huxerui-module` compile (huxerui's failure) `continue-on-error` on both so every image reports a full row instead of stopping at its first red, and the image inventory is printed BEFORE any build so the answer is visible even if the builds behave unexpectedly. A separate FILE, not a change to validate.yml, and that is the point: validate.yml's `paths:` names only itself, so adding this selects no members and the run is two members on three images instead of the full matrix. Nothing here is meant to merge. --- .github/workflows/tmp-windows-image-probe.yml | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 .github/workflows/tmp-windows-image-probe.yml diff --git a/.github/workflows/tmp-windows-image-probe.yml b/.github/workflows/tmp-windows-image-probe.yml new file mode 100644 index 00000000..b78fd3b6 --- /dev/null +++ b/.github/workflows/tmp-windows-image-probe.yml @@ -0,0 +1,107 @@ +# TEMPORARY — delete once the windows image question is settled. +# +# mcpplibs/mcpp-index#385 pinned the windows leg to `windows-2022` because +# `windows-latest` (= windows-2025-vs2026, MSVC STL 14.51) cannot compile +# `huxerui.huxerui`: clang instantiates MSVC STL's vectorized `std::find` for a +# 24-byte type and hits `static_assert(false, "unexpected size")` +# (mcpp-community/mcpp#609). +# +# The pin worked and cost three members: `vulkan`, `eui-neo-vulkan` and +# `vulkan-hpp-module` now fail at RUN time with 0xC0000135 +# (STATUS_DLL_NOT_FOUND). The Vulkan loader is not a Windows component -- it +# arrives with a GPU driver or the SDK -- so whether an image carries +# `vulkan-1.dll` is a property of the image, and 2022 apparently does not. +# +# `windows-2025` was never tried. If its STL is old enough to compile huxerui +# and its image new enough to carry the loader, it settles both. +# +# This workflow answers that in one run instead of a 50-minute full matrix. It +# is a separate FILE on purpose: validate.yml's `paths:` names only itself, so +# adding this triggers no member selection. +name: tmp-windows-image-probe + +on: + workflow_dispatch: + pull_request: + paths: [".github/workflows/tmp-windows-image-probe.yml"] + +env: + MCPP_VERSION: "2026.9.11.2" + +jobs: + probe: + strategy: + fail-fast: false + matrix: + image: [windows-2022, windows-2025, windows-latest] + runs-on: ${{ matrix.image }} + name: probe (${{ matrix.image }}) + steps: + - uses: actions/checkout@v4 + + # The whole question, asked directly, before any build can muddy it. + - name: What is on this image + shell: pwsh + run: | + Write-Host "label : ${{ matrix.image }}" + Write-Host "ImageOS : $env:ImageOS" + Write-Host "ImageVersion : $env:ImageVersion" + Write-Host "" + Write-Host "--- Vulkan loader (the vulkan members' failure) ---" + foreach ($p in @("$env:SystemRoot\System32\vulkan-1.dll", + "$env:SystemRoot\SysWOW64\vulkan-1.dll")) { + if (Test-Path $p) { + $v = (Get-Item $p).VersionInfo.FileVersion + Write-Host " PRESENT $p ($v)" + } else { + Write-Host " absent $p" + } + } + Write-Host "" + Write-Host "--- MSVC toolsets (huxerui's failure) ---" + Get-ChildItem "C:\Program Files*\Microsoft Visual Studio\*\*\VC\Tools\MSVC\*" -Directory -EA SilentlyContinue | + ForEach-Object { Write-Host " $($_.FullName)" } + + - name: Download mcpp + shell: bash + env: + MCPP_ARCHIVE: mcpp-${{ env.MCPP_VERSION }}-windows-x86_64.zip + MCPP_ROOT: mcpp-${{ env.MCPP_VERSION }}-windows-x86_64 + run: | + curl -L -fsS -o "$MCPP_ARCHIVE" \ + "https://github.com/mcpp-community/mcpp/releases/download/v${MCPP_VERSION}/${MCPP_ARCHIVE}" + powershell -NoProfile -Command "Expand-Archive -Force -Path '${MCPP_ARCHIVE}' -DestinationPath '.'" + root="$PWD/$MCPP_ROOT" + mkdir -p "$HOME/.mcpp/registry" + cp -a "$root/registry/." "$HOME/.mcpp/registry/" + echo "MCPP_HOME=$HOME/.mcpp" >> "$GITHUB_ENV" + echo "MCPP=$(cygpath -m "$root/bin/mcpp.exe")" >> "$GITHUB_ENV" + + # Both members, both allowed to fail, so every image reports a full row + # rather than stopping at the first red. + - name: huxerui-module (the compile question) + id: hux + continue-on-error: true + shell: bash + env: + MCPP_INDEX_MIRROR: GLOBAL + run: | + "$MCPP" test -p huxerui-module + + - name: vulkan (the loader question) + id: vk + continue-on-error: true + shell: bash + env: + MCPP_INDEX_MIRROR: GLOBAL + run: | + "$MCPP" test -p vulkan + + - name: Row + shell: bash + run: | + echo "==============================================" + echo " image ${{ matrix.image }}" + echo " huxerui-module ${{ steps.hux.outcome }}" + echo " vulkan ${{ steps.vk.outcome }}" + echo "==============================================" From db35d150288fcde62504c1e1ae27bd14c09a3f7c Mon Sep 17 00:00:00 2001 From: sunrisepeak Date: Fri, 11 Sep 2026 14:16:57 +0800 Subject: [PATCH 2/2] =?UTF-8?q?tmp(ci):=20the=20image=20is=20not=20the=20o?= =?UTF-8?q?nly=20axis=20=E2=80=94=20probe=20pointing=20clang=20at=20MSVC?= =?UTF-8?q?=2014.44?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The inventory step already paid for itself. `windows-2025` carries THREE toolsets: MSVC\14.29.30133 MSVC\14.44.35207 MSVC\14.51.36231 <- clang picks this one, and dies in it So the trade this branch exists to resolve may not be a trade at all. The loader question and the STL question were assumed to move together because both were read off the image label; they do not. A new image carries the Vulkan loader AND an older STL — the only thing choosing 14.51 is clang's default of newest-wins. Two ways to ask it otherwise, probed separately because they fail in different places: `VCToolsInstallDir`, which is what a developer prompt exports and what clang's MSVC detection reads, and clang's own `/vctoolsdir`. If neither reaches the compile, toolset selection belongs to mcpp and CI cannot fix it — which is itself the answer, just a different one. The last step prints which MSVC path the build actually touched, pass or fail. Without it a pass proves nothing: "compiled against 14.44" and "compiled against 14.51 and got lucky" look the same from the outcome. --- .github/workflows/tmp-windows-image-probe.yml | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/.github/workflows/tmp-windows-image-probe.yml b/.github/workflows/tmp-windows-image-probe.yml index b78fd3b6..b7ee299e 100644 --- a/.github/workflows/tmp-windows-image-probe.yml +++ b/.github/workflows/tmp-windows-image-probe.yml @@ -105,3 +105,70 @@ jobs: echo " huxerui-module ${{ steps.hux.outcome }}" echo " vulkan ${{ steps.vk.outcome }}" echo "==============================================" + + # THE IMAGE IS NOT THE ONLY AXIS, and the inventory step is what showed it: + # windows-2025 carries 14.29.30133, 14.44.35207 AND 14.51.36231. clang picks + # the newest and dies in it. If it can be pointed at 14.44 instead, the trade + # disappears -- a new image (loader present, vulkan passes) with an old STL + # (no vectorized-find assert, huxerui compiles). + # + # Two ways to ask clang, probed separately because they fail differently: + # the environment a developer prompt exports (`VCToolsInstallDir`), and + # clang's own `/vctoolsdir`. If neither reaches it, the toolset selection is + # mcpp's to make and this stops being fixable from CI. + toolset: + strategy: + fail-fast: false + matrix: + how: [vctoolsinstalldir, vctoolsdir-flag] + runs-on: windows-2025 + name: toolset 14.44 via ${{ matrix.how }} + steps: + - uses: actions/checkout@v4 + + - name: Point at 14.44 + shell: pwsh + run: | + $root = "C:\Program Files\Microsoft Visual Studio\18\Enterprise\VC\Tools\MSVC\14.44.35207" + if (-not (Test-Path $root)) { throw "14.44 not on this image" } + Write-Host "using $root" + if ("${{ matrix.how }}" -eq "vctoolsinstalldir") { + "VCToolsInstallDir=$root\" | Out-File -Append -Encoding utf8 $env:GITHUB_ENV + } else { + "MCPP_EXTRA_CXXFLAGS=/vctoolsdir `"$root`"" | Out-File -Append -Encoding utf8 $env:GITHUB_ENV + } + + - name: Download mcpp + shell: bash + env: + MCPP_ARCHIVE: mcpp-${{ env.MCPP_VERSION }}-windows-x86_64.zip + MCPP_ROOT: mcpp-${{ env.MCPP_VERSION }}-windows-x86_64 + run: | + curl -L -fsS -o "$MCPP_ARCHIVE" \ + "https://github.com/mcpp-community/mcpp/releases/download/v${MCPP_VERSION}/${MCPP_ARCHIVE}" + powershell -NoProfile -Command "Expand-Archive -Force -Path '${MCPP_ARCHIVE}' -DestinationPath '.'" + root="$PWD/$MCPP_ROOT" + mkdir -p "$HOME/.mcpp/registry" + cp -a "$root/registry/." "$HOME/.mcpp/registry/" + echo "MCPP_HOME=$HOME/.mcpp" >> "$GITHUB_ENV" + echo "MCPP=$(cygpath -m "$root/bin/mcpp.exe")" >> "$GITHUB_ENV" + + - name: huxerui-module + id: hux + continue-on-error: true + shell: bash + env: + MCPP_INDEX_MIRROR: GLOBAL + run: | + "$MCPP" test -p huxerui-module + + # Which STL the compile actually reached, whatever the outcome -- a pass + # for the wrong reason and a pass for the right one look identical here + # otherwise. + - name: Which STL did it use + if: always() + shell: bash + run: | + echo "how ${{ matrix.how }}" + echo "huxerui-module ${{ steps.hux.outcome }}" + grep -rhoE "MSVC\\\\1[0-9]\\.[0-9]+\\.[0-9]+" tests/examples/huxerui-module/target 2>/dev/null | sort -u | head -3 || true