feat: kicad_tools headless CLI
One merged node-WASM CLI (wasm/tools, 26.5MB) supersedes sym_convert + pcb_convert: --convert-lib (absolutizes paths — fixes the legacy plugin's silent empty output on relative paths), --lint (now full-parses .kicad_pcb via the linked pcbnew parser), --erc, --netlist, --bom, --plot, --drc. Registered as the only headless CLI app; ASYNCIFY=0 CLIs skip the nanosleep→Asyncify yield shim and exit via _exit (dieted static dtors trap). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ADzCSeN3Q9DJL3YW2FZTXB
This commit is contained in:
parent
396d4c1d45
commit
ad9c4675f9
12 changed files with 1304 additions and 86 deletions
73
wasm/tools/CMakeLists.txt
Normal file
73
wasm/tools/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
# 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 -sASYNCIFY=0 -sPTHREAD_POOL_SIZE=2 -sERROR_ON_UNDEFINED_SYMBOLS=0 --pre-js ${KICAD_WASM_LAYER}/cli/sym_convert_pre.js" )
|
||||
Loading…
Reference in a new issue