pcbjam/docker
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Viktor Vaczi 7dc1bf27e0 refactor: collapse dual-mode plumbing — the DOM port is the only WASM build
The canvas (wxUniversal) mode is gone (wxwidgets submodule); remove every
piece of side-by-side plumbing so there is exactly one build and one test
flow:

- scripts/build-wxuniversal-wasm.sh -> scripts/build-wx-wasm.sh; no
  --dom/--enable-universal; builds into build-wasm/wxwidgets
- build-wasm-test.sh: no DOM_BUILD / apps-dom rsync mirror / PORT=dom;
  apps build straight into tests/apps (Makefile.wasm PORT conditionals
  collapsed; wx.js + wx-dom.js always pre-js)
- docker/build.sh, build-kicad-target.sh, env.sh: WX_PORT / -dom /
  -universal suffixes removed; kicad builds to kicad-<app>, outputs to
  output/; wx.js/wx-dom.js copied from the real source path
  (/workspace/wxwidgets/build/wasm — the old build-wasm path never
  existed and silently failed)
- setup-kicad-wasm.sh: single target dir; the perl wx-dom.js injection is
  gone — the 7 checked-in kicad pages now reference wx-dom.js directly
- playwright configs serve apps/; fixtures drop the test-results/dom and
  logs/wxwidgets/dom namespacing; boot.spec asserts wxDomPort
  unconditionally; pcbnew.spec uses one reference image;
  appearance.spec assertions unconditional
- compare/update-baseline-screenshots.sh: --port removed
- tests/gal-regression/wasm/Makefile: links build-wasm/wxwidgets and
  carries wx-dom.js as a second pre-js — the gal-webgl suite (30 specs)
  now actually builds and runs here (it needed host-side boost+glm via
  scripts/deps; the bundle had been missing, timing the whole spec out)
- tests: clickCanvas() dispatches via page.mouse (DOM widgets
  legitimately cover the canvas; locator actionability refused the
  click); the comprehensive spec drives wxChoice through its native
  <select> (browser-owned popup cannot be coordinate-clicked)
- docs: README/CLAUDE.md/build.md script names and dirs;
  features/wx-dom-port README reframed (DOM is THE port), visual-notes
  bugs 26-28; FindwxWidgets.cmake config label drops 'wasmuniv'
- wxwidgets submodule -> 9dbacc9448 (DOM-only port, fork diff shrunk)

Gate: full wx e2e suite 292 passed / 1 skipped / 0 failed — first run
ever with the gal-webgl specs green (28 scenarios + load + sequential).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 20:19:48 +02:00
..
build.sh refactor: collapse dual-mode plumbing — the DOM port is the only WASM build 2026-06-12 20:19:48 +02:00
docker-compose.yml perf(build): 4h05m -> 1h15m full CI build — docker caps, pipelined wasm-opt, Binaryen 130 2026-06-11 07:48:46 +02:00
Dockerfile fix(docker): add unzip to image (required by GLM dep build) 2026-05-25 19:59:15 +02:00
entrypoint.sh fix(docker): make container emsdk authoritative for exec, stop host emsdk leak 2026-05-25 19:41:55 +02:00
README.md Add Quick Start docs and branch-specific Docker builds 2026-01-03 09:08:12 +01:00
shell.sh Add Docker build environment for KiCad WASM 2025-12-08 12:07:01 +01:00

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:

  1. 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)
  2. wxWidgets (built from submodule)

  3. 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:

  1. Reduce parallel jobs: Edit script to use -j4 instead of -j$(nproc)
  2. Monitor with docker stats
  3. 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