Files
yaze/scripts/build-wasm.sh

255 lines
7.6 KiB
Bash
Executable File

#!/bin/bash
set -e
usage() {
cat <<'EOF'
Usage: scripts/build-wasm.sh [debug|release|ai] [--incremental] [--clean]
Options:
debug|release|ai Build mode (default: release). Use 'ai' for agent-enabled web build.
--incremental Skip cleaning CMake cache/files to speed up incremental builds
--clean Completely remove build directory and start fresh
Note: debug/release/ai share the same build-wasm directory.
EOF
}
# Defaults
BUILD_MODE="release"
CLEAN_CACHE=true
FULL_CLEAN=false
for arg in "$@"; do
case "$arg" in
debug|release|ai)
BUILD_MODE="$arg"
;;
--incremental)
CLEAN_CACHE=false
;;
--clean)
FULL_CLEAN=true
;;
-h|--help)
usage
exit 0
;;
*)
echo "Unknown option: $arg"
usage
exit 1
;;
esac
done
# Directory of this script
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
PROJECT_ROOT="$DIR/.."
# Set build directory and preset based on mode
if [ "$BUILD_MODE" = "debug" ]; then
BUILD_DIR="$PROJECT_ROOT/build-wasm"
CMAKE_PRESET="wasm-debug"
elif [ "$BUILD_MODE" = "ai" ]; then
BUILD_DIR="$PROJECT_ROOT/build-wasm"
CMAKE_PRESET="wasm-ai"
else
BUILD_DIR="$PROJECT_ROOT/build-wasm"
CMAKE_PRESET="wasm-release"
fi
# Check for emcmake
if ! command -v emcmake &> /dev/null; then
echo "Error: emcmake not found. Please activate Emscripten SDK environment."
echo " source /path/to/emsdk/emsdk_env.sh"
exit 1
fi
echo "=== Building YAZE for Web (WASM) - $BUILD_MODE mode ==="
echo "Build directory: $BUILD_DIR (shared for debug/release/ai)"
# Handle build directory based on flags
if [ -d "$BUILD_DIR" ]; then
if [ "$FULL_CLEAN" = true ]; then
echo "Full clean: removing entire build directory..."
rm -rf "$BUILD_DIR"
elif [ "$CLEAN_CACHE" = true ]; then
echo "Cleaning build directory (CMake cache/files)..."
rm -rf "$BUILD_DIR/CMakeCache.txt" "$BUILD_DIR/CMakeFiles" 2>/dev/null || true
else
echo "Incremental build: skipping CMake cache clean."
fi
fi
mkdir -p "$BUILD_DIR"
cd "$BUILD_DIR"
# Configure with ccache if available
echo "Configuring..."
CMAKE_EXTRA_ARGS=""
if command -v ccache &> /dev/null; then
echo "ccache detected - enabling compiler caching"
CMAKE_EXTRA_ARGS="-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache"
fi
emcmake cmake "$PROJECT_ROOT" --preset $CMAKE_PRESET $CMAKE_EXTRA_ARGS
# Build (use parallel jobs)
echo "Building..."
cmake --build . --parallel
# Package / Organize output
echo "Packaging..."
mkdir -p dist
# Copy helper (rsync if available; only --delete for directories)
copy_item() {
src="$1"; dest="$2"
if command -v rsync >/dev/null 2>&1; then
if [ -d "$src" ]; then
mkdir -p "$dest"
rsync -a --delete "$src"/ "$dest"/
else
rsync -a "$src" "$dest"
fi
else
mkdir -p "$(dirname "$dest")"
cp -r "$src" "$dest"
fi
}
# Copy main WASM app
if [ -f bin/index.html ]; then
copy_item bin/index.html dist/index.html
else
copy_item bin/yaze.html dist/index.html
fi
copy_item bin/yaze.html dist/yaze.html
copy_item bin/yaze.js dist/
copy_item bin/yaze.wasm dist/
copy_item bin/yaze.worker.js dist/ 2>/dev/null || true # pthread worker script
copy_item bin/yaze.data dist/ 2>/dev/null || true # might not exist if no assets packed
# Copy web assets (organized in subdirectories)
echo "Copying web assets..."
# Helper function to copy all files from a source directory to destination
# Usage: copy_directory_contents <src_dir> <dest_dir> [file_pattern]
copy_directory_contents() {
local src_dir="$1"
local dest_dir="$2"
local pattern="${3:-*}" # Default to all files
if [ ! -d "$src_dir" ]; then
echo "Warning: Source directory not found: $src_dir"
return 1
fi
mkdir -p "$dest_dir"
local count=0
# Use find to get all matching files (handles patterns better)
while IFS= read -r -d '' file; do
if [ -f "$file" ]; then
copy_item "$file" "$dest_dir/"
((count++)) || true
fi
done < <(find "$src_dir" -maxdepth 1 -type f -name "$pattern" -print0 2>/dev/null)
if [ "$count" -eq 0 ]; then
echo "Warning: No files matching '$pattern' found in $src_dir"
else
echo " Copied $count file(s)"
fi
}
# Copy styles directory (all CSS files)
if [ -d "$PROJECT_ROOT/src/web/styles" ]; then
echo "Copying styles..."
copy_directory_contents "$PROJECT_ROOT/src/web/styles" "dist/styles" "*.css"
fi
# Copy components directory (all JS files)
if [ -d "$PROJECT_ROOT/src/web/components" ]; then
echo "Copying components..."
copy_directory_contents "$PROJECT_ROOT/src/web/components" "dist/components" "*.js"
fi
# Copy core directory (all JS files)
if [ -d "$PROJECT_ROOT/src/web/core" ]; then
echo "Copying core..."
copy_directory_contents "$PROJECT_ROOT/src/web/core" "dist/core" "*.js"
fi
# Copy PWA files (all files in the directory)
if [ -d "$PROJECT_ROOT/src/web/pwa" ]; then
echo "Copying PWA files..."
mkdir -p dist/pwa
# Copy all JS files
copy_directory_contents "$PROJECT_ROOT/src/web/pwa" "dist/pwa" "*.js"
# Copy manifest.json
copy_directory_contents "$PROJECT_ROOT/src/web/pwa" "dist/pwa" "*.json"
# Copy HTML files
copy_directory_contents "$PROJECT_ROOT/src/web/pwa" "dist/pwa" "*.html"
# Copy markdown docs (optional, for reference)
copy_directory_contents "$PROJECT_ROOT/src/web/pwa" "dist/pwa" "*.md"
# Verify coi-serviceworker.js was copied (critical for SharedArrayBuffer support)
if [ -f "dist/pwa/coi-serviceworker.js" ]; then
echo " coi-serviceworker.js present (required for SharedArrayBuffer/pthreads)"
# CRITICAL: Also copy to root for GitHub Pages (service worker scope must cover /)
cp "dist/pwa/coi-serviceworker.js" "dist/coi-serviceworker.js"
echo " coi-serviceworker.js copied to root (for GitHub Pages)"
else
echo "Warning: coi-serviceworker.js not found - SharedArrayBuffer may not work"
fi
fi
# Copy debug tools
if [ -d "$PROJECT_ROOT/src/web/debug" ]; then
echo "Copying debug tools..."
mkdir -p dist/debug
# Copy all files (could be .js, .cc, .html, etc.)
copy_directory_contents "$PROJECT_ROOT/src/web/debug" "dist/debug" "*"
fi
# Copy main app.js (stays at root)
if [ -f "$PROJECT_ROOT/src/web/app.js" ]; then
copy_item "$PROJECT_ROOT/src/web/app.js" dist/
fi
# Copy shell UI helpers (dropdown/menu handlers referenced from HTML)
if [ -f "$PROJECT_ROOT/src/web/shell_ui.js" ]; then
copy_item "$PROJECT_ROOT/src/web/shell_ui.js" dist/
fi
# Copy icons directory
if [ -d "$PROJECT_ROOT/src/web/icons" ]; then
echo "Copying icons..."
copy_item "$PROJECT_ROOT/src/web/icons" dist/icons
if [ ! -d "dist/icons" ]; then
echo "Warning: icons directory not copied successfully"
fi
else
echo "Warning: icons directory not found at $PROJECT_ROOT/src/web/icons"
fi
# Copy yaze icon
if [ -f "$PROJECT_ROOT/assets/yaze.png" ]; then
mkdir -p dist/assets
copy_item "$PROJECT_ROOT/assets/yaze.png" dist/assets/
echo "yaze icon copied"
fi
# Copy z3ed WASM module if built
if [ -f bin/z3ed.js ]; then
echo "Copying z3ed terminal module..."
copy_item bin/z3ed.js dist/
copy_item bin/z3ed.wasm dist/
copy_item bin/z3ed.worker.js dist/ 2>/dev/null || true
fi
echo "=== Build Complete ==="
echo "Output in: $BUILD_DIR/dist/"
echo ""
echo "To serve the app, run:"
echo " scripts/serve-wasm.sh [port]"
echo ""
echo "Or manually:"
echo " cd $BUILD_DIR/dist && python3 -m http.server 8080"