Rename docs/ to features/ with per-feature folders. Add script to generate patches for root repo and submodules. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
5.2 KiB
KiCad IPC API - WASM Fork Changes
Overview
We added #ifdef KICAD_IPC_API guards to 18 KiCad source files. These guards wrap:
#includestatements for protobuf/API headersSerialize()andDeserialize()methods
Key insight: Since our build uses KICAD_IPC_API=ON (line 251 of scripts/kicad/build-pcbnew.sh), these guards don't actually disable any code - everything compiles. The guards can be safely reverted to reduce fork divergence.
Modified Files
| File | What We Guarded |
|---|---|
common/eda_shape.cpp |
#include for API headers, Serialize(), Deserialize() |
common/eda_text.cpp |
#include for API headers, Serialize(), Deserialize() |
common/netclass.cpp |
#include for API headers, Serialize(), Deserialize() |
include/api/api_utils.h |
Entire namespace content (utility functions) |
pcbnew/api/api_pcb_utils.h |
Entire file content |
pcbnew/board_connected_item.cpp |
#include for API headers, Serialize(), Deserialize() |
pcbnew/board_stackup_manager/board_stackup.cpp |
#include for API headers, Serialize(), Deserialize() |
pcbnew/footprint.cpp |
#include for API headers, Serialize(), Deserialize() |
pcbnew/pad.cpp |
#include for API headers, Serialize(), Deserialize() |
pcbnew/padstack.cpp |
#include for API headers, Serialize(), Deserialize() |
pcbnew/pcb_dimension.cpp |
#include for API headers, Serialize(), Deserialize() |
pcbnew/pcb_field.cpp |
#include for API headers, Serialize(), Deserialize() |
pcbnew/pcb_group.cpp |
#include for API headers, Serialize(), Deserialize() |
pcbnew/pcb_shape.cpp |
#include for API headers, Serialize(), Deserialize() |
pcbnew/pcb_text.cpp |
#include for API headers, Serialize(), Deserialize() |
pcbnew/pcb_textbox.cpp |
#include for API headers, Serialize(), Deserialize() |
pcbnew/pcb_track.cpp |
#include for API headers, Serialize(), Deserialize() |
pcbnew/zone.cpp |
#include for API headers, Serialize(), Deserialize() |
Example of Our Changes
Before (upstream):
#include <api/api_enums.h>
#include <api/api_utils.h>
#include <api/board/board_types.pb.h>
void PAD::Serialize( google::protobuf::Any &aContainer ) const
{
// ... serialization code
}
After (our fork):
#ifdef KICAD_IPC_API
#include <api/api_enums.h>
#include <api/api_utils.h>
#include <api/board/board_types.pb.h>
#endif
#ifdef KICAD_IPC_API
void PAD::Serialize( google::protobuf::Any &aContainer ) const
{
// ... serialization code
}
#endif
Why We Added These Guards
Originally added to allow building with KICAD_IPC_API=OFF, which would:
- Skip protobuf dependency
- Exclude serialization methods that depend on protobuf types
However, our current build has KICAD_IPC_API=ON, making these guards unnecessary.
How to Revert
To revert these files to upstream (base commit 4bfed3f174):
cd kicad
git checkout 4bfed3f174 -- \
common/eda_shape.cpp \
common/eda_text.cpp \
common/netclass.cpp \
include/api/api_utils.h \
pcbnew/api/api_pcb_utils.h \
pcbnew/board_connected_item.cpp \
pcbnew/board_stackup_manager/board_stackup.cpp \
pcbnew/footprint.cpp \
pcbnew/pad.cpp \
pcbnew/padstack.cpp \
pcbnew/pcb_dimension.cpp \
pcbnew/pcb_field.cpp \
pcbnew/pcb_group.cpp \
pcbnew/pcb_shape.cpp \
pcbnew/pcb_text.cpp \
pcbnew/pcb_textbox.cpp \
pcbnew/pcb_track.cpp \
pcbnew/zone.cpp
Then rebuild:
./docker/build.sh --clean-kicad
Note: toolbars_pcb_editor.cpp
This file has #ifdef KICAD_SCRIPTING guards (not IPC API guards):
#ifdef KICAD_SCRIPTING
#include "../scripting/python_scripting.h"
#endif
...
#ifdef KICAD_SCRIPTING
bool scriptingAvailable = SCRIPTING::IsWxAvailable();
#else
bool scriptingAvailable = false;
#endif
Cannot be fully reverted because:
KICAD_SCRIPTING=OFFfor WASM builds (CMakeLists.txt lines 135-138)- Without guards, build fails (python_scripting.h not built, SCRIPTING class doesn't exist)
This is a separate concern from the IPC API and is documented here for completeness.
Impact of Reversion
- Fork diff reduction: 18 fewer modified files
- Build behavior: No change (KICAD_IPC_API=ON, code compiles identically)
- Functionality: No change (serialization methods still available)
Related: IPC API Architecture
KiCad's IPC API uses:
- Protobuf messages for request/response serialization
- NNG sockets for transport (stubbed in WASM - see
wasm/stubs/nng_stub.c) - API_HANDLER_PCB class for handling requests (instantiated in PCB_EDIT_FRAME)
Our stub at wasm/stubs/api_plugin_stub.cpp provides no-op implementations for:
KICAD_API_SERVER::Start(),Stop(),Running()KICAD_API_SERVER::RegisterHandler(),DeregisterHandler()
Future: JavaScript Bridge
To expose the IPC API to JavaScript (optional enhancement):
- Modify
api_plugin_stub.cppto store registered handlers - Create Embind bindings in
wasm/bindings/api_bridge.cpp - Expose
KiCadApi_HandleRequest(protobufData)function - Use
protobuf.json JS side for message creation/parsing
This would enable JS automation without modifying any KiCad source files.