Skip to content

ci: add Swift runtime dir to PATH in Windows spike #12

ci: add Swift runtime dir to PATH in Windows spike

ci: add Swift runtime dir to PATH in Windows spike #12

Workflow file for this run

name: Windows spike
# Throwaway spike (step 1 of PLAN.md): try to build the shared core
# (Sources/HeadlessProtocol) with Swift-for-Windows on a real runner.
# Delete this file once the spike outcome is recorded.
on:
push:
branches: [spike/windows-core]
workflow_dispatch:
permissions:
contents: read
jobs:
core-build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Install Swift toolchain
shell: pwsh
run: |
winget install --id Swift.Toolchain -e --source winget `
--accept-source-agreements --accept-package-agreements --disable-interactivity
$loc = $null
foreach ($hive in @('HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall',
'HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall',
'HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall')) {
Get-ItemProperty "$hive\*" -ErrorAction SilentlyContinue |
Where-Object { $_.DisplayName -like '*Swift*' } |
ForEach-Object { Write-Host "$($_.DisplayName) -> $($_.InstallLocation)"; if ($_.InstallLocation) { $loc = $_.InstallLocation } }
}
$toolchainBin = Join-Path $env:LOCALAPPDATA 'Programs\Swift\Toolchains'
if (Test-Path $toolchainBin) {
$found = Get-ChildItem $toolchainBin -Directory | Select-Object -First 1
$loc = Join-Path $found.FullName 'usr'
Write-Host "Discovered toolchain: $($found.FullName)"
}
if (-not $loc -or -not (Test-Path (Join-Path $loc 'bin\swift.exe'))) {
Write-Host '--- fallback: searching C:\ for swift.exe ---'
where.exe /R C:\ swift.exe 2>$null | Select-Object -First 5
throw 'swift.exe still not located'
}
Add-Content $env:GITHUB_PATH (Join-Path $loc 'bin')
Add-Content $env:GITHUB_PATH (Join-Path $loc 'usr\bin')
- name: Set up MSVC environment
uses: ilammy/msvc-dev-cmd@v1
- name: Locate toolchain
shell: pwsh
run: |
$bin = Split-Path (Get-Command swift).Source
Write-Host "bin: $bin"
$deps = & dumpbin /DEPENDENTS (Join-Path $bin 'swift.exe') |
Where-Object { $_ -match '\.dll' } | ForEach-Object { ($_ -replace '.*\s','').Trim() }
Write-Host "swift.exe depends on: $($deps -join ', ')"
foreach ($d in $deps) {
$found = Get-ChildItem $bin -Filter $d -ErrorAction SilentlyContinue
if (-not $found) {
$sys = Get-Command $d -ErrorAction SilentlyContinue
if ($sys) { Write-Host "$d -> $($sys.Source)" }
else { Write-Host "MISSING EVERYWHERE: $d" }
} else { Write-Host "$d -> in toolchain bin" }
}
$runtimeDir = Get-ChildItem "$env:LOCALAPPDATA\Programs\Swift" -Recurse -Filter 'swiftCore.dll' `
-ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty DirectoryName
if ($runtimeDir) {
Write-Host "Runtime dir: $runtimeDir"
Add-Content $env:GITHUB_PATH $runtimeDir
} else {
Write-Host 'swiftCore.dll not under Programs\Swift; searching C:\'
where.exe /R C:\ swiftCore.dll 2>$null | Select-Object -First 3
}
$out = & (Join-Path $bin 'swift.exe') --version 2>&1
Write-Host "swift --version exit=$LASTEXITCODE output=$out"
- name: Build shared core (HeadlessProtocol)
shell: pwsh
working-directory: apps/headless
run: swift build --target HeadlessProtocol --build-tests-off 2>&1 | Tee-Object core-build.log
- name: Build protocol test executable
if: success() || failure()
shell: pwsh
working-directory: apps/headless
run: swift build --product headless-protocol-tests 2>&1 | Tee-Object tests-build.log
- name: Upload build logs
if: always()
uses: actions/upload-artifact@v4
with:
name: windows-spike-logs
path: |
apps/headless/core-build.log
apps/headless/tests-build.log
if-no-files-found: ignore