|
1 | 1 | --- |
2 | | -name: ci (windows-msys2) |
| 2 | +name: ci-windows |
3 | 3 |
|
4 | 4 | on: |
5 | 5 | push: { branches: [main, master] } |
|
9 | 9 | permissions: { contents: read } |
10 | 10 |
|
11 | 11 | concurrency: |
12 | | - group: ci-win-msys2-${{ github.ref }} |
| 12 | + group: ci-windows-${{ github.ref }} |
13 | 13 | cancel-in-progress: true |
14 | 14 |
|
15 | 15 | jobs: |
@@ -71,3 +71,149 @@ jobs: |
71 | 71 | # Ensure liblldb.dll is on PATH for test-time loads |
72 | 72 | PATH: /clang64/bin:$PATH |
73 | 73 | 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