diff --git a/.github/workflows/rewrite-strict-gate.yml b/.github/workflows/rewrite-strict-gate.yml index 5714824..06b1169 100644 --- a/.github/workflows/rewrite-strict-gate.yml +++ b/.github/workflows/rewrite-strict-gate.yml @@ -51,7 +51,8 @@ jobs: Install-ChocoPkg "ninja" Install-ChocoPkg "7zip" - - name: Resolve LLVM_DIR + - name: Resolve LLVM 18 toolchain + id: resolve_llvm shell: pwsh run: | $llvmVersion = "18.1.8" @@ -68,21 +69,91 @@ jobs: $llvmConfig = (Get-ChildItem -Path $llvmWork -Filter LLVMConfig.cmake -Recurse -File | Select-Object -First 1).FullName if (-not $llvmConfig) { throw "LLVMConfig.cmake not found after extracting $llvmArchiveName" } $llvmDir = Split-Path -Parent $llvmConfig - $llvmRoot = Split-Path -Parent (Split-Path -Parent (Split-Path -Parent $llvmDir)) - $llvmBin = Join-Path $llvmRoot "bin" + $clangCl = (Get-ChildItem -Path $llvmWork -Filter clang-cl.exe -Recurse -File | Select-Object -First 1).FullName + if (-not $clangCl) { throw "clang-cl.exe not found after extracting $llvmArchiveName" } + $llvmBin = Split-Path -Parent $clangCl "LLVM_DIR=$llvmDir" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - $clangCl = Join-Path $llvmBin "clang-cl.exe" - if (Test-Path $clangCl) { - "CLANG_CL_EXE=$clangCl" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - $llvmBin | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - } + "CLANG_CL_EXE=$clangCl" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + $llvmBin | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + "llvm_dir=$llvmDir" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append + "llvm_bin=$llvmBin" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append + "clang_cl=$clangCl" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append Write-Host "Resolved LLVM_DIR=$llvmDir" + Write-Host "Resolved clang-cl=$clangCl" + + - name: Resolve Rust toolchain contract + id: resolve_rust + shell: pwsh + run: | + $cargo = (Get-Command cargo -ErrorAction Stop).Source + $cargoBin = Split-Path -Parent $cargo + $rustToolchain = $env:RUSTUP_TOOLCHAIN + if (-not $rustToolchain) { + $active = @(& rustup show active-toolchain 2>$null) + if ($LASTEXITCODE -eq 0 -and $active.Count -gt 0) { + $rustToolchain = ($active[0] -split '\s+')[0] + } + } + "CARGO_EXECUTABLE=$cargo" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + $cargoBin | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + "cargo_exe=$cargo" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append + if ($rustToolchain) { + "RUSTUP_TOOLCHAIN=$rustToolchain" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + "rust_toolchain=$rustToolchain" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append + } + Write-Host "Resolved cargo=$cargo" + if ($rustToolchain) { Write-Host "Resolved Rust toolchain=$rustToolchain" } - name: Configure iced build + env: + LLVM_DIR: ${{ steps.resolve_llvm.outputs.llvm_dir }} + CLANG_CL_EXE: ${{ steps.resolve_llvm.outputs.clang_cl }} + CMAKE_C_COMPILER: ${{ steps.resolve_llvm.outputs.clang_cl }} + CMAKE_CXX_COMPILER: ${{ steps.resolve_llvm.outputs.clang_cl }} + CARGO_EXECUTABLE: ${{ steps.resolve_rust.outputs.cargo_exe }} + RUSTUP_TOOLCHAIN: ${{ steps.resolve_rust.outputs.rust_toolchain }} run: cmd /c scripts\dev\configure_iced.cmd + - name: Assert pinned LLVM compiler in CMake cache + shell: pwsh + env: + EXPECTED_CLANG_CL: ${{ steps.resolve_llvm.outputs.clang_cl }} + EXPECTED_LLVM_DIR: ${{ steps.resolve_llvm.outputs.llvm_dir }} + run: | + $cachePath = Join-Path $PWD "build_iced/CMakeCache.txt" + if (!(Test-Path $cachePath)) { throw "CMake cache not found at $cachePath" } + $cache = Get-Content $cachePath + function Get-CacheValue([string]$key) { + $line = $cache | Where-Object { $_ -match "^${key}:(FILEPATH|PATH|STRING|UNINITIALIZED)=" } | Select-Object -First 1 + if (-not $line) { throw "Missing $key in $cachePath" } + return ($line -split '=', 2)[1] + } + $expectedClang = (Resolve-Path $env:EXPECTED_CLANG_CL).Path + $expectedLlvmDir = (Resolve-Path $env:EXPECTED_LLVM_DIR).Path + $actualC = Get-CacheValue 'CMAKE_C_COMPILER' + $actualCxx = Get-CacheValue 'CMAKE_CXX_COMPILER' + $actualLlvmDir = Get-CacheValue 'LLVM_DIR' + if ((Resolve-Path $actualC).Path -ine $expectedClang) { throw "Expected C compiler '$expectedClang' but cache has '$actualC'" } + if ((Resolve-Path $actualCxx).Path -ine $expectedClang) { throw "Expected CXX compiler '$expectedClang' but cache has '$actualCxx'" } + if ((Resolve-Path $actualLlvmDir).Path -ine $expectedLlvmDir) { throw "Expected LLVM_DIR '$expectedLlvmDir' but cache has '$actualLlvmDir'" } + Write-Host "Pinned toolchain contract verified in build_iced/CMakeCache.txt" + - name: Build lifter + env: + LLVM_DIR: ${{ steps.resolve_llvm.outputs.llvm_dir }} + CLANG_CL_EXE: ${{ steps.resolve_llvm.outputs.clang_cl }} + CMAKE_C_COMPILER: ${{ steps.resolve_llvm.outputs.clang_cl }} + CMAKE_CXX_COMPILER: ${{ steps.resolve_llvm.outputs.clang_cl }} + CARGO_EXECUTABLE: ${{ steps.resolve_rust.outputs.cargo_exe }} + RUSTUP_TOOLCHAIN: ${{ steps.resolve_rust.outputs.rust_toolchain }} run: cmd /c scripts\dev\build_iced.cmd - name: Run rewrite gate + env: + LLVM_DIR: ${{ steps.resolve_llvm.outputs.llvm_dir }} + CLANG_CL_EXE: ${{ steps.resolve_llvm.outputs.clang_cl }} + CMAKE_C_COMPILER: ${{ steps.resolve_llvm.outputs.clang_cl }} + CMAKE_CXX_COMPILER: ${{ steps.resolve_llvm.outputs.clang_cl }} + CARGO_EXECUTABLE: ${{ steps.resolve_rust.outputs.cargo_exe }} + RUSTUP_TOOLCHAIN: ${{ steps.resolve_rust.outputs.rust_toolchain }} run: ${{ matrix.gate.test_command }} \ No newline at end of file diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml index e2d6c44..685b410 100644 --- a/.github/workflows/windows-build.yml +++ b/.github/workflows/windows-build.yml @@ -44,7 +44,8 @@ jobs: run: | choco install ninja --no-progress -y - - name: Resolve LLVM 18 + - name: Resolve LLVM 18 toolchain + id: resolve_llvm shell: pwsh run: | $llvmVersion = "18.1.8" @@ -65,20 +66,86 @@ jobs: if (-not $llvmConfig) { throw "LLVMConfig.cmake not found after extraction" } $llvmDir = Split-Path -Parent $llvmConfig - $llvmRoot = Split-Path -Parent (Split-Path -Parent (Split-Path -Parent $llvmDir)) - $llvmBin = Join-Path $llvmRoot "bin" + $clangCl = (Get-ChildItem -Path $llvmWork -Filter clang-cl.exe -Recurse -File | Select-Object -First 1).FullName + if (-not $clangCl) { throw "clang-cl.exe not found after extraction" } + $llvmBin = Split-Path -Parent $clangCl "LLVM_DIR=$llvmDir" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - if (Test-Path (Join-Path $llvmBin "clang-cl.exe")) { - $llvmBin | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - } + "CLANG_CL_EXE=$clangCl" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + $llvmBin | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + "llvm_dir=$llvmDir" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append + "llvm_bin=$llvmBin" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append + "clang_cl=$clangCl" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append Write-Host "LLVM_DIR=$llvmDir" + Write-Host "clang-cl=$clangCl" + + - name: Resolve Rust toolchain contract + if: ${{ matrix.needs_rust }} + id: resolve_rust + shell: pwsh + run: | + $cargo = (Get-Command cargo -ErrorAction Stop).Source + $cargoBin = Split-Path -Parent $cargo + $rustToolchain = $env:RUSTUP_TOOLCHAIN + if (-not $rustToolchain) { + $active = @(& rustup show active-toolchain 2>$null) + if ($LASTEXITCODE -eq 0 -and $active.Count -gt 0) { + $rustToolchain = ($active[0] -split '\s+')[0] + } + } + "CARGO_EXECUTABLE=$cargo" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + $cargoBin | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + "cargo_exe=$cargo" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append + if ($rustToolchain) { + "RUSTUP_TOOLCHAIN=$rustToolchain" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + "rust_toolchain=$rustToolchain" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append + } + Write-Host "cargo=$cargo" + if ($rustToolchain) { Write-Host "Rust toolchain=$rustToolchain" } - name: Configure + env: + LLVM_DIR: ${{ steps.resolve_llvm.outputs.llvm_dir }} + CLANG_CL_EXE: ${{ steps.resolve_llvm.outputs.clang_cl }} + CMAKE_C_COMPILER: ${{ steps.resolve_llvm.outputs.clang_cl }} + CMAKE_CXX_COMPILER: ${{ steps.resolve_llvm.outputs.clang_cl }} + CARGO_EXECUTABLE: ${{ steps.resolve_rust.outputs.cargo_exe }} + RUSTUP_TOOLCHAIN: ${{ steps.resolve_rust.outputs.rust_toolchain }} run: cmd /c ${{ matrix.configure_script }} + - name: Assert pinned LLVM compiler in CMake cache + shell: pwsh + env: + BUILD_DIR: ${{ matrix.build_dir }} + EXPECTED_CLANG_CL: ${{ steps.resolve_llvm.outputs.clang_cl }} + EXPECTED_LLVM_DIR: ${{ steps.resolve_llvm.outputs.llvm_dir }} + run: | + $cachePath = Join-Path $PWD "$env:BUILD_DIR/CMakeCache.txt" + if (!(Test-Path $cachePath)) { throw "CMake cache not found at $cachePath" } + $cache = Get-Content $cachePath + function Get-CacheValue([string]$key) { + $line = $cache | Where-Object { $_ -match "^${key}:(FILEPATH|PATH|STRING|UNINITIALIZED)=" } | Select-Object -First 1 + if (-not $line) { throw "Missing $key in $cachePath" } + return ($line -split '=', 2)[1] + } + $expectedClang = (Resolve-Path $env:EXPECTED_CLANG_CL).Path + $expectedLlvmDir = (Resolve-Path $env:EXPECTED_LLVM_DIR).Path + $actualC = Get-CacheValue 'CMAKE_C_COMPILER' + $actualCxx = Get-CacheValue 'CMAKE_CXX_COMPILER' + $actualLlvmDir = Get-CacheValue 'LLVM_DIR' + if ((Resolve-Path $actualC).Path -ine $expectedClang) { throw "Expected C compiler '$expectedClang' but cache has '$actualC'" } + if ((Resolve-Path $actualCxx).Path -ine $expectedClang) { throw "Expected CXX compiler '$expectedClang' but cache has '$actualCxx'" } + if ((Resolve-Path $actualLlvmDir).Path -ine $expectedLlvmDir) { throw "Expected LLVM_DIR '$expectedLlvmDir' but cache has '$actualLlvmDir'" } + Write-Host "Pinned toolchain contract verified in $env:BUILD_DIR/CMakeCache.txt" + - name: Build env: + LLVM_DIR: ${{ steps.resolve_llvm.outputs.llvm_dir }} + CLANG_CL_EXE: ${{ steps.resolve_llvm.outputs.clang_cl }} + CMAKE_C_COMPILER: ${{ steps.resolve_llvm.outputs.clang_cl }} + CMAKE_CXX_COMPILER: ${{ steps.resolve_llvm.outputs.clang_cl }} + CARGO_EXECUTABLE: ${{ steps.resolve_rust.outputs.cargo_exe }} + RUSTUP_TOOLCHAIN: ${{ steps.resolve_rust.outputs.rust_toolchain }} MERGEN_BUILD_JOBS: "4" run: cmd /c ${{ matrix.build_script }} @@ -112,7 +179,6 @@ jobs: path: rewrite-microtests-windows-${{ matrix.variant }}.exe if-no-files-found: warn - release: if: startsWith(github.ref, 'refs/tags/v') needs: build diff --git a/scripts/dev/configure_iced.cmd b/scripts/dev/configure_iced.cmd index 105de18..b821e00 100644 --- a/scripts/dev/configure_iced.cmd +++ b/scripts/dev/configure_iced.cmd @@ -150,9 +150,9 @@ if exist "%BUILD_DIR%\CMakeCache.txt" ( set "CACHED_CXX_COMPILER=" set "CACHED_LLVM_DIR=" set "RESET_BUILD_CACHE=" - for /f "tokens=1,* delims==" %%A in ('findstr /B /C:"CMAKE_C_COMPILER:FILEPATH=" "%BUILD_DIR%\CMakeCache.txt"') do set "CACHED_C_COMPILER=%%B" - for /f "tokens=1,* delims==" %%A in ('findstr /B /C:"CMAKE_CXX_COMPILER:FILEPATH=" "%BUILD_DIR%\CMakeCache.txt"') do set "CACHED_CXX_COMPILER=%%B" - for /f "tokens=1,* delims==" %%A in ('findstr /B /C:"LLVM_DIR:PATH=" "%BUILD_DIR%\CMakeCache.txt"') do set "CACHED_LLVM_DIR=%%B" + for /f "tokens=1,* delims==" %%A in ('findstr /B /R /C:"CMAKE_C_COMPILER:[^=]*=" "%BUILD_DIR%\CMakeCache.txt"') do set "CACHED_C_COMPILER=%%B" + for /f "tokens=1,* delims==" %%A in ('findstr /B /R /C:"CMAKE_CXX_COMPILER:[^=]*=" "%BUILD_DIR%\CMakeCache.txt"') do set "CACHED_CXX_COMPILER=%%B" + for /f "tokens=1,* delims==" %%A in ('findstr /B /R /C:"LLVM_DIR:[^=]*=" "%BUILD_DIR%\CMakeCache.txt"') do set "CACHED_LLVM_DIR=%%B" if defined CACHED_C_COMPILER if /I not "!CACHED_C_COMPILER!"=="!MERGEN_C_COMPILER!" set "RESET_BUILD_CACHE=1" if defined CACHED_CXX_COMPILER if /I not "!CACHED_CXX_COMPILER!"=="!MERGEN_CXX_COMPILER!" set "RESET_BUILD_CACHE=1" if defined CACHED_LLVM_DIR if /I not "!CACHED_LLVM_DIR!"=="!LLVM_CMAKE_DIR!" set "RESET_BUILD_CACHE=1" diff --git a/scripts/dev/configure_zydis.cmd b/scripts/dev/configure_zydis.cmd index ec35234..b3dc104 100644 --- a/scripts/dev/configure_zydis.cmd +++ b/scripts/dev/configure_zydis.cmd @@ -1,9 +1,9 @@ @echo off -setlocal +setlocal EnableDelayedExpansion rem --- clang-cl auto-detects MSVC headers/libs; no VsDevCmd needed --- -:resolve_cmake +::resolve_cmake set "CMAKE_BIN=" for /f "usebackq delims=" %%I in (`where cmake 2^>nul`) do ( set "CMAKE_BIN=%%I" @@ -17,8 +17,12 @@ if not defined CMAKE_BIN ( exit /b 1 ) -:resolve_llvm +::resolve_llvm set "LLVM_CMAKE_DIR=%LLVM_DIR%" +if defined LLVM_CMAKE_DIR if not exist "%LLVM_CMAKE_DIR%\LLVMConfig.cmake" ( + echo ERROR: LLVM_DIR is set but LLVMConfig.cmake was not found under "%LLVM_CMAKE_DIR%" + exit /b 1 +) if not defined LLVM_CMAKE_DIR ( if exist "%~dp0..\..\..\llvm18-install\lib\cmake\llvm\LLVMConfig.cmake" set "LLVM_CMAKE_DIR=%~dp0..\..\..\llvm18-install\lib\cmake\llvm" ) @@ -34,24 +38,86 @@ set "LLVM_CLANG_CL=" for %%I in ("%LLVM_CMAKE_DIR%\..\..\..\bin\clang-cl.exe") do if exist "%%~fI" set "LLVM_CLANG_CL=%%~fI" set "MERGEN_C_COMPILER=" -if defined CLANG_CL_EXE set "MERGEN_C_COMPILER=%CLANG_CL_EXE%" +if defined CLANG_CL_EXE ( + if exist "%CLANG_CL_EXE%" ( + set "MERGEN_C_COMPILER=%CLANG_CL_EXE%" + ) else ( + echo ERROR: CLANG_CL_EXE is set but could not be resolved: %CLANG_CL_EXE% + exit /b 1 + ) +) +if not defined MERGEN_C_COMPILER if defined CMAKE_C_COMPILER ( + if exist "%CMAKE_C_COMPILER%" ( + set "MERGEN_C_COMPILER=%CMAKE_C_COMPILER%" + ) else ( + echo ERROR: CMAKE_C_COMPILER is set but could not be resolved: %CMAKE_C_COMPILER% + exit /b 1 + ) +) if not defined MERGEN_C_COMPILER if defined LLVM_CLANG_CL set "MERGEN_C_COMPILER=%LLVM_CLANG_CL%" -if not defined MERGEN_C_COMPILER if defined CMAKE_C_COMPILER set "MERGEN_C_COMPILER=%CMAKE_C_COMPILER%" -if not defined MERGEN_C_COMPILER set "MERGEN_C_COMPILER=clang-cl" -set "MERGEN_CXX_COMPILER=" -if defined CLANG_CL_EXE set "MERGEN_CXX_COMPILER=%CLANG_CL_EXE%" -if not defined MERGEN_CXX_COMPILER if defined LLVM_CLANG_CL set "MERGEN_CXX_COMPILER=%LLVM_CLANG_CL%" -if not defined MERGEN_CXX_COMPILER if defined CMAKE_CXX_COMPILER set "MERGEN_CXX_COMPILER=%CMAKE_CXX_COMPILER%" -if not defined MERGEN_CXX_COMPILER set "MERGEN_CXX_COMPILER=%MERGEN_C_COMPILER%" +if not defined MERGEN_C_COMPILER ( + for /f "usebackq delims=" %%I in (`where clang-cl 2^>nul`) do ( + set "MERGEN_C_COMPILER=%%I" + goto found_c_compiler + ) +) +if not defined MERGEN_C_COMPILER if exist "C:\Program Files\LLVM\bin\clang-cl.exe" set "MERGEN_C_COMPILER=C:\Program Files\LLVM\bin\clang-cl.exe" +:found_c_compiler +if not defined MERGEN_C_COMPILER ( + echo ERROR: clang-cl not found. Install LLVM, set LLVM_DIR, or set CLANG_CL_EXE. + exit /b 1 +) -:configure +set "MERGEN_CXX_COMPILER=" +if defined CLANG_CL_EXE ( + if exist "%CLANG_CL_EXE%" ( + set "MERGEN_CXX_COMPILER=%CLANG_CL_EXE%" + ) else ( + echo ERROR: CLANG_CL_EXE is set but could not be resolved: %CLANG_CL_EXE% + exit /b 1 + ) +) +if not defined MERGEN_CXX_COMPILER if defined CMAKE_CXX_COMPILER ( + if exist "%CMAKE_CXX_COMPILER%" ( + set "MERGEN_CXX_COMPILER=%CMAKE_CXX_COMPILER%" + ) else ( + echo ERROR: CMAKE_CXX_COMPILER is set but could not be resolved: %CMAKE_CXX_COMPILER% + exit /b 1 + ) +) +if not defined MERGEN_CXX_COMPILER if defined LLVM_CLANG_CL set "MERGEN_CXX_COMPILER=%LLVM_CLANG_CL%" +if not defined MERGEN_CXX_COMPILER set "MERGEN_CXX_COMPILER=%MERGEN_C_COMPILER%" +for %%I in ("%MERGEN_C_COMPILER%") do set "MERGEN_COMPILER_BIN=%%~dpI" +if defined MERGEN_COMPILER_BIN set "PATH=%MERGEN_COMPILER_BIN%;%PATH%" +echo INFO: Using LLVM_DIR=%LLVM_CMAKE_DIR% +echo INFO: Using C compiler=%MERGEN_C_COMPILER% +echo INFO: Using CXX compiler=%MERGEN_CXX_COMPILER% + +::resolve_cache if exist "%BUILD_DIR%\CMakeCache.txt" ( echo INFO: Reconfiguring existing build_zydis cache for Zydis-only lane echo INFO: Clearing backend-selection cache keys to prevent stale backend state - set "CMAKE_CACHE_CLEAR_ARGS=-UICED_* -UCARGO_EXECUTABLE -UBUILD_WITH_ZYDIS" + set "CMAKE_CACHE_CLEAR_ARGS=-UICED_* -UCARGO_EXECUTABLE -URust_TOOLCHAIN -UBUILD_WITH_ZYDIS" + set "CACHED_C_COMPILER=" + set "CACHED_CXX_COMPILER=" + set "CACHED_LLVM_DIR=" + set "RESET_BUILD_CACHE=" + for /f "tokens=1,* delims==" %%A in ('findstr /B /R /C:"CMAKE_C_COMPILER:[^=]*=" "%BUILD_DIR%\CMakeCache.txt"') do set "CACHED_C_COMPILER=%%B" + for /f "tokens=1,* delims==" %%A in ('findstr /B /R /C:"CMAKE_CXX_COMPILER:[^=]*=" "%BUILD_DIR%\CMakeCache.txt"') do set "CACHED_CXX_COMPILER=%%B" + for /f "tokens=1,* delims==" %%A in ('findstr /B /R /C:"LLVM_DIR:[^=]*=" "%BUILD_DIR%\CMakeCache.txt"') do set "CACHED_LLVM_DIR=%%B" + if defined CACHED_C_COMPILER if /I not "!CACHED_C_COMPILER!"=="!MERGEN_C_COMPILER!" set "RESET_BUILD_CACHE=1" + if defined CACHED_CXX_COMPILER if /I not "!CACHED_CXX_COMPILER!"=="!MERGEN_CXX_COMPILER!" set "RESET_BUILD_CACHE=1" + if defined CACHED_LLVM_DIR if /I not "!CACHED_LLVM_DIR!"=="!LLVM_CMAKE_DIR!" set "RESET_BUILD_CACHE=1" + if defined RESET_BUILD_CACHE ( + echo INFO: Clearing build_zydis cache because the requested toolchain changed + if exist "%BUILD_DIR%\CMakeCache.txt" del /f /q "%BUILD_DIR%\CMakeCache.txt" + if exist "%BUILD_DIR%\CMakeFiles" rmdir /s /q "%BUILD_DIR%\CMakeFiles" + set "CMAKE_CACHE_CLEAR_ARGS=" + ) ) else ( set "CMAKE_CACHE_CLEAR_ARGS=" ) +::configure "%CMAKE_BIN%" -G Ninja -S "%REPO_ROOT%" -B "%BUILD_DIR%" -DCMAKE_BUILD_TYPE=Release %CMAKE_CACHE_CLEAR_ARGS% -DLLVM_DIR="%LLVM_CMAKE_DIR%" -DBUILD_WITH_ZYDIS=ON -DCMAKE_C_COMPILER="%MERGEN_C_COMPILER%" -DCMAKE_CXX_COMPILER="%MERGEN_CXX_COMPILER%" -DCMAKE_EXPORT_COMPILE_COMMANDS=ON exit /b %errorlevel% \ No newline at end of file diff --git a/scripts/rewrite/build_samples.cmd b/scripts/rewrite/build_samples.cmd index d1974a7..146f252 100644 --- a/scripts/rewrite/build_samples.cmd +++ b/scripts/rewrite/build_samples.cmd @@ -61,6 +61,10 @@ if defined CLANG_CL_EXE ( for %%I in ("%LLVM_DIR%\..\..\..\bin\clang-cl.exe") do if exist "%%~fI" set "CLANG_CL_BIN=%%~fI" if not defined CLANG_CL_BIN echo INFO: LLVM_DIR is set but does not bundle clang-cl; falling back to compiler discovery ) +if not defined CLANG_CL_BIN if defined CI ( + echo ERROR: CI requires pinned clang-cl via CLANG_CL_EXE, CMAKE_C_COMPILER, or LLVM_DIR. Refusing host fallback. + exit /b 1 +) if not defined CLANG_CL_BIN if exist "%~dp0..\..\..\llvm18-install\bin\clang-cl.exe" set "CLANG_CL_BIN=%~dp0..\..\..\llvm18-install\bin\clang-cl.exe" if not defined CLANG_CL_BIN ( for /f "usebackq delims=" %%I in (`where clang-cl 2^>nul`) do (