Files
hakorune/tools/windows/build_egui_aot.ps1

96 lines
3.5 KiB
PowerShell

# NOTE: Save this file with ANSI encoding (no BOM). Use only ASCII characters in this file.
param(
[Alias('Input')][string]$InputPath = "apps/egui-hello-plugin/main.hako",
[Alias('Out')][string]$OutputPath = "app_egui",
[switch]$Verbose
)
function Info($msg) { Write-Host "[build] $msg" }
function Fail($msg) { Write-Host "[error] $msg"; exit 1 }
$ErrorActionPreference = "Stop"
if ($Verbose) { $env:NYASH_CLI_VERBOSE = "1" }
# Normalize paths
if ([string]::IsNullOrWhiteSpace($InputPath)) { Fail "Input is empty. Example: -Input .\apps\egui-hello-plugin\main.hako" }
if ([string]::IsNullOrWhiteSpace($OutputPath)) { $OutputPath = "app_egui" }
try { $InputPath = (Resolve-Path $InputPath).Path } catch { Fail "Input script not found: $InputPath" }
if (-not [System.IO.Path]::IsPathRooted($OutputPath)) { $OutputPath = (Join-Path (Get-Location) $OutputPath) }
if (-not $OutputPath.ToLower().EndsWith('.exe')) { $OutputExe = "$OutputPath.exe" } else { $OutputExe = $OutputPath }
Info "Input=$InputPath"
Info "Out=$OutputExe"
# 1) Build Egui plugin (with-egui)
Info "Building Egui plugin (with-egui)..."
Push-Location plugins/nyash-egui-plugin
try {
cargo build --release --features with-egui | Out-Host
} catch {
Pop-Location
Fail "Plugin build failed"
}
Pop-Location
# 2) Build nyash with Cranelift (AOT tools)
Info "Building nyash (cranelift-jit feature for AOT tools)..."
try {
cargo build --release --features cranelift-jit | Out-Host
} catch {
Fail "nyash build failed"
}
# 3) AOT: emit native exe - MERGED FROM build_aot.ps1
Info "Emitting object (.o) via JIT (Strict/No-fallback)..."
$host.ui.WriteLine("[build] Heads-up: Running Nyash to emit main.o will open the Egui window. Close the window to continue linking.")
$env:NYASH_AOT_OBJECT_OUT = if ([string]::IsNullOrWhiteSpace($env:NYASH_AOT_OBJECT_OUT)) { "target/aot_objects" } else { $env:NYASH_AOT_OBJECT_OUT }
$env:NYASH_USE_PLUGIN_BUILTINS = "1"
$env:NYASH_JIT_EXEC = "1"
$env:NYASH_JIT_ONLY = "1"
$env:NYASH_JIT_STRICT = "1"
$env:NYASH_JIT_ARGS_HANDLE_ONLY = "1"
$env:NYASH_JIT_THRESHOLD = "1"
if (-not (Test-Path $env:NYASH_AOT_OBJECT_OUT)) { [void][System.IO.Directory]::CreateDirectory($env:NYASH_AOT_OBJECT_OUT) }
& .\target\release\nyash --backend vm $InputPath | Out-Null
$OBJ = Join-Path $env:NYASH_AOT_OBJECT_OUT "main.o"
if (-not (Test-Path $OBJ)) {
Fail "object not generated: $OBJ`n hint: ensure main() is lowerable under current Strict JIT coverage"
}
Info "Building libnyrt (static runtime)..."
Push-Location crates\nyrt
& cargo build --release | Out-Null
Pop-Location
Info "Linking $OutputExe ..."
# Try native clang first (LLVM for Windows). On Windows, we avoid -lpthread/-ldl/-lm.
$clang = Get-Command clang -ErrorAction SilentlyContinue
if ($clang) {
$libDir = "crates/nyrt/target/release"
$libName = ""
if (Test-Path (Join-Path $libDir "nyrt.lib")) { $libName = "nyrt.lib" }
elseif (Test-Path (Join-Path $libDir "libnyrt.a")) { $libName = "libnyrt.a" }
if ($libName -ne "") {
$libPath = Join-Path $libDir $libName
$args = @($OBJ, $libPath, "-o", $OutputExe)
& clang @args | Out-Null
}
}
if (-not (Test-Path $OutputExe)) {
$bash = Get-Command bash -ErrorAction SilentlyContinue
if ($bash) {
& bash -lc "cc target/aot_objects/main.o -L crates/nyrt/target/release -Wl,--whole-archive -lnyrt -Wl,--no-whole-archive -lpthread -ldl -lm -o $OutputExe" | Out-Null
}
}
if (Test-Path "$OutputExe") {
Info "Success. Output: $OutputExe"
Write-Host "Run: $OutputExe"
} else {
Fail "Output exe not found: $OutputExe"
}