Emscripten 4.x removed dynCall_* WASM exports, breaking asyncify
rewind through indirect calls (modal dialogs, event handlers).
Generate JS shims that track Asyncify.exportCallStack and register
in wasmExports so doRewind can find them.
Also fixes empty callback functions ((() => {})) generated by
Emscripten 4.x + pthreads for HTML5 events, pthread entry,
sighandler, async timer, and main loop callbacks.
Build pipeline improvements:
- Stub wasm-opt/finalize in Docker (RAM limits), run on host
- Add setup-emsdk.sh for reproducible Emscripten setup
- Simplify env.sh and version management
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
161 lines
4.3 KiB
Markdown
161 lines
4.3 KiB
Markdown
# KiCad WebAssembly Port
|
|
|
|
Run KiCad PCBnew in the browser using WebAssembly.
|
|
|
|
## Quick Start
|
|
|
|
### Full Build (KiCad + All Tests)
|
|
|
|
```bash
|
|
# 1. Initialize submodules
|
|
git submodule update --init --recursive
|
|
|
|
# 2. Build KiCad WASM (Docker, ~10 min incremental, ~1-2 hours full)
|
|
./docker/build.sh
|
|
|
|
# 3. Build wxWidgets for local testing
|
|
./scripts/build-wxuniversal-wasm.sh
|
|
|
|
# 4. Build wxWidgets test apps
|
|
./scripts/build-wasm-test.sh
|
|
|
|
# 5. Run all tests
|
|
cd tests && npm install
|
|
npm test # wxWidgets tests (256 tests)
|
|
npm run test:kicad # KiCad tests (2 tests)
|
|
```
|
|
|
|
### wxWidgets Only (No Docker)
|
|
|
|
```bash
|
|
# Requires: Node.js 18+ (Emscripten SDK auto-installed on first build)
|
|
./scripts/build-wxuniversal-wasm.sh
|
|
./scripts/build-wasm-test.sh
|
|
cd tests && npm install && npm test
|
|
```
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
kicad-wasm/
|
|
├── kicad/ # KiCad source (git submodule)
|
|
├── wxwidgets/ # wxWidgets source (git submodule)
|
|
├── wasm/ # WASM compatibility layer
|
|
│ ├── bindings/ # Embind bindings for JavaScript
|
|
│ ├── cmake/ # CMake find modules
|
|
│ ├── kiplatform/ # Platform abstraction (app, UI, printing)
|
|
│ ├── libcontext/ # Coroutine/fiber implementation
|
|
│ ├── shims/ # Runtime JavaScript shims
|
|
│ └── stubs/ # Stub implementations (libgit2, curl)
|
|
├── scripts/ # Build scripts
|
|
│ ├── build-wxuniversal-wasm.sh # Build wxWidgets for WASM
|
|
│ ├── build-wasm-test.sh # Build wxWidgets test apps
|
|
│ ├── deps/ # Dependency build scripts
|
|
│ ├── kicad/ # KiCad build scripts
|
|
│ ├── common/ # Shared utilities
|
|
│ └── config/ # Build config wrappers
|
|
├── docker/ # Docker build environment
|
|
├── tests/ # Playwright E2E tests
|
|
│ ├── e2e/ # Test specs
|
|
│ └── apps/ # WASM test applications
|
|
├── tools/ # External tools (binaryen)
|
|
└── output/ # Build output (pcbnew.js, pcbnew.wasm)
|
|
```
|
|
|
|
## Feature Branches
|
|
|
|
Each feature branch has a folder in `features/<branch-name>/` containing:
|
|
- Documentation and research notes
|
|
- `root.patch` - changes to main repo
|
|
- `kicad.patch` - changes to KiCad fork
|
|
- `wxwidgets.patch` - changes to wxWidgets fork
|
|
|
|
Generate patches: `./scripts/create-feature-patches.sh [branch-name]`
|
|
|
|
## Two Build Workflows
|
|
|
|
### 1. KiCad Build (Docker)
|
|
|
|
Full KiCad PCBnew build using Docker:
|
|
|
|
```bash
|
|
# Build KiCad WASM
|
|
./docker/build.sh
|
|
|
|
# Copy output to test directory
|
|
./tests/scripts/setup-kicad-wasm.sh
|
|
|
|
# Run KiCad tests
|
|
cd tests && npm install && npm run test:kicad
|
|
```
|
|
|
|
Output: `output/pcbnew.js`, `output/pcbnew.wasm`
|
|
|
|
See [build.md](build.md) for detailed build documentation.
|
|
|
|
### 2. wxWidgets Test Apps (Local)
|
|
|
|
Build standalone wxWidgets test apps for feature testing:
|
|
|
|
```bash
|
|
# Build wxWidgets for WASM
|
|
./scripts/build-wxuniversal-wasm.sh
|
|
|
|
# Build test apps
|
|
./scripts/build-wasm-test.sh
|
|
|
|
# Run wxWidgets tests
|
|
cd tests && npm install && npm test
|
|
```
|
|
|
|
Output: `tests/apps/standalone/`
|
|
|
|
## Prerequisites
|
|
|
|
### For KiCad Build (Docker)
|
|
- Docker Desktop with 16GB+ RAM allocated
|
|
- 10+ GB disk space for build cache
|
|
|
|
### For wxWidgets Build (Local)
|
|
- Node.js 18+ (for tests)
|
|
- Emscripten SDK (auto-installed on first build)
|
|
|
|
```bash
|
|
# Initialize submodules
|
|
git submodule update --init --recursive
|
|
|
|
# Install Emscripten SDK (auto-runs on first build, or run manually)
|
|
./scripts/setup-emsdk.sh
|
|
```
|
|
|
|
## Testing
|
|
|
|
```bash
|
|
cd tests
|
|
npm install
|
|
|
|
# Run all tests
|
|
npm test
|
|
|
|
# Run specific tests
|
|
npm run test:kicad # KiCad tests only
|
|
npx playwright test menu # Menu tests only
|
|
```
|
|
|
|
See [tests/README.md](tests/README.md) for test documentation.
|
|
|
|
## Current Status
|
|
|
|
- **wxWidgets WASM**: Core widgets working (menus, dialogs, grids, trees, OpenGL)
|
|
- **KiCad PCBnew**: Builds and loads in browser, canvas rendering working
|
|
- **In Progress**: Testing wxWidgets features used by KiCad
|
|
|
|
## Documentation
|
|
|
|
- [Build System](build.md) - Docker build details
|
|
- [Docker README](docker/README.md) - Container setup
|
|
- [Tests README](tests/README.md) - Test infrastructure
|
|
|
|
## License
|
|
|
|
KiCad is GPL-3.0. This project follows the same license.
|