Skip to content

Commit 04453ea

Browse files
committed
extended ci-windows.yml to include an MSVC build
1 parent 7ef5c06 commit 04453ea

1 file changed

Lines changed: 148 additions & 2 deletions

File tree

.github/workflows/ci-windows.yml

Lines changed: 148 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
name: ci (windows-msys2)
2+
name: ci-windows
33

44
on:
55
push: { branches: [main, master] }
@@ -9,7 +9,7 @@ on:
99
permissions: { contents: read }
1010

1111
concurrency:
12-
group: ci-win-msys2-${{ github.ref }}
12+
group: ci-windows-${{ github.ref }}
1313
cancel-in-progress: true
1414

1515
jobs:
@@ -71,3 +71,149 @@ jobs:
7171
# Ensure liblldb.dll is on PATH for test-time loads
7272
PATH: /clang64/bin:$PATH
7373
run: ctest --test-dir build --output-on-failure
74+
75+
build-msvc:
76+
runs-on: windows-latest
77+
env:
78+
LLVM_URL: "https://github.com/llvm/llvm-project/releases/download/llvmorg-21.1.3/clang+llvm-21.1.3-x86_64-pc-windows-msvc.tar.xz"
79+
CMAKE_BUILD_PARALLEL_LEVEL: "4"
80+
steps:
81+
- uses: actions/checkout@v4
82+
with:
83+
submodules: recursive
84+
85+
# Put cl.exe (MSVC) on PATH
86+
- uses: ilammy/msvc-dev-cmd@v1
87+
88+
- name: Install Ninja
89+
run: choco install ninja -y
90+
91+
# Cache the extracted prebuilt LLVM tree so we don't redownload every run
92+
- name: Cache prebuilt LLVM
93+
id: cache-llvm
94+
uses: actions/cache@v4
95+
with:
96+
path: ${{ runner.temp }}\clang-llvm-21.1.3-msvc
97+
key: prebuilt-llvm21.1.3-${{ runner.os }}-msvc
98+
99+
- name: Download & extract LLVM (if cache miss)
100+
if: steps.cache-llvm.outputs.cache-hit != 'true'
101+
shell: pwsh
102+
run: |
103+
$dest = "$env:RUNNER_TEMP\clang-llvm-21.1.3-msvc"
104+
New-Item -ItemType Directory -Force -Path $dest | Out-Null
105+
$tar = "$env:RUNNER_TEMP\llvm21.tar.xz"
106+
Write-Host "Downloading $env:LLVM_URL"
107+
Invoke-WebRequest $env:LLVM_URL -OutFile $tar
108+
# Extract .tar.xz (bsdtar on the runner handles xz)
109+
tar -xf $tar -C $dest
110+
111+
- name: Locate LLVM/LLDB CMake packages
112+
id: locate
113+
shell: pwsh
114+
run: |
115+
$root = Get-ChildItem -Path "$env:RUNNER_TEMP\clang-llvm-21.1.3-msvc" -Directory | Select-Object -First 1
116+
if (-not $root) { throw "LLVM archive not found/extracted." }
117+
$llvmDir = Join-Path $root.FullName "lib\cmake\llvm"
118+
$lldbDir = Join-Path $root.FullName "lib\cmake\lldb"
119+
if (!(Test-Path $llvmDir)) { throw "Missing LLVM_DIR at $llvmDir" }
120+
if (!(Test-Path $lldbDir)) { throw "Missing LLDB_DIR at $lldbDir" }
121+
"root=$($root.FullName)" >> $env:GITHUB_OUTPUT
122+
"LLVM_DIR=$llvmDir" >> $env:GITHUB_OUTPUT
123+
"LLDB_DIR=$lldbDir" >> $env:GITHUB_OUTPUT
124+
Write-Host "LLVM root: $($root.FullName)"
125+
126+
# Optional: make LLVM/LLDB tools available if any post-build step needs them
127+
- name: Add LLVM bin to PATH
128+
shell: pwsh
129+
run: echo "${{ steps.locate.outputs.root }}\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
130+
131+
- name: Configure (MSVC + prebuilt LLVM/LLDB)
132+
run: >
133+
cmake -S . -B build-msvc -G "Ninja"
134+
-DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=cl
135+
-DCMAKE_BUILD_TYPE=Release
136+
-DLLVM_DIR="${{ steps.locate.outputs.LLVM_DIR }}"
137+
-DLLDB_DIR="${{ steps.locate.outputs.LLDB_DIR }}"
138+
-DLLDBG_ENABLE_LLDB=ON
139+
140+
- name: Build
141+
run: cmake --build build-msvc --config Release -- -v
142+
143+
windows-msvc-prebuilt-audit:
144+
name: Audit prebuilt LLVM/LLDB (MSVC tarballs)
145+
runs-on: windows-latest
146+
steps:
147+
- uses: actions/checkout@v4
148+
149+
- name: Probe candidate tarballs for LLDB bits
150+
shell: pwsh
151+
run: |
152+
$candidates = @(
153+
# Add/remove versions as you like:
154+
"https://github.com/llvm/llvm-project/releases/download/llvmorg-21.1.3/clang+llvm-21.1.3-x86_64-pc-windows-msvc.tar.xz",
155+
"https://github.com/llvm/llvm-project/releases/download/llvmorg-21.1.2/clang+llvm-21.1.2-x86_64-pc-windows-msvc.tar.xz",
156+
"https://github.com/llvm/llvm-project/releases/download/llvmorg-21.1.1/clang+llvm-21.1.1-x86_64-pc-windows-msvc.tar.xz",
157+
"https://github.com/llvm/llvm-project/releases/download/llvmorg-21.1.0/clang+llvm-21.1.0-x86_64-pc-windows-msvc.tar.xz",
158+
"https://github.com/llvm/llvm-project/releases/download/llvmorg-20.1.0/clang+llvm-20.1.0-x86_64-pc-windows-msvc.tar.xz",
159+
"https://github.com/llvm/llvm-project/releases/download/llvmorg-19.1.7/clang+llvm-19.1.7-x86_64-pc-windows-msvc.tar.xz",
160+
"https://github.com/llvm/llvm-project/releases/download/llvmorg-19.1.0/clang+llvm-19.1.0-x86_64-pc-windows-msvc.tar.xz",
161+
"https://github.com/llvm/llvm-project/releases/download/llvmorg-18.1.8/clang+llvm-18.1.8-x86_64-pc-windows-msvc.tar.xz"
162+
)
163+
164+
$report = @()
165+
$rootOut = Join-Path $env:RUNNER_TEMP "llvm-prebuilt-scan"
166+
New-Item -ItemType Directory -Force -Path $rootOut | Out-Null
167+
168+
foreach ($url in $candidates) {
169+
try {
170+
$name = ([IO.Path]::GetFileNameWithoutExtension([IO.Path]::GetFileNameWithoutExtension($url))) # strip .tar.xz
171+
$destDir = Join-Path $rootOut $name
172+
if (-not (Test-Path $destDir)) { New-Item -ItemType Directory -Force -Path $destDir | Out-Null }
173+
174+
$txz = Join-Path $rootOut "$name.tar.xz"
175+
Write-Host "==> Downloading $url"
176+
Invoke-WebRequest -Uri $url -OutFile $txz -UseBasicParsing -ErrorAction Stop
177+
178+
# Extract tar.xz using built-in bsdtar
179+
tar -xf $txz -C $destDir
180+
181+
# The archive expands to a single top-level folder; find it:
182+
$top = Get-ChildItem -Path $destDir -Directory | Select-Object -First 1
183+
if (-not $top) { throw "No top-level directory after extract." }
184+
185+
$includeLLDB = Join-Path $top.FullName "include\lldb"
186+
$liblldbLib = Get-ChildItem -Recurse -Path (Join-Path $top.FullName "lib") -Filter "liblldb.lib" -ErrorAction SilentlyContinue | Select-Object -First 1
187+
$lldbCMake = Get-ChildItem -Recurse -Path (Join-Path $top.FullName "lib\cmake") -Filter "LLDBConfig.cmake" -ErrorAction SilentlyContinue | Select-Object -First 1
188+
189+
$hasHeaders = Test-Path $includeLLDB
190+
$hasLib = [bool]$liblldbLib
191+
$hasCMake = [bool]$lldbCMake
192+
193+
$report += [pscustomobject]@{
194+
Tarball = $name
195+
HAS_HEADERS = $hasHeaders
196+
HAS_LIB = $hasLib
197+
HAS_CMAKE = $hasCMake
198+
Root = $top.FullName
199+
}
200+
}
201+
catch {
202+
$report += [pscustomobject]@{
203+
Tarball = $url
204+
HAS_HEADERS = $false; HAS_LIB = $false; HAS_CMAKE = $false
205+
Root = "DOWNLOAD/EXTRACT FAILED: $($_.Exception.Message)"
206+
}
207+
}
208+
}
209+
210+
# Pretty print summary
211+
$report | Format-Table -AutoSize | Out-String | Write-Host
212+
213+
# Also emit a GitHub Actions log-friendly line for the first “fully OK” hit
214+
$firstOK = $report | Where-Object { $_.HAS_HEADERS -and $_.HAS_LIB } | Select-Object -First 1
215+
if ($firstOK) {
216+
Write-Host "::notice title=LLDB prebuilt found::${($firstOK.Tarball)} has headers+lib (CMake package present: ${($firstOK.HAS_CMAKE)}) at ${($firstOK.Root)}"
217+
} else {
218+
Write-Host "::warning title=No full LLDB prebuilt found::None of the tested tarballs had both headers and lib."
219+
}

0 commit comments

Comments
 (0)