From 198b73eb966ced6634784cfa7cdf0f66ff622ed4 Mon Sep 17 00:00:00 2001 From: Cyd Date: Fri, 10 Jul 2026 23:57:14 -0500 Subject: [PATCH] Deploy: freeze the render bridge to renderer.exe -- archive is now complete render-bridge/freeze.ps1: PyInstaller onefile of live_bridge.py + Dave's vrboard/vrview/vrview_gl (+glcontext collected for moderngl) -> dist\ renderer.exe (~33 MB). GL backend live-verified from a pure-dist launch (no --root/--renderer overrides) on 2026-07-10. package.ps1 bundles the frozen exe automatically when present; DEPLOYMENT-PLAN's renderer OPEN item is resolved. Ignore the build-artifact dirs. Co-Authored-By: Claude Fable 5 --- .gitignore | 7 +++++++ emulator/DEPLOYMENT-PLAN.md | 6 ++++-- emulator/deploy/package.ps1 | 10 +++++++--- emulator/render-bridge/freeze.ps1 | 24 ++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 emulator/render-bridge/freeze.ps1 diff --git a/.gitignore b/.gitignore index a916f75..2e2a87b 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,10 @@ /emulator/dbx_*.txt /emulator/screen*.png __pycache__/ + +# Deployment build artifacts (rebuild: deploy/package.ps1 + render-bridge/freeze.ps1) +/emulator/dist/ +/emulator/render-bridge/dist/ +/emulator/pod-launch/publish/ +/emulator/pod-launch/bin/pkg/ +/emulator/bld*.log diff --git a/emulator/DEPLOYMENT-PLAN.md b/emulator/DEPLOYMENT-PLAN.md index b0d8cf9..74c131d 100644 --- a/emulator/DEPLOYMENT-PLAN.md +++ b/emulator/DEPLOYMENT-PLAN.md @@ -134,8 +134,10 @@ Single root folder + `postinstall.bat`. Everything the install needs is inside: affair that survives game updates. postinstall detects an existing install and only warns when absent (a bundled `deploy\npcap.exe` is still honored if shipped) -- The renderer (**OPEN:** freeze to one exe vs bundle embeddable Python -- decide - with David; "decide later") +- The renderer -- **RESOLVED 2026-07-10: frozen to one exe** (PyInstaller + onefile, `render-bridge\freeze.ps1` -> `dist\renderer.exe`, ~33 MB, GL + backend live-verified from a pure-dist launch). `package.ps1` bundles it + automatically when present. - `net_*.conf` **templates** with `@@ROOT@@` / `@@REALNIC@@` tokens, launch dispatcher, `postinstall.bat` diff --git a/emulator/deploy/package.ps1 b/emulator/deploy/package.ps1 index 85e3ed1..b0739c8 100644 --- a/emulator/deploy/package.ps1 +++ b/emulator/deploy/package.ps1 @@ -74,9 +74,13 @@ if ($NoContent) { Copy-Item (Join-Path $Emu 'net-boot') $root -Recurse } -# renderer (frozen exe) -- else flagged -if ($Renderer) { Copy-Item $Renderer (Join-Path $root 'renderer.exe'); Log "bundled renderer -> renderer.exe" } -else { Warn "no -Renderer: renderer NOT bundled (freeze pending). pod-launch needs --renderer or a bundled render-bridge at runtime." } +# renderer (frozen exe): default to render-bridge\freeze.ps1's output -- else flagged +if (-not $Renderer) { + $frozen = Join-Path $Emu 'render-bridge\dist\renderer.exe' + if (Test-Path $frozen) { $Renderer = $frozen } +} +if ($Renderer) { Copy-Item $Renderer (Join-Path $root 'renderer.exe'); Log "bundled renderer -> renderer.exe ($Renderer)" } +else { Warn "no renderer: run render-bridge\freeze.ps1 (or pass -Renderer). pod-launch needs --renderer or a render bridge at runtime." } # Npcap installer -- optional: policy (2026-07-10) is a one-time MANUAL install # per cockpit; postinstall detects it and only warns when absent. diff --git a/emulator/render-bridge/freeze.ps1 b/emulator/render-bridge/freeze.ps1 new file mode 100644 index 0000000..b7e0e8a --- /dev/null +++ b/emulator/render-bridge/freeze.ps1 @@ -0,0 +1,24 @@ +# freeze.ps1 -- PyInstaller onefile of live_bridge.py -> dist\renderer.exe, +# the deployable render bridge (package.ps1 bundles it automatically when +# present). pod-launch invokes it as: renderer.exe tcp:8621 . +# +# Needs the Windows CPython (py -3.13) with the render-bridge wheels plus +# pyinstaller: py -3.13 -m pip install numpy pygame-ce moderngl pillow pyinstaller +# +# Dave's modules (vrboard/vrview/vrview_gl) come from ..\..\dpl3-revive\patha +# and are baked into the exe; _backend's runtime sys.path insert becomes a +# harmless no-op in the frozen build. glcontext is moderngl's dynamically +# imported binary backend -- PyInstaller misses it without --collect-all. +# First frozen + live-verified (GL backend) 2026-07-10. +$ErrorActionPreference = 'Stop' +Set-Location $PSScriptRoot +py -3.13 -m PyInstaller --onefile --noconsole --name renderer ` + --paths ..\..\dpl3-revive\patha ` + --hidden-import vrview_gl --hidden-import vrview --hidden-import vrboard ` + --collect-all glcontext ` + --distpath .\dist ` + --workpath (Join-Path $env:TEMP 'pyi-renderer') ` + --specpath (Join-Path $env:TEMP 'pyi-renderer') ` + live_bridge.py +if ($LASTEXITCODE -ne 0) { throw "PyInstaller failed" } +Write-Host "[freeze] dist\renderer.exe ready ($('{0:N1} MB' -f ((Get-Item .\dist\renderer.exe).Length / 1MB)))"