pcbjam/wasm/tools/CMakeLists.txt
Viktor Vaczi 9c475a804e jspi cleanup: remove the asyncify-era residue — dead code, conditionals, pipeline scaffolding, stale prose
The runtime is JSPI-only; this removes everything that still pretended
otherwise. Three exhaustive sweeps (C++/JS+build+CI/tests+docs) drove
the inventory; every deletion verified by grep closure + full gates.

Broken-right-now fixes:
- deploy-staging.yml passed the retired opt_level input — the workflow
  could not even start. Removed.
- env.sh carried dead exports with a live -sASYNCIFY=1 inside
  (WASM_LDFLAGS/PTHREAD_LDFLAGS, zero consumers). Removed; the
  WASM_LEGACY_EXCEPTIONS rationale rewritten to the real reason.
- docker/build.sh exported PCBJAM_ASYNC_BACKEND (read nowhere). Gone.

Dead weight removed:
- binaryen submodule (nothing builds or invokes it), wasm-opt-bench
  workflow + scripts/bench/, get-wasm-opt.sh, diagnostics.js (242 lines
  of Asyncify-API-only code), the KICAD_PIPELINE background-postprocess
  scaffolding (existed to parallelize the deleted wasm-opt phase; the
  postprocess is a seconds-long node script and now runs inline),
  build-monitor's dead asyncify rows, sched-context orphan build
  output, dead .gitignore entries, the .jspi-assets spike dir (the two
  wf-result research JSONs moved to docs/features/async/migration-evidence/).
- bindings: fiber_park.h + its 12 embind registrations (broken-if-
  called under JSPI), the kicadOpenFileStart/OPEN_JOB starter route,
  main_stack_runner.h + 5 includes, the always-null context-sleep weak
  hook in nanosleep_yield.c.
- shim: the backend field (installed-flag idempotency instead),
  noteContextWait (dead both sides), the __wxAsyncifyDump alias (+ the
  WasmTool fallback and string-dump normalize branch).
- web: the emscripten-6-ignored mainScriptUrlOrBlob option in boot.ts
  (gerber-demo keeps it: it loads the deployed CDN release, which
  predates emscripten 6 — noted inline).

