113 lines
4.0 KiB
PowerShell
113 lines
4.0 KiB
PowerShell
|
|
<#
|
|||
|
|
One‑shot manual build for app_egui.exe (Windows, PowerShell)
|
|||
|
|
|
|||
|
|
This script replicates the exact manual steps you listed:
|
|||
|
|
1) Build Egui plugin (with-egui)
|
|||
|
|
2) Build Nyash (with Cranelift AOT toolchain)
|
|||
|
|
3) Emit AOT object (main.o) from the Egui Nyash script
|
|||
|
|
NOTE: An Egui window will open — close it to continue
|
|||
|
|
4) Build the NyRT static runtime library
|
|||
|
|
5) Link main.o + NyRT into app_egui.exe using clang (or cc)
|
|||
|
|
|
|||
|
|
Usage:
|
|||
|
|
pwsh -File tools/windows/build_app_egui_manual.ps1 \
|
|||
|
|
-Input apps/egui-hello-plugin/main.nyash -Out app_egui.exe
|
|||
|
|
|
|||
|
|
Options:
|
|||
|
|
-Input : Path to Nyash Egui script (default: apps/egui-hello-plugin/main.nyash)
|
|||
|
|
-Out : Output exe path/name (default: app_egui.exe)
|
|||
|
|
-Verbose: Prints extra logs
|
|||
|
|
#>
|
|||
|
|
|
|||
|
|
param(
|
|||
|
|
[Alias('Input')][string]$InputPath = "apps/egui-hello-plugin/main.nyash",
|
|||
|
|
[Alias('Out')][string]$OutputExe = "app_egui.exe",
|
|||
|
|
[switch]$Verbose
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
$ErrorActionPreference = 'Stop'
|
|||
|
|
|
|||
|
|
function Info($msg) { Write-Host "[manual] $msg" -ForegroundColor Cyan }
|
|||
|
|
function Warn($msg) { Write-Host "[manual] $msg" -ForegroundColor Yellow }
|
|||
|
|
function Fail($msg) { Write-Host "[manual] ERROR: $msg" -ForegroundColor Red; exit 1 }
|
|||
|
|
|
|||
|
|
if ($Verbose) { $env:NYASH_CLI_VERBOSE = '1' }
|
|||
|
|
|
|||
|
|
# Normalize/resolve paths
|
|||
|
|
try { $InputPath = (Resolve-Path $InputPath).Path } catch { Fail "Input script not found: $InputPath" }
|
|||
|
|
if (-not [System.IO.Path]::IsPathRooted($OutputExe)) { $OutputExe = (Join-Path (Get-Location) $OutputExe) }
|
|||
|
|
|
|||
|
|
# 1) 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
|
|||
|
|
} finally { Pop-Location }
|
|||
|
|
|
|||
|
|
# 2) Nyash core (Cranelift tooling enabled)
|
|||
|
|
Info "Building Nyash (cranelift-jit feature for AOT tools)..."
|
|||
|
|
cargo build --release --features cranelift-jit | Out-Host
|
|||
|
|
|
|||
|
|
# 3) Emit main.o via Nyash (AOT object)
|
|||
|
|
$env:NYASH_AOT_OBJECT_OUT = if ([string]::IsNullOrWhiteSpace($env:NYASH_AOT_OBJECT_OUT)) { "target/aot_objects" } else { $env:NYASH_AOT_OBJECT_OUT }
|
|||
|
|
if (-not (Test-Path $env:NYASH_AOT_OBJECT_OUT)) { [void][System.IO.Directory]::CreateDirectory($env:NYASH_AOT_OBJECT_OUT) }
|
|||
|
|
|
|||
|
|
# Minimal strictness to keep emission deterministic
|
|||
|
|
$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'
|
|||
|
|
|
|||
|
|
Info "Emitting main.o (an Egui window will appear — close it to continue)..."
|
|||
|
|
& .\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" }
|
|||
|
|
|
|||
|
|
# 4) Build NyRT static runtime
|
|||
|
|
Info "Building NyRT static runtime..."
|
|||
|
|
Push-Location crates/nyrt
|
|||
|
|
try {
|
|||
|
|
cargo build --release | Out-Host
|
|||
|
|
} finally { Pop-Location }
|
|||
|
|
|
|||
|
|
# 5) Link
|
|||
|
|
Info "Linking $OutputExe ..."
|
|||
|
|
$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 -eq "") { Fail "NyRT static library not found in $libDir" }
|
|||
|
|
$libPath = Join-Path $libDir $libName
|
|||
|
|
|
|||
|
|
# Prefer specific LLVM clang if present
|
|||
|
|
$clangCandidates = @(
|
|||
|
|
"$Env:LLVM_SYS_180_PREFIX\bin\clang.exe",
|
|||
|
|
"C:\\LLVM-18\\bin\\clang.exe",
|
|||
|
|
(Get-Command clang -ErrorAction SilentlyContinue | ForEach-Object { $_.Source })
|
|||
|
|
) | Where-Object { $_ -and (Test-Path $_) }
|
|||
|
|
|
|||
|
|
if ($clangCandidates.Count -gt 0) {
|
|||
|
|
$clang = $clangCandidates[0]
|
|||
|
|
Info "Using clang: $clang"
|
|||
|
|
& $clang $obj $libPath -o $OutputExe | Out-Host
|
|||
|
|
} else {
|
|||
|
|
# Fallback: use bash/cc with Linux-like flags, if available (MSYS2/WSL)
|
|||
|
|
$bash = Get-Command bash -ErrorAction SilentlyContinue
|
|||
|
|
if ($bash) {
|
|||
|
|
& bash -lc "cc '$obj' -L '$libDir' -Wl,--whole-archive -lnyrt -Wl,--no-whole-archive -lpthread -ldl -lm -o '$OutputExe'" | Out-Host
|
|||
|
|
} else {
|
|||
|
|
Fail "Neither clang nor bash/cc found. Install LLVM clang or MSYS2/WSL toolchain."
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (Test-Path $OutputExe) {
|
|||
|
|
Info "Success. Output: $OutputExe"
|
|||
|
|
Write-Host "Run: $OutputExe"
|
|||
|
|
} else {
|
|||
|
|
Fail "Output exe not found: $OutputExe"
|
|||
|
|
}
|
|||
|
|
|