CI: port two jobs from azure pipelines to GHA

This ports vc2022x64vs and vc2022arm64ninjacross to GHA.

GHA has some upsides:

* 4 instead of 2 cores, so about twice as fast with parallel tests
* easier to test in forks (no azure account required)
* one less CI system to handle

Downsides: GHA is limited to 20 parallel jobs, and meson has many,
so some queuing might occur, though it being twice as fast and many
of the other jobs being short should lead to faster times anyway.

The third job was not ported yet since that includes intel fortran
which requires caching since it takes 15 minutes to install, and I
lost motivation. Ideally it could be ported as well.
This commit is contained in:
Christoph Reiter
2026-01-10 15:37:55 +01:00
committed by Nirbheek Chauhan
parent bc566a3bd6
commit 014f0a4e9b

158
.github/workflows/windows.yml vendored Normal file
View File

@@ -0,0 +1,158 @@
name: windows
on:
push:
branches:
- 'master'
# Release branches
- '1.*'
paths:
- 'mesonbuild/**'
- 'test cases/**'
- 'unittests/**'
- '.github/workflows/*.yml'
- 'ci/run.ps1'
- 'run_project_tests.py'
- 'run_tests.py'
- 'run_unittests.py'
pull_request:
paths:
- 'mesonbuild/**'
- 'test cases/**'
- 'unittests/**'
- '.github/workflows/*.yml'
- 'ci/run.ps1'
- 'run_project_tests.py'
- 'run_tests.py'
- 'run_unittests.py'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: true
jobs:
vs2022:
runs-on: windows-2022
timeout-minutes: 120
name: ${{ matrix.name }}
strategy:
fail-fast: false
matrix:
include:
- name: vc2022x64vs
arch: x64
compiler: msvc2022
backend: vs2022
# mysteriously, several tests fail because vs cannot find
# executables such as cmd.exe ???
ifort: false
- name: vc2022arm64ninjacross
arch: amd64_arm64
compiler: msvc2022
backend: ninja
extraargs: --cross arm64cl.txt --cross-only
# ifort doesn't support arm64
ifort: false
steps:
- uses: actions/checkout@v6
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: '3.7'
- name: Setup MSVC
uses: ilammy/msvc-dev-cmd@v1
with:
arch: ${{ matrix.arch }}
- name: Install PyPy
if: matrix.arch == 'x64'
shell: pwsh
run: |
$pypyUrl = "https://downloads.python.org/pypy/pypy3.8-v7.3.9-win64.zip"
$pypyZip = "${{ runner.temp }}\pypy38.zip"
$pypyDir = "${{ runner.temp }}\pypy38"
Invoke-WebRequest -Uri $pypyUrl -OutFile $pypyZip
Expand-Archive $pypyZip -DestinationPath $pypyDir
$pypyPath = "$pypyDir\pypy3.8-v7.3.9-win64"
"PYPY_PATH=$pypyPath" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
& "$pypyPath\pypy3.exe" -m ensurepip
- name: Install Python 2.7
if: matrix.arch == 'x64'
shell: pwsh
run: |
$python27Url = "https://www.python.org/ftp/python/2.7.18/python-2.7.18.amd64.msi"
$python27Msi = "${{ runner.temp }}\python27.msi"
Invoke-WebRequest -Uri $python27Url -OutFile $python27Msi
Start-Process msiexec.exe -Wait -ArgumentList "/I $python27Msi /quiet"
- name: Install pkg-config
shell: pwsh
run: |
$pkgconfigDir = "${{ runner.temp }}\pkgconfig"
New-Item -ItemType Directory -Path $pkgconfigDir -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/mesonbuild/cidata/refs/heads/master/win32/pkg-config.exe" -OutFile "$pkgconfigDir\pkg-config.exe"
echo "$pkgconfigDir" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
- name: Install NASM
shell: pwsh
run: choco install -y nasm
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable-x86_64-pc-windows-msvc
components: clippy
- name: Add Rust library path (Windows)
run: |
$rustlib = (rustc --print sysroot) + "\bin"
echo $rustlib | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
shell: pwsh
- name: Install dependencies
shell: pwsh
run: |
python -m pip --disable-pip-version-check install --upgrade pefile pytest-xdist pytest-subtests fastjsonschema cython
- name: Run tests
env:
MESON_CI_JOBNAME: windows-${{ matrix.name }}
shell: pwsh
run: |
# Remove Chocolatey, MinGW, Strawberry Perl from path
$env:Path = ($env:Path.Split(';') | Where-Object { $_ -notmatch 'mingw|Strawberry|Chocolatey|PostgreSQL' }) -join ';'
if ( '${{ matrix.arch }}' -eq 'x64' ) {
$env:Path = $env:Path + ";$env:PYPY_PATH"
}
echo "=== PATH BEGIN ==="
echo ($env:Path).Replace(';',"`n")
echo "=== PATH END ==="
$progs = @("python","ninja","pkg-config","cl","rc","link","pypy3","ifort")
foreach ($prog in $progs) {
echo ""
echo "Locating ${prog}:"
where.exe $prog
}
echo ""
echo "Ninja / MSBuild version:"
if ($env:backend -eq 'ninja') {
ninja --version
} else {
MSBuild /version
}
echo ""
echo "Python version:"
python --version
echo "=== Running tests ==="
python 2>&1 run_tests.py --backend "${{ matrix.backend }}" ${{ matrix.extraargs }}