Conditionals: all 'backend === jspi' checks reduced to scheduler-
presence checks; races_quiescent re-keyed from Asyncify.state (vacuous)
to real backlog quiescence (resumeReady/mutatorQueue — NOT _windowLive,
which is the probing activation's own window by definition).

Renames (identifiers only, no file renames): ASYNC_LINK_FLAGS→
JSPI_LINK_FLAGS and Makefile ASYNC_LDFLAGS→JSPI_LDFLAGS,
kicadCollabFiberBusy→kicadCollabBusy (embind + web + tests),
collab_common.h fiber*→apply*/coroutine naming, asyncifySignatures→
wasmTrapSignatures (lists byte-identical).

Tests: the two remaining vacuous [wx-asyncify]/fiber-resume-refused
asserts re-keyed to live JSPI beacons; eeschema-load's failure message
no longer sends the developer to a deleted script; wait-beacons' dead
families/parser deleted; lane-0 legacy-glue guards removed (lane 0 is
unconstructible); the embind test.fail re-gated with the JSPI reason
(plain embind invokers cannot suspend — verified still failing);
lint-determinism now scans tests/jspi (166 files clean);
eeschema-collab local-move gated to chromium (~50% flaky on FF even
solo; pcbnew twin covers both engines).

Docs: DEBUG.md rewritten as the JSPI debugging guide; build.md
describes the single-phase build; docs/features/async/README.md
banner-marked historical and repointed at the NEW
23-jspi-runtime.md (current architecture: export census, turnstile,
libcontext ownership + refusal contract, embind call shapes, the
em-pthread service-wrapper trick, exception policy, known gaps).

Gates on the cleaned tree: test:e2e 725 passed / 0 failed (after the
quiescence-probe fix; the 3 other reds were verified contention flakes
solo-green or the documented FF gate), web 76/0, jspi 18/18 both
engines, vitest 295/295 + 17/17, all lints green, live-app census
clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016X9eh1s5sTx1o9Em9KBuwR
2026-08-14 09:25:32 +02:00

73 lines
3.6 KiB
CMake

# Merged headless KiCad CLI (kicad_tools) — pcbjam-mcp 0001 tier 3a.
#
# ONE node-WASM executable links BOTH dieted kifaces and carries every
# sym_convert + pcb_convert subcommand:
# kicad_tools <in.lib> <out.kicad_sym> (legacy convert)
# kicad_tools --lint | --erc | --netlist | --bom | --plot (eeschema side)
# kicad_tools --drc (pcbnew side)
#
# Added from the kicad fork's top-level CMakeLists.txt via
# add_subdirectory( ${KICAD_WASM_LAYER}/tools ) when EMSCRIPTEN AND
# KICAD_TOOLS_WASM — after eeschema/ and pcbnew/, so both kifaces' CACHE
# INTERNAL library lists exist here (same pattern as wasm/editor/). The tree
# must configure with BOTH diet options ON (KICAD_SYM_CONVERTER_WASM +
# KICAD_PCB_CONVERTER_WASM — build-kicad-target.sh passes all three flags).
#
# Collision note: the merged *editor* needs KICAD_WASM_PCB_SIDE_RENAMES
# (Kiface() + dialog/tool-layer classes, audited via llvm-nm intersection).
# Under the two CLI diets every TU in that audited set is pruned on at least
# one side — neither tree even defines Kiface() — so no renames here. Re-audit
# with scripts/kicad/audit-merged-symbols.sh on kicad version bumps.
#
# The standalone sym_convert / pcb_convert targets still exist in this
# (options-ON) tree but are built from their own per-app trees as before.
include_directories( BEFORE ${INC_BEFORE} )
include_directories(
${CMAKE_SOURCE_DIR}/common
${CMAKE_SOURCE_DIR}/pcbnew
${INC_AFTER}
)
add_executable( kicad_tools
# Link-order diet stubs: listed before the kiface objects so
# --allow-multiple-definition resolves duplicated definitions to these
# (first definition wins) — both sides' stub sets apply.
${KICAD_WASM_LAYER}/cli/sym_convert_stubs.cpp
${KICAD_WASM_LAYER}/cli/pcb_convert_stubs.cpp
${KICAD_WASM_LAYER}/cli/sym_convert_main.cpp
${KICAD_WASM_LAYER}/cli/pcb_convert_main.cpp
${KICAD_WASM_LAYER}/cli/kicad_tools_main.cpp
)
# The per-app mains compile as libraries here: KICAD_TOOLS_COMBINED renames
# their entry points (symConvertMain / pcbConvertMain) and drops their own
# main(); kicad_tools_main.cpp dispatches between them.
target_compile_definitions( kicad_tools PRIVATE KICAD_TOOLS_COMBINED )
# Both kifaces' full library sets (exported CACHE INTERNAL by pcbnew/ and
# eeschema/). The overlap (common, kicommon, gal, ...) is deduped.
set( KICAD_TOOLS_LIBS ${PCBNEW_KIFACE_LIBRARIES} ${EESCHEMA_KIFACE_LIBRARIES} )
list( REMOVE_DUPLICATES KICAD_TOOLS_LIBS )
target_link_libraries( kicad_tools PRIVATE ${KICAD_TOOLS_LIBS} )
# Same link shape as pcb_convert: allow-multiple-definition for the wx/KiCad
# dupes and --whole-archive pcbcommon so RTTI-only-referenced vtables/typeinfo
# are pulled in.
target_link_options( kicad_tools PRIVATE
"LINKER:--allow-multiple-definition"
"LINKER:--whole-archive"
"$<TARGET_FILE:pcbcommon>"
"LINKER:--no-whole-archive"
)
# Node CLI link shape — identical rationale to sym_convert (see
# eeschema/CMakeLists.txt): real FS, auto-run main(), synchronous, no embind,
# -g0 so wasm-emscripten-finalize doesn't OOM on DWARF, undefined symbols
# become aborting JS imports (both diets leave dangling refs from
# vtable-pinned-but-never-run editor code). The pre-js (shared with
# sym_convert) backs wxConfig with an in-memory store and copies process.env
# into the wasm ENV.
set_target_properties( kicad_tools PROPERTIES
LINK_FLAGS "-Oz -g0 --profiling-funcs -sSTACK_SIZE=2MB -sENVIRONMENT=node -sNODERAWFS=1 -sINVOKE_RUN=1 -sEXIT_RUNTIME=1 -sPTHREAD_POOL_SIZE=2 -sERROR_ON_UNDEFINED_SYMBOLS=0 --pre-js ${KICAD_WASM_LAYER}/cli/sym_convert_pre.js" )