| Filename | Latest commit message | Latest commit date |
|---|---|---|
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>
|
||
| .. | ||
| build.sh | ||
| docker-compose.yml | ||
| Dockerfile | ||
| entrypoint.sh | ||
| README.md | ||
| shell.sh | ||
Docker Build Environment for KiCad WASM
This directory contains Docker configuration for building KiCad for WebAssembly in a reproducible, isolated environment.
Prerequisites
- Docker Desktop (with Docker Compose v2)
- Git submodules initialized:
git submodule update --init --recursive
Quick Start
# Build KiCad WASM (full build)
./docker/build.sh
# Build with options
./docker/build.sh --no-clean # Skip cleaning build directory
./docker/build.sh --debug # Build with debug symbols
# Interactive shell for debugging
./docker/shell.sh
Branch-Specific Builds
Each git branch gets isolated Docker containers and volumes, enabling parallel development:
# On branch 'main' → containers/volumes prefixed with 'kicad-wasm-main'
# On branch 'feature-x' → containers/volumes prefixed with 'kicad-wasm-feature-x'
This allows you to:
- Work on multiple branches simultaneously using git worktrees
- Each worktree has its own build cache (no conflicts)
- Switch branches without rebuilding from scratch
Using git worktrees for parallel development:
# Create a worktree for a new branch
git worktree add ../kicad-wasm-feature path/to/branch
# Build in the worktree (uses isolated Docker volumes)
cd ../kicad-wasm-feature
./docker/build.sh
# List all worktrees
git worktree list
What Gets Built
The build process includes:
-
Dependencies (cached in Docker volume):
- GLM (header-only)
- Zstd, Protobuf
- FreeType, HarfBuzz
- Pixman, Cairo
- Boost (Locale)
- OpenCASCADE (optional, for 3D/STEP)
- CURL headers, libgit2 headers (stubs)
-
wxWidgets (built from submodule)
-
KiCad PCBnew (main application)
Container Resources
Configured for M4 Max (adjust in docker-compose.yml):
- CPUs: 10 cores
- Memory: 16GB
Volume Strategy
| Path | Type | Purpose |
|---|---|---|
/workspace |
Bind mount | Source code |
/workspace/build-wasm |
Named volume | Build cache (deps, sysroot) |
/workspace/output |
Bind mount | Final WASM output |
Common Commands
# Start container
docker compose -f docker/docker-compose.yml up -d
# Run a command inside
docker compose -f docker/docker-compose.yml exec kicad-wasm-builder <command>
# View logs
docker compose -f docker/docker-compose.yml logs -f
# Stop container
docker compose -f docker/docker-compose.yml down
# Clear build cache (full rebuild)
docker volume rm docker_kicad-build-cache
Troubleshooting
Build freezes
The OpenCASCADE build is very resource-intensive. If it freezes:
- Reduce parallel jobs: Edit script to use
-j4instead of-j$(nproc) - Monitor with
docker stats - Consider building OpenCASCADE separately with
./scripts/deps/build-opencascade.sh
Permission issues
Files created in container are owned by root. To fix:
sudo chown -R $(whoami) output/
Cache issues
# Clear all cached builds
docker volume rm docker_kicad-build-cache
# Or clear specific stamps inside container
./docker/shell.sh
rm /workspace/build-wasm/stamps/*.stamp