Add KiCad WASM build infrastructure and dependency scripts
- Add build environment setup (scripts/common/env.sh, versions.sh, functions.sh) - Add dependency build scripts for Zstd, GLM, FreeType, HarfBuzz, Pixman, Cairo - Add placeholder scripts for OpenCASCADE, ngspice, protobuf - Add WASM compatibility layer (wasm/kiplatform/, wasm/libcontext/) - Add CMake modules for KiCad WASM cross-compilation - Add PCBnew test infrastructure (tests/kicad/) - Add build plan documentation Successfully tested builds: Zstd 1.5.5, GLM 0.9.9.8, FreeType 2.13.2, HarfBuzz 8.3.0, Pixman 0.42.2, Cairo 1.18.0 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
756feb35da
commit
3034d9d76f
36 changed files with 3708 additions and 0 deletions
217
scripts/build-kicad-wasm.sh
Executable file
217
scripts/build-kicad-wasm.sh
Executable file
|
|
@ -0,0 +1,217 @@
|
|||
#!/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)
|
||||
# --debug Debug build with symbols
|
||||
# -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
|
||||
;;
|
||||
-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:-0}
|
||||
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 "========================================"
|
||||
110
scripts/build-pcbnew-wasm.sh
Executable file
110
scripts/build-pcbnew-wasm.sh
Executable file
|
|
@ -0,0 +1,110 @@
|
|||
#!/bin/bash
|
||||
# Build KiCad PCBnew for WebAssembly
|
||||
# This builds the PCB editor as a standalone WASM application
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "${SCRIPT_DIR}/common/env.sh"
|
||||
source "${SCRIPT_DIR}/common/versions.sh"
|
||||
source "${SCRIPT_DIR}/common/functions.sh"
|
||||
|
||||
KICAD_DIR="${PROJECT_ROOT}/kicad"
|
||||
KICAD_BUILD="${BUILD_ROOT}/kicad"
|
||||
KICAD_STAMP="${BUILD_ROOT}/stamps/kicad-pcbnew.stamp"
|
||||
WASM_LAYER="${PROJECT_ROOT}/wasm"
|
||||
|
||||
# Parse arguments
|
||||
CLEAN=0
|
||||
SKIP_DEPS=0
|
||||
DEBUG=0
|
||||
for arg in "$@"; do
|
||||
case $arg in
|
||||
--clean)
|
||||
CLEAN=1
|
||||
;;
|
||||
--skip-deps)
|
||||
SKIP_DEPS=1
|
||||
;;
|
||||
--debug)
|
||||
DEBUG=1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $CLEAN -eq 1 ]; then
|
||||
log_info "Cleaning KiCad build..."
|
||||
rm -rf "${KICAD_BUILD}" "${KICAD_STAMP}"
|
||||
fi
|
||||
|
||||
# Build dependencies first
|
||||
if [ $SKIP_DEPS -eq 0 ]; then
|
||||
log_info "Building dependencies..."
|
||||
"${SCRIPT_DIR}/deps/build-all-deps.sh" --all
|
||||
fi
|
||||
|
||||
# Check if already built
|
||||
if check_stamp "${KICAD_STAMP}"; then
|
||||
log_info "KiCad PCBnew already built, skipping..."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Ensure wxWidgets is built
|
||||
if [ ! -f "${SYSROOT}/lib/libwx_baseu-3.2.a" ]; then
|
||||
log_error "wxWidgets not found. Please build wxWidgets first with:"
|
||||
log_error " ./scripts/build-wxuniversal-wasm.sh"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_info "Building KiCad PCBnew ${KICAD_VERSION} for WASM..."
|
||||
|
||||
# Set build type
|
||||
if [ $DEBUG -eq 1 ]; then
|
||||
BUILD_TYPE="Debug"
|
||||
EXTRA_FLAGS="-g -O0"
|
||||
else
|
||||
BUILD_TYPE="Release"
|
||||
EXTRA_FLAGS="-O2"
|
||||
fi
|
||||
|
||||
mkdir -p "${KICAD_BUILD}"
|
||||
cd "${KICAD_BUILD}"
|
||||
|
||||
# Configure KiCad with WASM-specific options
|
||||
# We use CMAKE_MODULE_PATH to inject our compatibility layer
|
||||
emcmake cmake "${KICAD_DIR}" \
|
||||
-DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
|
||||
-DCMAKE_INSTALL_PREFIX="${SYSROOT}" \
|
||||
-DCMAKE_MODULE_PATH="${WASM_LAYER}/cmake" \
|
||||
-DCMAKE_CXX_FLAGS="${EXTRA_FLAGS} -pthread -DKICAD_USE_PLATFORM_WASM=1" \
|
||||
-DCMAKE_C_FLAGS="${EXTRA_FLAGS} -pthread" \
|
||||
-DCMAKE_EXE_LINKER_FLAGS="-pthread -sASYNCIFY=1 -sASYNCIFY_STACK_SIZE=65536 -sUSE_PTHREADS=1 -sPTHREAD_POOL_SIZE=4 -sALLOW_MEMORY_GROWTH=1 -sINITIAL_MEMORY=256MB -sMAXIMUM_MEMORY=4GB" \
|
||||
-DCMAKE_PREFIX_PATH="${SYSROOT}" \
|
||||
-DwxWidgets_CONFIG_EXECUTABLE="${SYSROOT}/bin/wx-config" \
|
||||
\
|
||||
-DKICAD_BUILD_QA_TESTS=OFF \
|
||||
-DKICAD_SCRIPTING=OFF \
|
||||
-DKICAD_SCRIPTING_PYTHON3=OFF \
|
||||
-DKICAD_SCRIPTING_WXPYTHON=OFF \
|
||||
-DKICAD_SPICE=ON \
|
||||
-DKICAD_USE_OCC=ON \
|
||||
-DKICAD_USE_EGL=OFF \
|
||||
-DKICAD_USE_BUNDLED_GLEW=ON \
|
||||
\
|
||||
-DOCC_INCLUDE_DIR="${SYSROOT}/include/opencascade" \
|
||||
-DOCC_LIBRARY_DIR="${SYSROOT}/lib" \
|
||||
-DNGSPICE_INCLUDE_DIR="${SYSROOT}/include" \
|
||||
-DNGSPICE_LIBRARY="${SYSROOT}/lib/libngspice.a" \
|
||||
\
|
||||
-DBUILD_GITHUB_PLUGIN=OFF \
|
||||
-DKICAD_PCM=OFF \
|
||||
\
|
||||
-DKICAD_LIBRARY_DATA="${PROJECT_ROOT}/kicad-library"
|
||||
|
||||
# Build only pcbnew and its dependencies
|
||||
# Note: We build specific targets to avoid building unnecessary components
|
||||
emmake make -j${JOBS} pcbnew
|
||||
|
||||
create_stamp "${KICAD_STAMP}"
|
||||
log_info "KiCad PCBnew build complete!"
|
||||
log_info "Output: ${KICAD_BUILD}/pcbnew/pcbnew.js"
|
||||
67
scripts/common/env.sh
Executable file
67
scripts/common/env.sh
Executable file
|
|
@ -0,0 +1,67 @@
|
|||
#!/bin/bash
|
||||
# Environment setup for KiCad WASM build scripts
|
||||
|
||||
# Get script and project directories using unique names to avoid conflicts
|
||||
_KICAD_WASM_COMMON_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
_KICAD_WASM_SCRIPTS_DIR="$(dirname "$_KICAD_WASM_COMMON_DIR")"
|
||||
_KICAD_WASM_PROJECT_ROOT="$(dirname "$_KICAD_WASM_SCRIPTS_DIR")"
|
||||
|
||||
# Export paths
|
||||
export PROJECT_ROOT="$_KICAD_WASM_PROJECT_ROOT"
|
||||
export SCRIPTS_DIR="$_KICAD_WASM_SCRIPTS_DIR"
|
||||
export COMMON_DIR="$_KICAD_WASM_COMMON_DIR"
|
||||
|
||||
# Build output directories (inside the project)
|
||||
export BUILD_ROOT="$PROJECT_ROOT/build-wasm"
|
||||
export DEPS_ROOT="$BUILD_ROOT/deps"
|
||||
export SYSROOT="$BUILD_ROOT/sysroot"
|
||||
export STAMPS_DIR="$BUILD_ROOT/stamps"
|
||||
|
||||
# Source directories
|
||||
export KICAD_SOURCE="$PROJECT_ROOT/kicad"
|
||||
export WXWIDGETS_SOURCE="$PROJECT_ROOT/wxwidgets"
|
||||
export WASM_COMPAT="$PROJECT_ROOT/wasm"
|
||||
export STUBS_DIR="$PROJECT_ROOT/stubs"
|
||||
export CMAKE_MODULES="$PROJECT_ROOT/cmake"
|
||||
|
||||
# wxWidgets build location
|
||||
export WX_BUILD="$BUILD_ROOT/wxwidgets-universal"
|
||||
|
||||
# Emscripten settings
|
||||
export EMSDK_QUIET=1
|
||||
|
||||
# Common compiler flags
|
||||
export EMCC_CFLAGS="-fPIC -DEMSCRIPTEN"
|
||||
export EMCC_CXXFLAGS="-fPIC -DEMSCRIPTEN -std=c++17"
|
||||
|
||||
# Common linker flags for WASM
|
||||
export WASM_LDFLAGS="\
|
||||
-sALLOW_MEMORY_GROWTH=1 \
|
||||
-sINITIAL_MEMORY=256MB \
|
||||
-sSTACK_SIZE=5MB \
|
||||
-sASYNCIFY=1 \
|
||||
-sASYNCIFY_STACK_SIZE=16384 \
|
||||
-sLEGACY_GL_EMULATION \
|
||||
-sMAX_WEBGL_VERSION=2"
|
||||
|
||||
# Threading flags (when enabled)
|
||||
export PTHREAD_LDFLAGS="\
|
||||
-pthread \
|
||||
-sPROXY_TO_PTHREAD=1 \
|
||||
-sPTHREAD_POOL_SIZE=navigator.hardwareConcurrency \
|
||||
-sOFFSCREENCANVAS_SUPPORT=1"
|
||||
|
||||
# Create output directories
|
||||
mkdir -p "$BUILD_ROOT" "$DEPS_ROOT" "$SYSROOT"/{lib,include,share} "$STAMPS_DIR"
|
||||
|
||||
# Source other common files
|
||||
source "$COMMON_DIR/versions.sh"
|
||||
source "$COMMON_DIR/functions.sh"
|
||||
|
||||
# Print environment info (only if not in quiet mode)
|
||||
if [ "${QUIET:-0}" != "1" ]; then
|
||||
echo "KiCad WASM Build Environment"
|
||||
echo " Project root: $PROJECT_ROOT"
|
||||
echo " Build root: $BUILD_ROOT"
|
||||
echo " Sysroot: $SYSROOT"
|
||||
fi
|
||||
269
scripts/common/functions.sh
Executable file
269
scripts/common/functions.sh
Executable file
|
|
@ -0,0 +1,269 @@
|
|||
#!/bin/bash
|
||||
# Common functions for KiCad WASM build scripts
|
||||
|
||||
# Exit on error by default
|
||||
set -e
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Logging functions
|
||||
log_info() {
|
||||
echo -e "${GREEN}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
log_warn() {
|
||||
echo -e "${YELLOW}[WARN]${NC} $1"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
log_step() {
|
||||
echo -e "${BLUE}[STEP]${NC} $1"
|
||||
}
|
||||
|
||||
# Error handler
|
||||
on_error() {
|
||||
local exit_code=$?
|
||||
local line_no=$1
|
||||
log_error "Build failed at line $line_no with exit code $exit_code"
|
||||
|
||||
# Save build log if available
|
||||
if [ -n "$BUILD_LOG" ] && [ -f "$BUILD_LOG" ]; then
|
||||
local log_file="$BUILD_ROOT/logs/build-$(date +%Y%m%d-%H%M%S).log"
|
||||
mkdir -p "$(dirname "$log_file")"
|
||||
cp "$BUILD_LOG" "$log_file"
|
||||
log_error "Build log saved to: $log_file"
|
||||
fi
|
||||
|
||||
exit $exit_code
|
||||
}
|
||||
|
||||
# Set up error trap
|
||||
setup_error_trap() {
|
||||
trap 'on_error ${LINENO}' ERR
|
||||
}
|
||||
|
||||
# Verify Emscripten is available
|
||||
verify_emscripten() {
|
||||
if ! command -v emcc &> /dev/null; then
|
||||
log_error "Emscripten not found. Please run: source /path/to/emsdk/emsdk_env.sh"
|
||||
exit 1
|
||||
fi
|
||||
log_info "Using Emscripten: $(emcc --version | head -1)"
|
||||
}
|
||||
|
||||
# Verify submodules are initialized
|
||||
verify_submodules() {
|
||||
local project_root="$1"
|
||||
|
||||
if [ ! -f "$project_root/kicad/CMakeLists.txt" ]; then
|
||||
log_error "KiCad submodule not initialized. Run: git submodule update --init --recursive"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f "$project_root/wxwidgets/configure" ]; then
|
||||
log_error "wxWidgets submodule not initialized. Run: git submodule update --init --recursive"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_info "Submodules verified"
|
||||
}
|
||||
|
||||
# Download file with optional verification
|
||||
download_file() {
|
||||
local url="$1"
|
||||
local dest="$2"
|
||||
local expected_sha256="${3:-}"
|
||||
|
||||
if [ -f "$dest" ]; then
|
||||
if [ -n "$expected_sha256" ]; then
|
||||
local actual_sha256
|
||||
actual_sha256=$(shasum -a 256 "$dest" 2>/dev/null | cut -d' ' -f1)
|
||||
if [ "$actual_sha256" = "$expected_sha256" ]; then
|
||||
log_info "$(basename "$dest") already downloaded and verified"
|
||||
return 0
|
||||
fi
|
||||
log_warn "Checksum mismatch, re-downloading..."
|
||||
else
|
||||
log_info "$(basename "$dest") already exists"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
log_info "Downloading $(basename "$dest")..."
|
||||
mkdir -p "$(dirname "$dest")"
|
||||
|
||||
if ! curl -L -o "$dest" "$url"; then
|
||||
log_error "Failed to download $url"
|
||||
rm -f "$dest"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [ -n "$expected_sha256" ]; then
|
||||
local actual_sha256
|
||||
actual_sha256=$(shasum -a 256 "$dest" | cut -d' ' -f1)
|
||||
if [ "$actual_sha256" != "$expected_sha256" ]; then
|
||||
log_error "SHA256 mismatch for $dest"
|
||||
log_error " Expected: $expected_sha256"
|
||||
log_error " Actual: $actual_sha256"
|
||||
rm -f "$dest"
|
||||
return 1
|
||||
fi
|
||||
log_info "Checksum verified"
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# Extract archive (supports .tar.gz, .tar.xz, .zip)
|
||||
extract_archive() {
|
||||
local archive="$1"
|
||||
local dest_dir="$2"
|
||||
|
||||
mkdir -p "$dest_dir"
|
||||
|
||||
case "$archive" in
|
||||
*.tar.gz|*.tgz)
|
||||
tar -xzf "$archive" -C "$dest_dir" --strip-components=1
|
||||
;;
|
||||
*.tar.xz)
|
||||
tar -xJf "$archive" -C "$dest_dir" --strip-components=1
|
||||
;;
|
||||
*.zip)
|
||||
unzip -q "$archive" -d "$dest_dir"
|
||||
;;
|
||||
*)
|
||||
log_error "Unknown archive format: $archive"
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
|
||||
log_info "Extracted to $dest_dir"
|
||||
}
|
||||
|
||||
# Create build stamp file
|
||||
# Can accept either a simple name like "zstd" or a full path like "/path/to/stamps/zstd.stamp"
|
||||
create_stamp() {
|
||||
local name="$1"
|
||||
local stamp_file
|
||||
|
||||
if [[ "$name" == /* ]]; then
|
||||
# Full path provided
|
||||
stamp_file="$name"
|
||||
else
|
||||
# Just a name, use default stamps dir
|
||||
local stamp_dir="${BUILD_ROOT:-$PROJECT_ROOT/build-wasm}/stamps"
|
||||
mkdir -p "$stamp_dir"
|
||||
stamp_file="$stamp_dir/$name.stamp"
|
||||
fi
|
||||
|
||||
mkdir -p "$(dirname "$stamp_file")"
|
||||
date +%s > "$stamp_file"
|
||||
log_info "Created stamp: $(basename "$stamp_file" .stamp)"
|
||||
}
|
||||
|
||||
# Check if build stamp exists
|
||||
# Can accept either a simple name like "zstd" or a full path like "/path/to/stamps/zstd.stamp"
|
||||
check_stamp() {
|
||||
local name="$1"
|
||||
local stamp_file
|
||||
|
||||
if [[ "$name" == /* ]]; then
|
||||
# Full path provided
|
||||
stamp_file="$name"
|
||||
else
|
||||
# Just a name, use default stamps dir
|
||||
stamp_file="${BUILD_ROOT:-$PROJECT_ROOT/build-wasm}/stamps/$name.stamp"
|
||||
fi
|
||||
|
||||
[ -f "$stamp_file" ]
|
||||
}
|
||||
|
||||
# Remove build stamp
|
||||
remove_stamp() {
|
||||
local name="$1"
|
||||
local stamp_file="${BUILD_ROOT:-$PROJECT_ROOT/build-wasm}/stamps/$name.stamp"
|
||||
rm -f "$stamp_file"
|
||||
}
|
||||
|
||||
# Build if stamp doesn't exist
|
||||
build_if_needed() {
|
||||
local name="$1"
|
||||
local script="$2"
|
||||
local force="${3:-0}"
|
||||
|
||||
if [ "$force" = "1" ]; then
|
||||
remove_stamp "$name"
|
||||
fi
|
||||
|
||||
if check_stamp "$name"; then
|
||||
log_info "Skipping $name (already built)"
|
||||
return 0
|
||||
fi
|
||||
|
||||
log_step "Building $name..."
|
||||
"$script"
|
||||
}
|
||||
|
||||
# Get number of CPU cores for parallel builds
|
||||
get_nproc() {
|
||||
if command -v nproc &> /dev/null; then
|
||||
nproc
|
||||
elif command -v sysctl &> /dev/null; then
|
||||
sysctl -n hw.ncpu
|
||||
else
|
||||
echo 4
|
||||
fi
|
||||
}
|
||||
|
||||
# Parse common command line arguments
|
||||
parse_common_args() {
|
||||
CLEAN_BUILD=0
|
||||
DEBUG_BUILD=0
|
||||
PARALLEL_JOBS=$(get_nproc)
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--clean)
|
||||
CLEAN_BUILD=1
|
||||
shift
|
||||
;;
|
||||
--debug)
|
||||
DEBUG_BUILD=1
|
||||
shift
|
||||
;;
|
||||
-j)
|
||||
PARALLEL_JOBS="$2"
|
||||
shift 2
|
||||
;;
|
||||
-j*)
|
||||
PARALLEL_JOBS="${1#-j}"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
# Unknown option, pass through
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
export CLEAN_BUILD DEBUG_BUILD PARALLEL_JOBS
|
||||
}
|
||||
|
||||
# Print build configuration
|
||||
print_build_config() {
|
||||
echo "========================================"
|
||||
echo "Build Configuration:"
|
||||
echo " Clean build: $CLEAN_BUILD"
|
||||
echo " Debug build: $DEBUG_BUILD"
|
||||
echo " Parallel jobs: $PARALLEL_JOBS"
|
||||
echo " Build root: ${BUILD_ROOT:-not set}"
|
||||
echo "========================================"
|
||||
}
|
||||
51
scripts/common/versions.sh
Executable file
51
scripts/common/versions.sh
Executable file
|
|
@ -0,0 +1,51 @@
|
|||
#!/bin/bash
|
||||
# Dependency versions for KiCad WASM build
|
||||
# These versions match KiCad 8.99 requirements from CMakeLists.txt and vcpkg.json
|
||||
|
||||
# KiCad submodule version
|
||||
export KICAD_COMMIT="4bfed3f1746e8cc0a7d942767770f56fa28b393c"
|
||||
export KICAD_VERSION="8.99"
|
||||
|
||||
# From vcpkg.json overrides (pinned versions)
|
||||
export GLM_VERSION="0.9.9.8"
|
||||
export NGSPICE_VERSION="45.2"
|
||||
export PROTOBUF_VERSION="3.21.12"
|
||||
export PYTHON_VERSION="3.11.5"
|
||||
export WXWIDGETS_VERSION="3.3.1"
|
||||
|
||||
# From CMakeLists.txt minimum requirements
|
||||
export WXWIDGETS_MIN="3.2.0"
|
||||
export GLM_MIN="0.9.8"
|
||||
export BOOST_MIN="1.71.0"
|
||||
export FREETYPE_MIN="2.11.1"
|
||||
export CAIRO_MIN="1.12"
|
||||
export PIXMAN_MIN="0.30"
|
||||
export LIBGIT2_MIN="1.5"
|
||||
export OCC_MIN="7.5.0"
|
||||
export SWIG_MIN="4.0"
|
||||
|
||||
# Recommended versions for WASM build
|
||||
export OCC_VERSION="7.8.0"
|
||||
export ZSTD_VERSION="1.5.5"
|
||||
export FREETYPE_VERSION="2.13.2"
|
||||
export HARFBUZZ_VERSION="8.3.0"
|
||||
export CAIRO_VERSION="1.18.0"
|
||||
export PIXMAN_VERSION="0.42.2"
|
||||
export BOOST_VERSION="1.84.0"
|
||||
|
||||
# Download URLs
|
||||
export ZSTD_URL="https://github.com/facebook/zstd/releases/download/v${ZSTD_VERSION}/zstd-${ZSTD_VERSION}.tar.gz"
|
||||
export FREETYPE_URL="https://download.savannah.gnu.org/releases/freetype/freetype-${FREETYPE_VERSION}.tar.xz"
|
||||
export HARFBUZZ_URL="https://github.com/harfbuzz/harfbuzz/releases/download/${HARFBUZZ_VERSION}/harfbuzz-${HARFBUZZ_VERSION}.tar.xz"
|
||||
export CAIRO_URL="https://cairographics.org/releases/cairo-${CAIRO_VERSION}.tar.xz"
|
||||
export PIXMAN_URL="https://cairographics.org/releases/pixman-${PIXMAN_VERSION}.tar.gz"
|
||||
export OCC_URL="https://github.com/Open-Cascade-SAS/OCCT/archive/refs/tags/V${OCC_VERSION//./_}.tar.gz"
|
||||
export NGSPICE_URL="https://sourceforge.net/projects/ngspice/files/ng-spice-rework/${NGSPICE_VERSION}/ngspice-${NGSPICE_VERSION}.tar.gz/download"
|
||||
|
||||
# SHA256 checksums (to be filled in after first successful download)
|
||||
# export ZSTD_SHA256=""
|
||||
# export HARFBUZZ_SHA256=""
|
||||
# export CAIRO_SHA256=""
|
||||
# export PIXMAN_SHA256=""
|
||||
# export OCC_SHA256=""
|
||||
# export NGSPICE_SHA256=""
|
||||
71
scripts/deps/build-all-deps.sh
Executable file
71
scripts/deps/build-all-deps.sh
Executable file
|
|
@ -0,0 +1,71 @@
|
|||
#!/bin/bash
|
||||
# Build all KiCad dependencies for WebAssembly
|
||||
# This script builds dependencies in the correct order
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "${SCRIPT_DIR}/../common/env.sh"
|
||||
source "${SCRIPT_DIR}/../common/functions.sh"
|
||||
|
||||
log_info "Building all KiCad dependencies for WASM..."
|
||||
log_info "Using ${JOBS} parallel jobs"
|
||||
|
||||
# Parse arguments
|
||||
CLEAN=""
|
||||
WITH_OCC=0
|
||||
WITH_NGSPICE=0
|
||||
for arg in "$@"; do
|
||||
case $arg in
|
||||
--clean)
|
||||
CLEAN="--clean"
|
||||
;;
|
||||
--with-occ)
|
||||
WITH_OCC=1
|
||||
;;
|
||||
--with-ngspice)
|
||||
WITH_NGSPICE=1
|
||||
;;
|
||||
--all)
|
||||
WITH_OCC=1
|
||||
WITH_NGSPICE=1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Build dependencies in order
|
||||
|
||||
# 1. Header-only libraries (no dependencies)
|
||||
log_info "=== Phase 1: Header-only libraries ==="
|
||||
"${SCRIPT_DIR}/build-glm.sh" ${CLEAN}
|
||||
|
||||
# 2. Basic libraries (minimal dependencies)
|
||||
log_info "=== Phase 2: Basic compression/serialization ==="
|
||||
"${SCRIPT_DIR}/build-zstd.sh" ${CLEAN}
|
||||
"${SCRIPT_DIR}/build-protobuf.sh" ${CLEAN}
|
||||
|
||||
# 3. Font rendering stack
|
||||
log_info "=== Phase 3: Font rendering ==="
|
||||
"${SCRIPT_DIR}/build-freetype.sh" ${CLEAN}
|
||||
"${SCRIPT_DIR}/build-harfbuzz.sh" ${CLEAN}
|
||||
|
||||
# 4. Graphics stack (optional, for Cairo rendering)
|
||||
log_info "=== Phase 4: Graphics libraries ==="
|
||||
"${SCRIPT_DIR}/build-pixman.sh" ${CLEAN}
|
||||
"${SCRIPT_DIR}/build-cairo.sh" ${CLEAN}
|
||||
|
||||
# 5. Optional heavy dependencies
|
||||
if [ $WITH_OCC -eq 1 ]; then
|
||||
log_info "=== Phase 5a: OpenCASCADE (3D/STEP support) ==="
|
||||
"${SCRIPT_DIR}/build-opencascade.sh" ${CLEAN}
|
||||
fi
|
||||
|
||||
if [ $WITH_NGSPICE -eq 1 ]; then
|
||||
log_info "=== Phase 5b: ngspice (SPICE simulation) ==="
|
||||
"${SCRIPT_DIR}/build-ngspice.sh" ${CLEAN}
|
||||
fi
|
||||
|
||||
log_info "============================================"
|
||||
log_info "All dependencies built successfully!"
|
||||
log_info "Install prefix: ${SYSROOT}"
|
||||
log_info "============================================"
|
||||
111
scripts/deps/build-cairo.sh
Executable file
111
scripts/deps/build-cairo.sh
Executable file
|
|
@ -0,0 +1,111 @@
|
|||
#!/bin/bash
|
||||
# Build Cairo for WebAssembly
|
||||
# Cairo provides 2D graphics rendering
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "${SCRIPT_DIR}/../common/env.sh"
|
||||
source "${SCRIPT_DIR}/../common/versions.sh"
|
||||
source "${SCRIPT_DIR}/../common/functions.sh"
|
||||
|
||||
# Cairo requires Pixman and FreeType
|
||||
"${SCRIPT_DIR}/build-pixman.sh"
|
||||
"${SCRIPT_DIR}/build-freetype.sh"
|
||||
|
||||
CAIRO_DIR="${DEPS_ROOT}/cairo-${CAIRO_VERSION}"
|
||||
CAIRO_BUILD="${BUILD_ROOT}/deps/cairo"
|
||||
CAIRO_STAMP="${BUILD_ROOT}/stamps/cairo.stamp"
|
||||
|
||||
# Parse arguments
|
||||
CLEAN=0
|
||||
for arg in "$@"; do
|
||||
case $arg in
|
||||
--clean)
|
||||
CLEAN=1
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $CLEAN -eq 1 ]; then
|
||||
log_info "Cleaning Cairo build..."
|
||||
rm -rf "${CAIRO_BUILD}" "${CAIRO_STAMP}"
|
||||
fi
|
||||
|
||||
# Check if already built
|
||||
if check_stamp "${CAIRO_STAMP}"; then
|
||||
log_info "Cairo already built, skipping..."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Download if needed
|
||||
if [ ! -d "${CAIRO_DIR}" ]; then
|
||||
log_info "Downloading Cairo ${CAIRO_VERSION}..."
|
||||
mkdir -p "${DEPS_ROOT}"
|
||||
cd "${DEPS_ROOT}"
|
||||
|
||||
CAIRO_URL="https://cairographics.org/releases/cairo-${CAIRO_VERSION}.tar.xz"
|
||||
download_file "${CAIRO_URL}" "cairo-${CAIRO_VERSION}.tar.xz"
|
||||
tar -xJf "cairo-${CAIRO_VERSION}.tar.xz"
|
||||
rm "cairo-${CAIRO_VERSION}.tar.xz"
|
||||
fi
|
||||
|
||||
log_info "Building Cairo ${CAIRO_VERSION} for WASM..."
|
||||
|
||||
mkdir -p "${CAIRO_BUILD}"
|
||||
cd "${CAIRO_BUILD}"
|
||||
|
||||
# Cairo uses meson
|
||||
cat > cross-file.txt << EOF
|
||||
[binaries]
|
||||
c = 'emcc'
|
||||
cpp = 'em++'
|
||||
ar = 'emar'
|
||||
ranlib = 'emranlib'
|
||||
strip = 'emstrip'
|
||||
pkgconfig = 'pkg-config'
|
||||
|
||||
[host_machine]
|
||||
system = 'emscripten'
|
||||
cpu_family = 'wasm32'
|
||||
cpu = 'wasm32'
|
||||
endian = 'little'
|
||||
|
||||
[properties]
|
||||
# Prevent finding system libraries when cross-compiling
|
||||
sys_root = '${SYSROOT}'
|
||||
pkg_config_libdir = '${SYSROOT}/lib/pkgconfig'
|
||||
|
||||
[built-in options]
|
||||
c_args = ['-pthread', '-I${SYSROOT}/include', '-I${SYSROOT}/include/freetype2', '-I${SYSROOT}/include/pixman-1']
|
||||
c_link_args = ['-pthread', '-L${SYSROOT}/lib']
|
||||
pkg_config_path = '${SYSROOT}/lib/pkgconfig'
|
||||
EOF
|
||||
|
||||
# Set PKG_CONFIG_PATH for dependency discovery
|
||||
# Use LIBDIR to ONLY search our sysroot, preventing system lzo2 from being found
|
||||
export PKG_CONFIG_LIBDIR="${SYSROOT}/lib/pkgconfig"
|
||||
unset PKG_CONFIG_PATH
|
||||
|
||||
meson setup "${CAIRO_DIR}" \
|
||||
--cross-file cross-file.txt \
|
||||
--prefix="${SYSROOT}" \
|
||||
--default-library=static \
|
||||
-Dfontconfig=disabled \
|
||||
-Dfreetype=enabled \
|
||||
-Dglib=disabled \
|
||||
-Dpng=disabled \
|
||||
-Dxlib=disabled \
|
||||
-Dxcb=disabled \
|
||||
-Dzlib=enabled \
|
||||
-Dtests=disabled \
|
||||
-Dspectre=disabled \
|
||||
-Dsymbol-lookup=disabled
|
||||
|
||||
JOBS=${JOBS:-$(sysctl -n hw.ncpu 2>/dev/null || nproc 2>/dev/null || echo 4)}
|
||||
ninja -j${JOBS}
|
||||
ninja install
|
||||
|
||||
create_stamp "${CAIRO_STAMP}"
|
||||
log_info "Cairo build complete!"
|
||||
70
scripts/deps/build-freetype.sh
Executable file
70
scripts/deps/build-freetype.sh
Executable file
|
|
@ -0,0 +1,70 @@
|
|||
#!/bin/bash
|
||||
# Build FreeType for WebAssembly
|
||||
# FreeType is required for font rendering
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "${SCRIPT_DIR}/../common/env.sh"
|
||||
source "${SCRIPT_DIR}/../common/versions.sh"
|
||||
source "${SCRIPT_DIR}/../common/functions.sh"
|
||||
|
||||
FREETYPE_DIR="${DEPS_ROOT}/freetype-${FREETYPE_VERSION}"
|
||||
FREETYPE_BUILD="${BUILD_ROOT}/deps/freetype"
|
||||
FREETYPE_STAMP="${BUILD_ROOT}/stamps/freetype.stamp"
|
||||
|
||||
# Parse arguments
|
||||
CLEAN=0
|
||||
for arg in "$@"; do
|
||||
case $arg in
|
||||
--clean)
|
||||
CLEAN=1
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $CLEAN -eq 1 ]; then
|
||||
log_info "Cleaning FreeType build..."
|
||||
rm -rf "${FREETYPE_BUILD}" "${FREETYPE_STAMP}"
|
||||
fi
|
||||
|
||||
# Check if already built
|
||||
if check_stamp "${FREETYPE_STAMP}"; then
|
||||
log_info "FreeType already built, skipping..."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Download if needed
|
||||
if [ ! -d "${FREETYPE_DIR}" ]; then
|
||||
log_info "Downloading FreeType ${FREETYPE_VERSION}..."
|
||||
mkdir -p "${DEPS_ROOT}"
|
||||
cd "${DEPS_ROOT}"
|
||||
|
||||
FREETYPE_URL="https://download.savannah.gnu.org/releases/freetype/freetype-${FREETYPE_VERSION}.tar.xz"
|
||||
download_file "${FREETYPE_URL}" "freetype-${FREETYPE_VERSION}.tar.xz"
|
||||
tar -xJf "freetype-${FREETYPE_VERSION}.tar.xz"
|
||||
rm "freetype-${FREETYPE_VERSION}.tar.xz"
|
||||
fi
|
||||
|
||||
log_info "Building FreeType ${FREETYPE_VERSION} for WASM..."
|
||||
|
||||
mkdir -p "${FREETYPE_BUILD}"
|
||||
cd "${FREETYPE_BUILD}"
|
||||
|
||||
emcmake cmake "${FREETYPE_DIR}" \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_INSTALL_PREFIX="${SYSROOT}" \
|
||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 \
|
||||
-DFT_DISABLE_BZIP2=ON \
|
||||
-DFT_DISABLE_BROTLI=ON \
|
||||
-DFT_DISABLE_HARFBUZZ=ON \
|
||||
-DFT_DISABLE_PNG=ON \
|
||||
-DFT_DISABLE_ZLIB=OFF \
|
||||
-DBUILD_SHARED_LIBS=OFF
|
||||
|
||||
emmake make -j${JOBS}
|
||||
emmake make install
|
||||
|
||||
create_stamp "${FREETYPE_STAMP}"
|
||||
log_info "FreeType build complete!"
|
||||
57
scripts/deps/build-glm.sh
Executable file
57
scripts/deps/build-glm.sh
Executable file
|
|
@ -0,0 +1,57 @@
|
|||
#!/bin/bash
|
||||
# Install GLM headers for WebAssembly
|
||||
# GLM is a header-only math library
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "${SCRIPT_DIR}/../common/env.sh"
|
||||
source "${SCRIPT_DIR}/../common/versions.sh"
|
||||
source "${SCRIPT_DIR}/../common/functions.sh"
|
||||
|
||||
GLM_DIR="${DEPS_ROOT}/glm-${GLM_VERSION}"
|
||||
GLM_STAMP="${BUILD_ROOT}/stamps/glm.stamp"
|
||||
|
||||
# Parse arguments
|
||||
CLEAN=0
|
||||
for arg in "$@"; do
|
||||
case $arg in
|
||||
--clean)
|
||||
CLEAN=1
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $CLEAN -eq 1 ]; then
|
||||
log_info "Cleaning GLM install..."
|
||||
rm -rf "${GLM_STAMP}"
|
||||
fi
|
||||
|
||||
# Check if already installed
|
||||
if check_stamp "${GLM_STAMP}"; then
|
||||
log_info "GLM already installed, skipping..."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Download if needed
|
||||
if [ ! -d "${GLM_DIR}" ]; then
|
||||
log_info "Downloading GLM ${GLM_VERSION}..."
|
||||
mkdir -p "${DEPS_ROOT}"
|
||||
cd "${DEPS_ROOT}"
|
||||
|
||||
GLM_URL="https://github.com/g-truc/glm/releases/download/${GLM_VERSION}/glm-${GLM_VERSION}.zip"
|
||||
download_file "${GLM_URL}" "glm-${GLM_VERSION}.zip"
|
||||
unzip -q "glm-${GLM_VERSION}.zip"
|
||||
mv glm "glm-${GLM_VERSION}"
|
||||
rm "glm-${GLM_VERSION}.zip"
|
||||
fi
|
||||
|
||||
log_info "Installing GLM ${GLM_VERSION} headers..."
|
||||
|
||||
# GLM is header-only, just copy headers
|
||||
mkdir -p "${SYSROOT}/include"
|
||||
cp -r "${GLM_DIR}/glm" "${SYSROOT}/include/"
|
||||
|
||||
create_stamp "${GLM_STAMP}"
|
||||
log_info "GLM install complete!"
|
||||
79
scripts/deps/build-harfbuzz.sh
Executable file
79
scripts/deps/build-harfbuzz.sh
Executable file
|
|
@ -0,0 +1,79 @@
|
|||
#!/bin/bash
|
||||
# Build HarfBuzz for WebAssembly
|
||||
# HarfBuzz is used for text shaping in KiCad
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "${SCRIPT_DIR}/../common/env.sh"
|
||||
source "${SCRIPT_DIR}/../common/versions.sh"
|
||||
source "${SCRIPT_DIR}/../common/functions.sh"
|
||||
|
||||
# HarfBuzz requires FreeType
|
||||
"${SCRIPT_DIR}/build-freetype.sh"
|
||||
|
||||
HARFBUZZ_DIR="${DEPS_ROOT}/harfbuzz-${HARFBUZZ_VERSION}"
|
||||
HARFBUZZ_BUILD="${BUILD_ROOT}/deps/harfbuzz"
|
||||
HARFBUZZ_STAMP="${BUILD_ROOT}/stamps/harfbuzz.stamp"
|
||||
|
||||
# Parse arguments
|
||||
CLEAN=0
|
||||
for arg in "$@"; do
|
||||
case $arg in
|
||||
--clean)
|
||||
CLEAN=1
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $CLEAN -eq 1 ]; then
|
||||
log_info "Cleaning HarfBuzz build..."
|
||||
rm -rf "${HARFBUZZ_BUILD}" "${HARFBUZZ_STAMP}"
|
||||
fi
|
||||
|
||||
# Check if already built
|
||||
if check_stamp "${HARFBUZZ_STAMP}"; then
|
||||
log_info "HarfBuzz already built, skipping..."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Download if needed
|
||||
if [ ! -d "${HARFBUZZ_DIR}" ]; then
|
||||
log_info "Downloading HarfBuzz ${HARFBUZZ_VERSION}..."
|
||||
mkdir -p "${DEPS_ROOT}"
|
||||
cd "${DEPS_ROOT}"
|
||||
|
||||
HARFBUZZ_URL="https://github.com/harfbuzz/harfbuzz/releases/download/${HARFBUZZ_VERSION}/harfbuzz-${HARFBUZZ_VERSION}.tar.xz"
|
||||
download_file "${HARFBUZZ_URL}" "harfbuzz-${HARFBUZZ_VERSION}.tar.xz"
|
||||
tar -xJf "harfbuzz-${HARFBUZZ_VERSION}.tar.xz"
|
||||
rm "harfbuzz-${HARFBUZZ_VERSION}.tar.xz"
|
||||
fi
|
||||
|
||||
log_info "Building HarfBuzz ${HARFBUZZ_VERSION} for WASM..."
|
||||
|
||||
mkdir -p "${HARFBUZZ_BUILD}"
|
||||
cd "${HARFBUZZ_BUILD}"
|
||||
|
||||
# HarfBuzz uses meson, but also has CMake support
|
||||
emcmake cmake "${HARFBUZZ_DIR}" \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_INSTALL_PREFIX="${SYSROOT}" \
|
||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 \
|
||||
-DHB_HAVE_FREETYPE=ON \
|
||||
-DHB_HAVE_GLIB=OFF \
|
||||
-DHB_HAVE_ICU=OFF \
|
||||
-DHB_HAVE_GOBJECT=OFF \
|
||||
-DHB_HAVE_CAIRO=OFF \
|
||||
-DHB_BUILD_UTILS=OFF \
|
||||
-DHB_BUILD_SUBSET=OFF \
|
||||
-DBUILD_SHARED_LIBS=OFF \
|
||||
-DCMAKE_PREFIX_PATH="${SYSROOT}" \
|
||||
-DFREETYPE_LIBRARY="${SYSROOT}/lib/libfreetype.a" \
|
||||
-DFREETYPE_INCLUDE_DIRS="${SYSROOT}/include/freetype2"
|
||||
|
||||
emmake make -j${JOBS}
|
||||
emmake make install
|
||||
|
||||
create_stamp "${HARFBUZZ_STAMP}"
|
||||
log_info "HarfBuzz build complete!"
|
||||
80
scripts/deps/build-ngspice.sh
Executable file
80
scripts/deps/build-ngspice.sh
Executable file
|
|
@ -0,0 +1,80 @@
|
|||
#!/bin/bash
|
||||
# Build ngspice for WebAssembly
|
||||
# ngspice provides SPICE simulation for KiCad's Eeschema
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "${SCRIPT_DIR}/../common/env.sh"
|
||||
source "${SCRIPT_DIR}/../common/versions.sh"
|
||||
source "${SCRIPT_DIR}/../common/functions.sh"
|
||||
|
||||
NGSPICE_DIR="${DEPS_ROOT}/ngspice-${NGSPICE_VERSION}"
|
||||
NGSPICE_BUILD="${BUILD_ROOT}/deps/ngspice"
|
||||
NGSPICE_STAMP="${BUILD_ROOT}/stamps/ngspice.stamp"
|
||||
|
||||
# Parse arguments
|
||||
CLEAN=0
|
||||
for arg in "$@"; do
|
||||
case $arg in
|
||||
--clean)
|
||||
CLEAN=1
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $CLEAN -eq 1 ]; then
|
||||
log_info "Cleaning ngspice build..."
|
||||
rm -rf "${NGSPICE_BUILD}" "${NGSPICE_STAMP}"
|
||||
fi
|
||||
|
||||
# Check if already built
|
||||
if check_stamp "${NGSPICE_STAMP}"; then
|
||||
log_info "ngspice already built, skipping..."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Download if needed
|
||||
if [ ! -d "${NGSPICE_DIR}" ]; then
|
||||
log_info "Downloading ngspice ${NGSPICE_VERSION}..."
|
||||
mkdir -p "${DEPS_ROOT}"
|
||||
cd "${DEPS_ROOT}"
|
||||
|
||||
NGSPICE_URL="https://sourceforge.net/projects/ngspice/files/ng-spice-rework/${NGSPICE_VERSION}/ngspice-${NGSPICE_VERSION}.tar.gz/download"
|
||||
curl -L "${NGSPICE_URL}" -o "ngspice-${NGSPICE_VERSION}.tar.gz"
|
||||
tar -xzf "ngspice-${NGSPICE_VERSION}.tar.gz"
|
||||
rm "ngspice-${NGSPICE_VERSION}.tar.gz"
|
||||
fi
|
||||
|
||||
log_info "Building ngspice ${NGSPICE_VERSION} for WASM..."
|
||||
|
||||
mkdir -p "${NGSPICE_BUILD}"
|
||||
cd "${NGSPICE_BUILD}"
|
||||
|
||||
# ngspice uses autoconf
|
||||
# First we need to configure for shared library mode (libngspice)
|
||||
export CFLAGS="-pthread"
|
||||
export CXXFLAGS="-pthread"
|
||||
export LDFLAGS="-pthread"
|
||||
|
||||
# Configure ngspice as a shared library for KiCad integration
|
||||
emconfigure "${NGSPICE_DIR}/configure" \
|
||||
--prefix="${SYSROOT}" \
|
||||
--host=wasm32-unknown-emscripten \
|
||||
--build=$(uname -m)-linux-gnu \
|
||||
--enable-shared \
|
||||
--with-ngshared \
|
||||
--disable-debug \
|
||||
--disable-dependency-tracking \
|
||||
--enable-cider \
|
||||
--enable-xspice \
|
||||
--without-x \
|
||||
--without-readline \
|
||||
--without-editline
|
||||
|
||||
emmake make -j${JOBS}
|
||||
emmake make install
|
||||
|
||||
create_stamp "${NGSPICE_STAMP}"
|
||||
log_info "ngspice build complete!"
|
||||
96
scripts/deps/build-opencascade.sh
Executable file
96
scripts/deps/build-opencascade.sh
Executable file
|
|
@ -0,0 +1,96 @@
|
|||
#!/bin/bash
|
||||
# Build OpenCASCADE Technology (OCCT) for WebAssembly
|
||||
# OCCT provides 3D geometry kernel for STEP file import/export
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "${SCRIPT_DIR}/../common/env.sh"
|
||||
source "${SCRIPT_DIR}/../common/versions.sh"
|
||||
source "${SCRIPT_DIR}/../common/functions.sh"
|
||||
|
||||
OCC_DIR="${DEPS_ROOT}/opencascade-${OCC_VERSION}"
|
||||
OCC_BUILD="${BUILD_ROOT}/deps/opencascade"
|
||||
OCC_STAMP="${BUILD_ROOT}/stamps/opencascade.stamp"
|
||||
|
||||
# Parse arguments
|
||||
CLEAN=0
|
||||
for arg in "$@"; do
|
||||
case $arg in
|
||||
--clean)
|
||||
CLEAN=1
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $CLEAN -eq 1 ]; then
|
||||
log_info "Cleaning OpenCASCADE build..."
|
||||
rm -rf "${OCC_BUILD}" "${OCC_STAMP}"
|
||||
fi
|
||||
|
||||
# Check if already built
|
||||
if check_stamp "${OCC_STAMP}"; then
|
||||
log_info "OpenCASCADE already built, skipping..."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Download if needed
|
||||
if [ ! -d "${OCC_DIR}" ]; then
|
||||
log_info "Downloading OpenCASCADE ${OCC_VERSION}..."
|
||||
mkdir -p "${DEPS_ROOT}"
|
||||
cd "${DEPS_ROOT}"
|
||||
|
||||
# OpenCASCADE releases are on GitHub
|
||||
OCC_URL="https://github.com/Open-Cascade-SAS/OCCT/archive/refs/tags/V${OCC_VERSION//./_}.tar.gz"
|
||||
download_file "${OCC_URL}" "opencascade-${OCC_VERSION}.tar.gz"
|
||||
tar -xzf "opencascade-${OCC_VERSION}.tar.gz"
|
||||
mv "OCCT-V${OCC_VERSION//./_}" "opencascade-${OCC_VERSION}"
|
||||
rm "opencascade-${OCC_VERSION}.tar.gz"
|
||||
fi
|
||||
|
||||
log_info "Building OpenCASCADE ${OCC_VERSION} for WASM..."
|
||||
log_warn "This is a large library and may take a while..."
|
||||
|
||||
mkdir -p "${OCC_BUILD}"
|
||||
cd "${OCC_BUILD}"
|
||||
|
||||
# OpenCASCADE build configuration for WASM
|
||||
# Disable GUI, visualization that needs X11/OpenGL native
|
||||
# Enable core geometry and data exchange modules only
|
||||
emcmake cmake "${OCC_DIR}" \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_INSTALL_PREFIX="${SYSROOT}" \
|
||||
-DCMAKE_CXX_FLAGS="-pthread -O2" \
|
||||
-DCMAKE_C_FLAGS="-pthread -O2" \
|
||||
-DBUILD_LIBRARY_TYPE=Static \
|
||||
-DBUILD_MODULE_ApplicationFramework=OFF \
|
||||
-DBUILD_MODULE_Draw=OFF \
|
||||
-DBUILD_MODULE_Visualization=OFF \
|
||||
-DBUILD_MODULE_DETools=OFF \
|
||||
-DBUILD_MODULE_FoundationClasses=ON \
|
||||
-DBUILD_MODULE_ModelingData=ON \
|
||||
-DBUILD_MODULE_ModelingAlgorithms=ON \
|
||||
-DBUILD_MODULE_DataExchange=ON \
|
||||
-DUSE_FREETYPE=OFF \
|
||||
-DUSE_FREEIMAGE=OFF \
|
||||
-DUSE_OPENVR=OFF \
|
||||
-DUSE_FFMPEG=OFF \
|
||||
-DUSE_TBB=OFF \
|
||||
-DUSE_VTK=OFF \
|
||||
-DUSE_TCL=OFF \
|
||||
-DUSE_TK=OFF \
|
||||
-DUSE_GLES2=OFF \
|
||||
-DUSE_OPENGL=OFF \
|
||||
-DUSE_D3D=OFF \
|
||||
-DUSE_RAPIDJSON=OFF \
|
||||
-DUSE_DRACO=OFF \
|
||||
-DBUILD_DOC_Overview=OFF \
|
||||
-DINSTALL_SAMPLES=OFF \
|
||||
-DINSTALL_TEST_CASES=OFF
|
||||
|
||||
emmake make -j${JOBS}
|
||||
emmake make install
|
||||
|
||||
create_stamp "${OCC_STAMP}"
|
||||
log_info "OpenCASCADE build complete!"
|
||||
88
scripts/deps/build-pixman.sh
Executable file
88
scripts/deps/build-pixman.sh
Executable file
|
|
@ -0,0 +1,88 @@
|
|||
#!/bin/bash
|
||||
# Build Pixman for WebAssembly
|
||||
# Pixman is required by Cairo for pixel manipulation
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "${SCRIPT_DIR}/../common/env.sh"
|
||||
source "${SCRIPT_DIR}/../common/versions.sh"
|
||||
source "${SCRIPT_DIR}/../common/functions.sh"
|
||||
|
||||
PIXMAN_DIR="${DEPS_ROOT}/pixman-${PIXMAN_VERSION}"
|
||||
PIXMAN_BUILD="${BUILD_ROOT}/deps/pixman"
|
||||
PIXMAN_STAMP="${BUILD_ROOT}/stamps/pixman.stamp"
|
||||
|
||||
# Parse arguments
|
||||
CLEAN=0
|
||||
for arg in "$@"; do
|
||||
case $arg in
|
||||
--clean)
|
||||
CLEAN=1
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $CLEAN -eq 1 ]; then
|
||||
log_info "Cleaning Pixman build..."
|
||||
rm -rf "${PIXMAN_BUILD}" "${PIXMAN_STAMP}"
|
||||
fi
|
||||
|
||||
# Check if already built
|
||||
if check_stamp "${PIXMAN_STAMP}"; then
|
||||
log_info "Pixman already built, skipping..."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Download if needed
|
||||
if [ ! -d "${PIXMAN_DIR}" ]; then
|
||||
log_info "Downloading Pixman ${PIXMAN_VERSION}..."
|
||||
mkdir -p "${DEPS_ROOT}"
|
||||
cd "${DEPS_ROOT}"
|
||||
|
||||
PIXMAN_URL="https://cairographics.org/releases/pixman-${PIXMAN_VERSION}.tar.gz"
|
||||
download_file "${PIXMAN_URL}" "pixman-${PIXMAN_VERSION}.tar.gz"
|
||||
tar -xzf "pixman-${PIXMAN_VERSION}.tar.gz"
|
||||
rm "pixman-${PIXMAN_VERSION}.tar.gz"
|
||||
fi
|
||||
|
||||
log_info "Building Pixman ${PIXMAN_VERSION} for WASM..."
|
||||
|
||||
mkdir -p "${PIXMAN_BUILD}"
|
||||
cd "${PIXMAN_BUILD}"
|
||||
|
||||
# Pixman uses meson
|
||||
cat > cross-file.txt << EOF
|
||||
[binaries]
|
||||
c = 'emcc'
|
||||
cpp = 'em++'
|
||||
ar = 'emar'
|
||||
ranlib = 'emranlib'
|
||||
strip = 'emstrip'
|
||||
|
||||
[host_machine]
|
||||
system = 'emscripten'
|
||||
cpu_family = 'wasm32'
|
||||
cpu = 'wasm32'
|
||||
endian = 'little'
|
||||
|
||||
[built-in options]
|
||||
c_args = ['-pthread']
|
||||
c_link_args = ['-pthread']
|
||||
EOF
|
||||
|
||||
meson setup "${PIXMAN_DIR}" \
|
||||
--cross-file cross-file.txt \
|
||||
--prefix="${SYSROOT}" \
|
||||
--default-library=static \
|
||||
-Dgtk=disabled \
|
||||
-Dlibpng=disabled \
|
||||
-Dtests=disabled
|
||||
|
||||
JOBS=${JOBS:-$(sysctl -n hw.ncpu 2>/dev/null || nproc 2>/dev/null || echo 4)}
|
||||
ninja -j${JOBS}
|
||||
ninja install
|
||||
|
||||
create_stamp "${PIXMAN_STAMP}"
|
||||
log_info "Pixman build complete!"
|
||||
69
scripts/deps/build-protobuf.sh
Executable file
69
scripts/deps/build-protobuf.sh
Executable file
|
|
@ -0,0 +1,69 @@
|
|||
#!/bin/bash
|
||||
# Build Protocol Buffers for WebAssembly
|
||||
# Protobuf is used for IPC in KiCad
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "${SCRIPT_DIR}/../common/env.sh"
|
||||
source "${SCRIPT_DIR}/../common/versions.sh"
|
||||
source "${SCRIPT_DIR}/../common/functions.sh"
|
||||
|
||||
PROTOBUF_DIR="${DEPS_ROOT}/protobuf-${PROTOBUF_VERSION}"
|
||||
PROTOBUF_BUILD="${BUILD_ROOT}/deps/protobuf"
|
||||
PROTOBUF_STAMP="${BUILD_ROOT}/stamps/protobuf.stamp"
|
||||
|
||||
# Parse arguments
|
||||
CLEAN=0
|
||||
for arg in "$@"; do
|
||||
case $arg in
|
||||
--clean)
|
||||
CLEAN=1
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $CLEAN -eq 1 ]; then
|
||||
log_info "Cleaning Protobuf build..."
|
||||
rm -rf "${PROTOBUF_BUILD}" "${PROTOBUF_STAMP}"
|
||||
fi
|
||||
|
||||
# Check if already built
|
||||
if check_stamp "${PROTOBUF_STAMP}"; then
|
||||
log_info "Protobuf already built, skipping..."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Download if needed
|
||||
if [ ! -d "${PROTOBUF_DIR}" ]; then
|
||||
log_info "Downloading Protobuf ${PROTOBUF_VERSION}..."
|
||||
mkdir -p "${DEPS_ROOT}"
|
||||
cd "${DEPS_ROOT}"
|
||||
|
||||
PROTOBUF_URL="https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOBUF_VERSION}/protobuf-cpp-${PROTOBUF_VERSION}.tar.gz"
|
||||
download_file "${PROTOBUF_URL}" "protobuf-${PROTOBUF_VERSION}.tar.gz"
|
||||
tar -xzf "protobuf-${PROTOBUF_VERSION}.tar.gz"
|
||||
rm "protobuf-${PROTOBUF_VERSION}.tar.gz"
|
||||
fi
|
||||
|
||||
log_info "Building Protobuf ${PROTOBUF_VERSION} for WASM..."
|
||||
|
||||
mkdir -p "${PROTOBUF_BUILD}"
|
||||
cd "${PROTOBUF_BUILD}"
|
||||
|
||||
emcmake cmake "${PROTOBUF_DIR}" \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_INSTALL_PREFIX="${SYSROOT}" \
|
||||
-DCMAKE_CXX_FLAGS="-pthread" \
|
||||
-Dprotobuf_BUILD_TESTS=OFF \
|
||||
-Dprotobuf_BUILD_EXAMPLES=OFF \
|
||||
-Dprotobuf_BUILD_PROTOC_BINARIES=OFF \
|
||||
-Dprotobuf_BUILD_SHARED_LIBS=OFF \
|
||||
-Dprotobuf_WITH_ZLIB=OFF
|
||||
|
||||
emmake make -j${JOBS}
|
||||
emmake make install
|
||||
|
||||
create_stamp "${PROTOBUF_STAMP}"
|
||||
log_info "Protobuf build complete!"
|
||||
72
scripts/deps/build-zstd.sh
Executable file
72
scripts/deps/build-zstd.sh
Executable file
|
|
@ -0,0 +1,72 @@
|
|||
#!/bin/bash
|
||||
# Build Zstd for WebAssembly
|
||||
# Zstd is used for compression in KiCad project files
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "${SCRIPT_DIR}/../common/env.sh"
|
||||
source "${SCRIPT_DIR}/../common/versions.sh"
|
||||
source "${SCRIPT_DIR}/../common/functions.sh"
|
||||
|
||||
ZSTD_DIR="${DEPS_ROOT}/zstd-${ZSTD_VERSION}"
|
||||
ZSTD_BUILD="${BUILD_ROOT}/deps/zstd"
|
||||
ZSTD_STAMP="${BUILD_ROOT}/stamps/zstd.stamp"
|
||||
|
||||
# Parse arguments
|
||||
CLEAN=0
|
||||
for arg in "$@"; do
|
||||
case $arg in
|
||||
--clean)
|
||||
CLEAN=1
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $CLEAN -eq 1 ]; then
|
||||
log_info "Cleaning Zstd build..."
|
||||
rm -rf "${ZSTD_BUILD}" "${ZSTD_STAMP}"
|
||||
fi
|
||||
|
||||
# Check if already built
|
||||
if check_stamp "${ZSTD_STAMP}"; then
|
||||
log_info "Zstd already built, skipping..."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Download if needed
|
||||
if [ ! -d "${ZSTD_DIR}" ]; then
|
||||
log_info "Downloading Zstd ${ZSTD_VERSION}..."
|
||||
mkdir -p "${DEPS_ROOT}"
|
||||
cd "${DEPS_ROOT}"
|
||||
|
||||
ZSTD_URL="https://github.com/facebook/zstd/releases/download/v${ZSTD_VERSION}/zstd-${ZSTD_VERSION}.tar.gz"
|
||||
download_file "${ZSTD_URL}" "zstd-${ZSTD_VERSION}.tar.gz"
|
||||
tar -xzf "zstd-${ZSTD_VERSION}.tar.gz"
|
||||
rm "zstd-${ZSTD_VERSION}.tar.gz"
|
||||
fi
|
||||
|
||||
log_info "Building Zstd ${ZSTD_VERSION} for WASM..."
|
||||
|
||||
mkdir -p "${ZSTD_BUILD}"
|
||||
cd "${ZSTD_BUILD}"
|
||||
|
||||
# Zstd uses CMake in build/cmake directory
|
||||
emcmake cmake "${ZSTD_DIR}/build/cmake" \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_INSTALL_PREFIX="${SYSROOT}" \
|
||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 \
|
||||
-DZSTD_BUILD_PROGRAMS=OFF \
|
||||
-DZSTD_BUILD_TESTS=OFF \
|
||||
-DZSTD_BUILD_SHARED=OFF \
|
||||
-DZSTD_BUILD_STATIC=ON \
|
||||
-DZSTD_MULTITHREAD_SUPPORT=ON \
|
||||
-DCMAKE_C_FLAGS="-pthread" \
|
||||
-DCMAKE_CXX_FLAGS="-pthread"
|
||||
|
||||
emmake make -j${JOBS}
|
||||
emmake make install
|
||||
|
||||
create_stamp "${ZSTD_STAMP}"
|
||||
log_info "Zstd build complete!"
|
||||
Loading…
Reference in a new issue