171 lines
5.0 KiB
PowerShell
171 lines
5.0 KiB
PowerShell
param(
|
|
[ValidateSet("all", "msvc", "gnu", "ime")]
|
|
[string]$Toolchain = "all"
|
|
)
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
|
|
$env:PATH = "$env:USERPROFILE\.cargo\bin;$env:USERPROFILE\scoop\persist\rustup\.cargo\bin;$env:USERPROFILE\scoop\apps\rustup\current\.cargo\bin;$env:USERPROFILE\scoop\apps\mingw\current\bin;$env:PATH"
|
|
|
|
function Test-Command($Name) {
|
|
$cmd = Get-Command $Name -ErrorAction SilentlyContinue
|
|
if ($cmd) {
|
|
Write-Host "[ok] $Name -> $($cmd.Source)"
|
|
return $true
|
|
}
|
|
Write-Host "[missing] $Name"
|
|
return $false
|
|
}
|
|
|
|
function Find-MSBuild {
|
|
$cmd = Get-Command MSBuild.exe -ErrorAction SilentlyContinue
|
|
if ($cmd) {
|
|
return $cmd.Source
|
|
}
|
|
|
|
$vswhere = Join-Path ${env:ProgramFiles(x86)} "Microsoft Visual Studio\Installer\vswhere.exe"
|
|
if (Test-Path $vswhere) {
|
|
$found = & $vswhere -latest -products * -requires Microsoft.Component.MSBuild -find "MSBuild\Current\Bin\MSBuild.exe" 2>$null |
|
|
Select-Object -First 1
|
|
if ($found -and (Test-Path $found)) {
|
|
return $found
|
|
}
|
|
}
|
|
|
|
$candidates = @(
|
|
"${env:ProgramFiles}\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe",
|
|
"${env:ProgramFiles}\Microsoft Visual Studio\2022\BuildTools\MSBuild\Current\Bin\MSBuild.exe"
|
|
)
|
|
foreach ($candidate in $candidates) {
|
|
if (Test-Path $candidate) {
|
|
return $candidate
|
|
}
|
|
}
|
|
|
|
return $null
|
|
}
|
|
|
|
function Find-Kernel32Lib {
|
|
$kitsRoot = Join-Path ${env:ProgramFiles(x86)} "Windows Kits\10\Lib"
|
|
if (-not (Test-Path $kitsRoot)) {
|
|
return $null
|
|
}
|
|
Get-ChildItem -LiteralPath $kitsRoot -Directory |
|
|
Sort-Object Name -Descending |
|
|
ForEach-Object {
|
|
$candidate = Join-Path $_.FullName "um\x64\kernel32.lib"
|
|
if (Test-Path $candidate) {
|
|
return $candidate
|
|
}
|
|
}
|
|
}
|
|
|
|
function Test-IsAdministrator {
|
|
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
|
|
$principal = [Security.Principal.WindowsPrincipal]::new($identity)
|
|
return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
|
|
}
|
|
|
|
function Test-WebView2Runtime {
|
|
$paths = @(
|
|
"HKLM:\SOFTWARE\Microsoft\EdgeUpdate\Clients\{F1E7FBD4-9C4C-41A4-AB01-7C0F7A947F1A}",
|
|
"HKLM:\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F1E7FBD4-9C4C-41A4-AB01-7C0F7A947F1A}"
|
|
)
|
|
foreach ($path in $paths) {
|
|
if (Test-Path $path) {
|
|
Write-Host "[ok] WebView2 Runtime registry key found"
|
|
return $true
|
|
}
|
|
}
|
|
Write-Host "[warn] WebView2 Runtime registry key not found; install Evergreen runtime if the app window is blank."
|
|
return $false
|
|
}
|
|
|
|
$failed = $false
|
|
|
|
Write-Host "== Common prerequisites =="
|
|
foreach ($name in @("node", "npm", "rustc", "cargo", "rustup")) {
|
|
if (-not (Test-Command $name)) {
|
|
$failed = $true
|
|
}
|
|
}
|
|
Test-WebView2Runtime | Out-Null
|
|
|
|
if ($Toolchain -eq "all" -or $Toolchain -eq "msvc") {
|
|
Write-Host ""
|
|
Write-Host "== MSVC route =="
|
|
if (-not (Test-Command "link.exe")) {
|
|
Write-Host "[hint] Run from a Developer PowerShell, or call vcvars64.bat first."
|
|
$failed = $true
|
|
}
|
|
$kernel32 = Find-Kernel32Lib
|
|
if ($kernel32) {
|
|
Write-Host "[ok] kernel32.lib -> $kernel32"
|
|
} else {
|
|
Write-Host "[missing] kernel32.lib"
|
|
Write-Host "[hint] Install Visual Studio Build Tools workload 'Desktop development with C++' and a Windows 10/11 SDK."
|
|
$failed = $true
|
|
}
|
|
}
|
|
|
|
if ($Toolchain -eq "all" -or $Toolchain -eq "gnu") {
|
|
Write-Host ""
|
|
Write-Host "== GNU/MinGW route =="
|
|
foreach ($name in @("gcc", "dlltool")) {
|
|
if (-not (Test-Command $name)) {
|
|
$failed = $true
|
|
}
|
|
}
|
|
if (Get-Command rustup -ErrorAction SilentlyContinue) {
|
|
$toolchains = & rustup toolchain list 2>$null
|
|
if ($toolchains -match "x86_64-pc-windows-gnu") {
|
|
Write-Host "[ok] Rust GNU toolchain installed"
|
|
} else {
|
|
Write-Host "[missing] stable-x86_64-pc-windows-gnu"
|
|
Write-Host "[hint] rustup toolchain install stable-x86_64-pc-windows-gnu"
|
|
$failed = $true
|
|
}
|
|
} else {
|
|
Write-Host "[missing] rustup"
|
|
$failed = $true
|
|
}
|
|
if ((Get-Location).Path -match "\s") {
|
|
Write-Host "[warn] Current path contains spaces. Use scripts/windows-build-gnu.ps1 or build from a no-space path."
|
|
}
|
|
}
|
|
|
|
if ($Toolchain -eq "all" -or $Toolchain -eq "ime") {
|
|
Write-Host ""
|
|
Write-Host "== Windows IME route =="
|
|
$msbuild = Find-MSBuild
|
|
if ($msbuild) {
|
|
Write-Host "[ok] MSBuild.exe -> $msbuild"
|
|
} else {
|
|
Write-Host "[missing] MSBuild.exe"
|
|
Write-Host "[hint] Install Visual Studio Build Tools workload 'Desktop development with C++'."
|
|
$failed = $true
|
|
}
|
|
|
|
$kernel32 = Find-Kernel32Lib
|
|
if ($kernel32) {
|
|
Write-Host "[ok] kernel32.lib -> $kernel32"
|
|
} else {
|
|
Write-Host "[missing] kernel32.lib"
|
|
Write-Host "[hint] Install a Windows 10/11 SDK with x64 libraries."
|
|
$failed = $true
|
|
}
|
|
|
|
if (Test-IsAdministrator) {
|
|
Write-Host "[ok] Administrator shell for TSF registration"
|
|
} else {
|
|
Write-Host "[warn] Registering/unregistering the TSF IME requires an elevated Administrator PowerShell."
|
|
}
|
|
}
|
|
|
|
if ($failed) {
|
|
exit 1
|
|
}
|
|
|
|
Write-Host ""
|
|
Write-Host "Preflight passed."
|