pcbjam/docker
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Viktor Vaczi db9d6ee04b feat(wasm): occ-split — lazy occ_service worker; kicad_editor drops OCC (−31%)
Move OpenCASCADE out of the merged editor image into occ_service: a separate
emscripten module (-sASYNCIFY=0, MODULARIZE, in-container -Oz finalize, 2N+8
pre-warmed pthread pool) booted lazily in a dedicated Web Worker on the first
STEP export or STEP/IGES model parse. kicad_editor.wasm ~190 MB -> 130 MB;
sessions that never touch OCC never fetch its 57 MB. STEP export works in the
browser for the first time: the unchanged desktop dialog runs EXPORTER_STEP,
whose wasm shadow suspends into globalThis.occService and the export bytes go
straight to a browser download (never entering the editor heap). STEP/IGES 3D
models parse in the worker via the oce shadow (S3D WriteCache/ReadCache wire).

- wasm/occ-service/: service CMake target (hooked from the kicad fork's
  top-level CMakeLists, wasm/editor pattern), embind entry
  (occExport/occLoadModel), wxConfig pre-js.
- wasm/stubs/{exporter_step,oce_plugin}_stub.cpp: EM_ASYNC_JS worker bridges
  (callee-shadowing; no caller #ifdefs).
- web/standalone: provider installed whenever the kicad_editor bundle boots
  (cross-face safe); ONE shared worker-boot source occ-worker.js (vite ?raw;
  the e2e stub reads the same file) — blob worker with locateFile absolutized
  against the glue URL; export download-name guard.
- deps: OCC builds with RapidJSON so its glTF/GLB writer exists — pinned to
  the vcpkg master snapshot 2025-02-26 (24b5e7a8b27f), the same code official
  KiCad consumes via vcpkg.json's opencascade[rapidjson]; rapidjson's latest
  tag (v1.1.0, 2016) is ill-formed under modern clang.
- tests: occ-export dialog e2e (lazy-fetch boundary + STEP download bytes),
  occ-probe incl. a 9-format matrix (step/stpz/brep/xao/ply/stl/glb/u3d/pdf),
  3d-viewer-models hard-asserts the worker parse; occ provider stub installed
  ambiently by the kicad fixtures.

Validated against desktop kicad-cli 10.0.4: geometric exact equality (bbox
delta 0 um, volume delta 0.0000%) for STEP/GLB/STL/BREP/STPZ across three
boards and option sweeps — with desktop OCC 7.9 vs wasm OCC 7.8; PLY/XAO/PDF
structurally equal; U3D same-size (quantizer float LSBs differ). Full kicad
e2e green on Firefox and Chromium; standalone verified end to end (lazy fetch
only on the Export click; export.step 60,628 B ISO-10303-21; loadModel 700 KB
STEP -> 569 KB scenegraph cache).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 12:39:58 +02:00
..
build.sh feat(wasm): occ-split — lazy occ_service worker; kicad_editor drops OCC (−31%) 2026-07-03 12:39:58 +02:00
docker-compose.yml feat(wasm-eh): migrate the WASM build to native wasm exceptions (+ 3D viewer default-on) 2026-06-30 09:40:26 +02:00
Dockerfile feat(wasm-eh): migrate the WASM build to native wasm exceptions (+ 3D viewer default-on) 2026-06-30 09:40:26 +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 feat(wasm-eh): migrate the WASM build to native wasm exceptions (+ 3D viewer default-on) 2026-06-30 09:40:26 +02: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