fix(trace): make ?trace= work by merging Module.ENV in the glue

The emscripten glue's `var ENV = {};` never merged Module.ENV, so boot.ts's
Module.ENV.KICAD_TRACE was a silent no-op — and since environ_get on a pthread
proxies to the main thread, the app/UI thread's getenv read the (empty) main
ENV. Net: KICAD_TRACE never arrived and every KI_TRACE was a no-op.

scripts/common/patch-env-shim.mjs post-processes each generated <app>.js to
merge Module.ENV into ENV (idempotent; runtime no-op when unset), wired into
docker/build.sh's per-app host post-process next to the dyncall-shim inject.
Replaces a fragile manual glue edit re-applied after every build. Verified:
symbol-editor eager load now emits KI_TRACE_SYM_CHOOSER fatLoad timing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Gergő Törcsvári 2026-07-01 11:01:10 +02:00
commit 89a433fda9
No known key found for this signature in database
GPG key ID: 8E75F2CDE64E5322
3 changed files with 69 additions and 3 deletions

View file

@ -190,9 +190,12 @@ async function doBoot(opts: BootOptions): Promise<void> {
// Dev/diagnostics: ?trace=<KICAD_TRACE mask> turns on a KiCad trace channel for
// this boot (e.g. ?trace=KI_TRACE_SYM_CHOOSER for symbol-chooser timing). Set on
// the page's Module.ENV (main thread) AND seeded into each pthread worker via
// pthreadWorkerScript (the app/UI thread under PROXY_TO_PTHREAD); the glue's
// ENV-merge shim feeds it into the C environ that wxGetEnv reads.
// the page's Module.ENV (main thread). Under PROXY_TO_PTHREAD the app/UI thread
// is a pthread, but `environ_get` on a pthread proxies to the MAIN thread — so
// the main thread's ENV is what `getenv("KICAD_TRACE")` reads. The build's
// patch-env-shim.mjs makes the glue merge Module.ENV into that ENV (emscripten's
// glue otherwise ignores Module.ENV); the per-worker seed below is a harmless
// belt-and-suspenders. See docs/features/libs/0013.
const traceMask = new URLSearchParams(window.location.search).get("trace");
// libs: install the provider (must exist before any plugin call can suspend