- Add build.md documentation for the WASM build system - Default to debug builds with -gsource-map for WASM debugging - Add --release flag to disable debug symbols - Add --clean flag for full rebuild (deps + wxWidgets + KiCad) - Add -j N flag for parallel compilation (default: 1 for sequential) - Update Docker memory limit to 32GB - Propagate DEBUG_BUILD and JOBS to all dependency scripts Build modes: - ./docker/build.sh --clean -j8 (full rebuild, parallel) - ./docker/build.sh (rebuild KiCad only) - ./docker/build.sh --no-clean (incremental) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
222 lines
6.2 KiB
Shell
Executable file
222 lines
6.2 KiB
Shell
Executable file
#!/bin/bash
|
|
# Master build script for KiCad PCBnew WASM
|
|
# Usage: ./build-kicad-wasm.sh [OPTIONS]
|
|
#
|
|
# Options:
|
|
# --clean Full clean rebuild
|
|
# --deps-only Only build dependencies
|
|
# --skip-deps Skip dependency builds
|
|
# --with-occ Enable OpenCASCADE (3D/STEP support)
|
|
# --with-ngspice Enable ngspice (simulation)
|
|
# --with-pthread Enable pthreads (multi-threading)
|
|
# --release Release build (optimized, no debug symbols)
|
|
# --debug Debug build with symbols (default)
|
|
# -j N Parallel jobs (default: nproc)
|
|
# --help Show this help
|
|
|
|
set -e
|
|
|
|
# Source common environment
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
source "$SCRIPT_DIR/common/env.sh"
|
|
|
|
# Default options
|
|
DEPS_ONLY=0
|
|
SKIP_DEPS=0
|
|
WITH_OCC=0
|
|
WITH_NGSPICE=0
|
|
WITH_PTHREAD=0
|
|
|
|
# Show help
|
|
show_help() {
|
|
head -20 "$0" | tail -18 | sed 's/^# //' | sed 's/^#//'
|
|
exit 0
|
|
}
|
|
|
|
# Parse command line arguments
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--help|-h)
|
|
show_help
|
|
;;
|
|
--clean)
|
|
CLEAN_BUILD=1
|
|
shift
|
|
;;
|
|
--deps-only)
|
|
DEPS_ONLY=1
|
|
shift
|
|
;;
|
|
--skip-deps)
|
|
SKIP_DEPS=1
|
|
shift
|
|
;;
|
|
--with-occ)
|
|
WITH_OCC=1
|
|
shift
|
|
;;
|
|
--with-ngspice)
|
|
WITH_NGSPICE=1
|
|
shift
|
|
;;
|
|
--with-pthread)
|
|
WITH_PTHREAD=1
|
|
shift
|
|
;;
|
|
--debug)
|
|
DEBUG_BUILD=1
|
|
shift
|
|
;;
|
|
--release)
|
|
DEBUG_BUILD=0
|
|
shift
|
|
;;
|
|
-j)
|
|
PARALLEL_JOBS="$2"
|
|
shift 2
|
|
;;
|
|
-j*)
|
|
PARALLEL_JOBS="${1#-j}"
|
|
shift
|
|
;;
|
|
*)
|
|
log_error "Unknown option: $1"
|
|
show_help
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Set defaults if not set
|
|
CLEAN_BUILD=${CLEAN_BUILD:-0}
|
|
DEBUG_BUILD=${DEBUG_BUILD:-1} # Debug mode by default (use --release for optimized builds)
|
|
PARALLEL_JOBS=${PARALLEL_JOBS:-$(get_nproc)}
|
|
|
|
# Export for sub-scripts
|
|
export CLEAN_BUILD DEBUG_BUILD PARALLEL_JOBS WITH_OCC WITH_NGSPICE WITH_PTHREAD
|
|
|
|
# Print configuration
|
|
echo "========================================"
|
|
echo "KiCad WASM Build"
|
|
echo "========================================"
|
|
echo " Clean build: $CLEAN_BUILD"
|
|
echo " Debug build: $DEBUG_BUILD"
|
|
echo " Deps only: $DEPS_ONLY"
|
|
echo " Skip deps: $SKIP_DEPS"
|
|
echo " With OCC: $WITH_OCC"
|
|
echo " With ngspice: $WITH_NGSPICE"
|
|
echo " With pthreads: $WITH_PTHREAD"
|
|
echo " Parallel jobs: $PARALLEL_JOBS"
|
|
echo "========================================"
|
|
|
|
# Verify prerequisites
|
|
setup_error_trap
|
|
verify_emscripten
|
|
verify_submodules "$PROJECT_ROOT"
|
|
|
|
# Clean if requested
|
|
if [ "$CLEAN_BUILD" = "1" ]; then
|
|
log_step "Cleaning previous builds..."
|
|
rm -rf "$STAMPS_DIR"/*
|
|
rm -rf "$DEPS_ROOT"/*
|
|
rm -rf "$BUILD_ROOT/kicad"
|
|
fi
|
|
|
|
# Build dependencies
|
|
if [ "$SKIP_DEPS" != "1" ]; then
|
|
log_step "Building dependencies..."
|
|
|
|
# Tier 1: Header-only (just verify they exist)
|
|
log_info "Tier 1: Header-only libraries (no build needed)"
|
|
|
|
# Tier 2: Simple C/C++ libraries from thirdparty
|
|
log_info "Tier 2: Simple libraries"
|
|
# These are built as part of KiCad's CMake, no separate build needed
|
|
|
|
# Tier 3: Emscripten ports
|
|
log_info "Tier 3: Emscripten ports (zlib, freetype via -sUSE_*)"
|
|
# These are linked via emscripten flags, no separate build
|
|
|
|
# Build Zstd
|
|
if [ -f "$SCRIPT_DIR/build-deps/build-zstd-wasm.sh" ]; then
|
|
build_if_needed "zstd" "$SCRIPT_DIR/build-deps/build-zstd-wasm.sh" "$CLEAN_BUILD"
|
|
else
|
|
log_warn "Zstd build script not found, skipping"
|
|
fi
|
|
|
|
# Build HarfBuzz
|
|
if [ -f "$SCRIPT_DIR/build-deps/build-harfbuzz-wasm.sh" ]; then
|
|
build_if_needed "harfbuzz" "$SCRIPT_DIR/build-deps/build-harfbuzz-wasm.sh" "$CLEAN_BUILD"
|
|
else
|
|
log_warn "HarfBuzz build script not found, skipping"
|
|
fi
|
|
|
|
# Build Pixman
|
|
if [ -f "$SCRIPT_DIR/build-deps/build-pixman-wasm.sh" ]; then
|
|
build_if_needed "pixman" "$SCRIPT_DIR/build-deps/build-pixman-wasm.sh" "$CLEAN_BUILD"
|
|
else
|
|
log_warn "Pixman build script not found, skipping"
|
|
fi
|
|
|
|
# Build Cairo
|
|
if [ -f "$SCRIPT_DIR/build-deps/build-cairo-wasm.sh" ]; then
|
|
build_if_needed "cairo" "$SCRIPT_DIR/build-deps/build-cairo-wasm.sh" "$CLEAN_BUILD"
|
|
else
|
|
log_warn "Cairo build script not found, skipping"
|
|
fi
|
|
|
|
# Tier 4: Complex dependencies
|
|
if [ "$WITH_OCC" = "1" ]; then
|
|
log_info "Tier 4: Building OpenCASCADE..."
|
|
if [ -f "$SCRIPT_DIR/build-deps/build-opencascade-wasm.sh" ]; then
|
|
build_if_needed "opencascade" "$SCRIPT_DIR/build-deps/build-opencascade-wasm.sh" "$CLEAN_BUILD"
|
|
else
|
|
log_warn "OpenCASCADE build script not found"
|
|
fi
|
|
fi
|
|
|
|
if [ "$WITH_NGSPICE" = "1" ]; then
|
|
log_info "Tier 4: Building ngspice..."
|
|
if [ -f "$SCRIPT_DIR/build-deps/build-ngspice-wasm.sh" ]; then
|
|
build_if_needed "ngspice" "$SCRIPT_DIR/build-deps/build-ngspice-wasm.sh" "$CLEAN_BUILD"
|
|
else
|
|
log_warn "ngspice build script not found"
|
|
fi
|
|
fi
|
|
|
|
# Verify wxWidgets is built
|
|
if [ ! -f "$WX_BUILD/wx-config" ]; then
|
|
log_step "Building wxWidgets..."
|
|
"$SCRIPT_DIR/build-wxuniversal-wasm.sh"
|
|
else
|
|
log_info "wxWidgets already built"
|
|
fi
|
|
|
|
log_info "Dependencies complete"
|
|
fi
|
|
|
|
if [ "$DEPS_ONLY" = "1" ]; then
|
|
log_info "Dependency build complete (--deps-only specified)"
|
|
exit 0
|
|
fi
|
|
|
|
# Build KiCad compatibility layer
|
|
log_step "Building WASM compatibility layer..."
|
|
if [ -f "$SCRIPT_DIR/build-wasm-compat.sh" ]; then
|
|
"$SCRIPT_DIR/build-wasm-compat.sh"
|
|
else
|
|
log_warn "WASM compatibility layer script not found, skipping"
|
|
fi
|
|
|
|
# Build KiCad PCBnew
|
|
log_step "Building KiCad PCBnew..."
|
|
if [ -f "$SCRIPT_DIR/build-pcbnew-wasm.sh" ]; then
|
|
"$SCRIPT_DIR/build-pcbnew-wasm.sh"
|
|
else
|
|
log_error "PCBnew build script not found: $SCRIPT_DIR/build-pcbnew-wasm.sh"
|
|
exit 1
|
|
fi
|
|
|
|
log_info "========================================"
|
|
log_info "Build complete!"
|
|
log_info "Output: $BUILD_ROOT/kicad/pcbnew/"
|
|
log_info "========================================"
|