78 lines
2.6 KiB
PowerShell
78 lines
2.6 KiB
PowerShell
[CmdletBinding()]
|
|
param(
|
|
[string]$OutputDirectory = ''
|
|
)
|
|
|
|
Set-StrictMode -Version Latest
|
|
$ErrorActionPreference = 'Stop'
|
|
|
|
$root = (Resolve-Path -LiteralPath $PSScriptRoot).Path
|
|
if ([string]::IsNullOrWhiteSpace($OutputDirectory)) {
|
|
$OutputDirectory = Join-Path $root 'x64\RuntimeGuard'
|
|
}
|
|
|
|
$output = [System.IO.Path]::GetFullPath($OutputDirectory).TrimEnd('\') + '\'
|
|
$intermediateRoot = $output.TrimEnd('\') + '.int'
|
|
$vswhere = 'C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe'
|
|
if (-not (Test-Path -LiteralPath $vswhere)) {
|
|
throw "vswhere not found: $vswhere"
|
|
}
|
|
|
|
$msbuild = & $vswhere -latest -products * -requires Microsoft.Component.MSBuild `
|
|
-find 'MSBuild\**\Bin\MSBuild.exe' | Select-Object -First 1
|
|
if ([string]::IsNullOrWhiteSpace($msbuild)) {
|
|
throw 'MSBuild was not found by vswhere.'
|
|
}
|
|
|
|
New-Item -ItemType Directory -Force -Path $output | Out-Null
|
|
New-Item -ItemType Directory -Force -Path $intermediateRoot | Out-Null
|
|
|
|
function Invoke-ProjectRebuild {
|
|
param(
|
|
[Parameter(Mandatory)] [string]$Project,
|
|
[Parameter(Mandatory)] [string]$IntermediateName
|
|
)
|
|
|
|
$intermediate = (Join-Path $intermediateRoot $IntermediateName).TrimEnd('\') + '\'
|
|
$arguments = @(
|
|
$Project,
|
|
'/m',
|
|
'/t:Rebuild',
|
|
'/p:Configuration=Release',
|
|
'/p:Platform=x64',
|
|
"/p:OutDir=$output",
|
|
"/p:IntDir=$intermediate",
|
|
'/v:minimal'
|
|
)
|
|
|
|
& $msbuild @arguments
|
|
if ($LASTEXITCODE -ne 0) {
|
|
throw "MSBuild failed for $Project with exit code $LASTEXITCODE."
|
|
}
|
|
}
|
|
|
|
$selfTestProject = Join-Path $root 'CFramework.SelfTest\CFramework.SelfTest.vcxproj'
|
|
$overlayProject = Join-Path $root 'CFramework\CFramework.vcxproj'
|
|
$selfTestExe = Join-Path $output 'CFramework.SelfTest.exe'
|
|
$overlayExe = Join-Path $output 'CFramework.exe'
|
|
|
|
Write-Host '[guard] Rebuilding offline runtime tests...'
|
|
Invoke-ProjectRebuild -Project $selfTestProject -IntermediateName 'SelfTest'
|
|
|
|
Write-Host '[guard] Running offline runtime tests...'
|
|
& $selfTestExe
|
|
if ($LASTEXITCODE -ne 0) {
|
|
throw "Runtime self-test failed with exit code $LASTEXITCODE. Overlay build blocked."
|
|
}
|
|
|
|
Write-Host '[guard] Tests passed; rebuilding Release x64 overlay...'
|
|
Invoke-ProjectRebuild -Project $overlayProject -IntermediateName 'CFramework'
|
|
|
|
$selfTestHash = (Get-FileHash -LiteralPath $selfTestExe -Algorithm SHA256).Hash
|
|
$overlayHash = (Get-FileHash -LiteralPath $overlayExe -Algorithm SHA256).Hash
|
|
Write-Host "[guard] PASS"
|
|
Write-Host "[guard] SelfTest: $selfTestExe"
|
|
Write-Host "[guard] SelfTest SHA256: $selfTestHash"
|
|
Write-Host "[guard] Overlay: $overlayExe"
|
|
Write-Host "[guard] Overlay SHA256: $overlayHash"
|