Skip to content

tmp(ci): probe the three windows images — do NOT merge #2

tmp(ci): probe the three windows images — do NOT merge

tmp(ci): probe the three windows images — do NOT merge #2

# 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 "=============================================="
# 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