2025-09-06 16:18:46 +09:00
|
|
|
# NOTE: Save this file with ANSI encoding (no BOM). Use only ASCII characters in this file.
|
|
|
|
|
|
|
|
|
|
param(
|
2025-11-06 15:41:52 +09:00
|
|
|
[Alias('Input')][string]$InputPath = "apps/egui-hello-plugin/main.hako",
|
2025-09-06 16:18:46 +09:00
|
|
|
[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
|
2025-11-06 15:41:52 +09:00
|
|
|
if ([string]::IsNullOrWhiteSpace($InputPath)) { Fail "Input is empty. Example: -Input .\apps\egui-hello-plugin\main.hako" }
|
2025-09-06 16:18:46 +09:00
|
|
|
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"
|
|
|
|
|
}
|