fix: use robust LLVM detection and installation on Windows CI #339
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: ProXPL CI | |
| on: | |
| push: | |
| branches: [ main, develop ] | |
| pull_request: | |
| branches: [ main, develop ] | |
| permissions: | |
| contents: read | |
| env: | |
| BUILD_TYPE: Release | |
| jobs: | |
| build: | |
| name: Build on ${{ matrix.os }} | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: [ubuntu-latest, windows-latest, macos-latest] | |
| include: | |
| - os: ubuntu-latest | |
| bin_path: | | |
| build/proxpl | |
| build/prm | |
| - os: macos-latest | |
| bin_path: | | |
| build/proxpl | |
| build/prm | |
| - os: windows-latest | |
| bin_path: build/ProXPL_Installer_*.exe | |
| steps: | |
| - name: Checkout source | |
| uses: actions/checkout@v4 | |
| - name: Install LLVM (Ubuntu) | |
| if: matrix.os == 'ubuntu-latest' | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y llvm-dev libclang-dev clang | |
| - name: Install LLVM (macOS) | |
| if: matrix.os == 'macos-latest' | |
| run: | | |
| brew install llvm | |
| echo "CMAKE_PREFIX_PATH=$(brew --prefix llvm)" >> $GITHUB_ENV | |
| - name: Set up LLVM (Windows) | |
| if: matrix.os == 'windows-latest' | |
| shell: pwsh | |
| run: | | |
| # Install LLVM via Chocolatey if not present | |
| if (-not (Get-Command llvm-config -ErrorAction SilentlyContinue)) { | |
| Write-Host "LLVM not found. Installing via Chocolatey..." | |
| choco install llvm -y --version 17.0.6 # Pin version for stability | |
| } | |
| # Robust detection logic | |
| $llvmConfig = Get-Command llvm-config -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Source | |
| if (-not $llvmConfig) { | |
| $commonPaths = @( | |
| "C:\Program Files\LLVM\bin\llvm-config.exe", | |
| "C:\Program Files (x86)\LLVM\bin\llvm-config.exe", | |
| "C:\ProgramData\chocolatey\bin\llvm-config.exe", | |
| "C:\ProgramData\chocolatey\lib\llvm\tools\llvm\bin\llvm-config.exe" | |
| ) | |
| foreach ($path in $commonPaths) { | |
| if (Test-Path $path) { | |
| $llvmConfig = $path | |
| break | |
| } | |
| } | |
| } | |
| if ($llvmConfig) { | |
| Write-Host "Found llvm-config at: $llvmConfig" | |
| $llvmBin = Split-Path -Parent $llvmConfig | |
| $llvmRoot = Split-Path -Parent $llvmBin | |
| $cmakeDir = & $llvmConfig --cmakedir | |
| Write-Host "LLVM Root: $llvmRoot" | |
| Write-Host "LLVM CMake dir: $cmakeDir" | |
| echo "LLVM_DIR=$cmakeDir" >> $env:GITHUB_ENV | |
| echo "CMAKE_PREFIX_PATH=$llvmRoot" >> $env:GITHUB_ENV | |
| # Add bin to path for subsequent steps if needed | |
| echo "$llvmBin" >> $env:GITHUB_PATH | |
| } else { | |
| Write-Error "LLVM installation failed or llvm-config.exe not found in common paths!" | |
| exit 1 | |
| } | |
| - name: Configure (Unix) | |
| if: matrix.os != 'windows-latest' | |
| shell: bash | |
| run: | | |
| cmake -S . -B build \ | |
| -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \ | |
| -DBUILD_TESTS=OFF \ | |
| -DBUILD_BENCH=OFF | |
| - name: Configure (Windows) | |
| if: matrix.os == 'windows-latest' | |
| shell: pwsh | |
| run: | | |
| cmake -S . -B build ` | |
| -G "Visual Studio 17 2022" -A x64 ` | |
| -DLLVM_DIR="$env:LLVM_DIR" ` | |
| -DCMAKE_PREFIX_PATH="$env:CMAKE_PREFIX_PATH" ` | |
| -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} ` | |
| -DBUILD_TESTS=OFF ` | |
| -DBUILD_BENCH=OFF | |
| - name: Build | |
| shell: bash | |
| run: cmake --build build --config Release --verbose | |
| - name: Run Benchmarks | |
| shell: bash | |
| run: | | |
| if [ "${{ matrix.os }}" == "windows-latest" ]; then | |
| EXE_PATH="build/Release/proxpl.exe" | |
| else | |
| EXE_PATH="build/proxpl" | |
| fi | |
| echo "Running benchmarks with $EXE_PATH" | |
| python benchmarks/run_benchmarks.py --executable "$EXE_PATH" | |
| - name: Build Installer (Windows) | |
| if: matrix.os == 'windows-latest' | |
| shell: pwsh | |
| run: | | |
| choco install innosetup -y | |
| New-Item -ItemType Directory -Force -Path bin | |
| # Visual Studio puts Release binaries in build/Release/ | |
| Copy-Item "build/Release/proxpl.exe" -Destination "bin/" | |
| Copy-Item "build/Release/prm.exe" -Destination "bin/" | |
| # Copy any DLLs produced by the build (e.g. LLVM shared libs) | |
| Get-ChildItem "build/Release/*.dll" -ErrorAction SilentlyContinue | Copy-Item -Destination "bin/" | |
| iscc setup.iss | |
| - name: Upload Artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ProXPL-v1.2.0-${{ matrix.os }} | |
| # UPDATED: This will now upload the .exe and the .dll for Windows | |
| # For Linux/Mac, it still uploads the single binary. | |
| path: | | |
| ${{ matrix.bin_path }} | |
| examples/ |