#!/bin/bash # build.sh - Master build script for 4coder simplified build system # Usage: ./build.sh [platform] [config] [arch] # Examples: # ./build.sh macos debug x64 # ./build.sh linux release x64 # ./build.sh win32 debug x64 set -e # Exit on error # ============================================================================= # Configuration # ============================================================================= SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BUILD_ROOT="$SCRIPT_DIR/../../build" CONFIG_DIR="$SCRIPT_DIR/../config" HELPERS_DIR="$SCRIPT_DIR/../helpers" # Source configuration files source "$CONFIG_DIR/build-config.sh" # ============================================================================= # Utility Functions # ============================================================================= # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color print_success() { echo -e "${GREEN}✓${NC} $1" } print_warning() { echo -e "${YELLOW}⚠${NC} $1" } print_error() { echo -e "${RED}✗${NC} $1" } print_info() { echo -e "${BLUE}ℹ${NC} $1" } print_step() { echo -e "${BLUE}===${NC} $1 ${BLUE}===${NC}" } show_usage() { echo "Usage: $0 [platform] [config] [arch]" echo "" echo "Parameters:" echo " platform - Target platform (auto-detect if not specified)" echo " Options: macos, linux, win32" echo " config - Build configuration (default: debug)" echo " Options: debug, release" echo " arch - Target architecture (auto-detect if not specified)" echo " Options: x64, x86, arm64" echo "" echo "Examples:" echo " $0 # Auto-detect platform and arch, debug build" echo " $0 macos debug x64 # Explicit macOS debug x64 build" echo " $0 linux release x64 # Linux release build" echo " $0 win32 debug x64 # Windows debug build" echo "" echo "Environment:" echo " BUILD_VERBOSE=1 # Enable verbose compilation output" echo " BUILD_CLEAN=1 # Clean before build" } # ============================================================================= # Parameter Processing # ============================================================================= detect_platform_and_arch() { local detected_platform detected_arch if [[ -x "$HELPERS_DIR/detect-platform.sh" ]]; then detected_platform=$("$HELPERS_DIR/detect-platform.sh" detect 2>/dev/null) detected_arch=$("$HELPERS_DIR/detect-platform.sh" arch 2>/dev/null) if [[ -n "$detected_platform" && -n "$detected_arch" ]]; then # Don't print here, let the caller print after parsing echo "$detected_platform $detected_arch" else print_error "Failed to detect platform or architecture" >&2 return 1 fi else print_error "Platform detection script not found" >&2 return 1 fi } validate_parameters() { local platform=$1 local config=$2 local arch=$3 # Validate platform case "$platform" in "macos"|"linux"|"win32") ;; *) print_error "Invalid platform: $platform" print_info "Valid platforms: macos, linux, win32" return 1 ;; esac # Validate config case "$config" in "debug"|"release") ;; *) print_error "Invalid config: $config" print_info "Valid configs: debug, release" return 1 ;; esac # Validate arch case "$arch" in "x64"|"x86"|"arm64") ;; *) print_error "Invalid architecture: $arch" print_info "Valid architectures: x64, x86, arm64" return 1 ;; esac return 0 } # ============================================================================= # Build Environment Setup # ============================================================================= setup_build_environment() { local platform=$1 local config=$2 local arch=$3 print_step "Setting up build environment" # Create build directories mkdir -p "$BUILD_ROOT" mkdir -p "$BUILD_ROOT/temp" # Export build variables export BUILD_PLATFORM="$platform" export BUILD_CONFIG="$config" export BUILD_ARCH="$arch" export BUILD_ROOT="$BUILD_ROOT" export CODE_DIR="$CODE_DIR" export CUSTOM_DIR="$CUSTOM_DIR" export FOREIGN_DIR="$FOREIGN_DIR" print_success "Build environment ready" print_info "Platform: $platform" print_info "Config: $config" print_info "Architecture: $arch" print_info "Build root: $BUILD_ROOT" } # ============================================================================= # Build Execution # ============================================================================= execute_platform_build() { local platform=$1 local config=$2 local arch=$3 local platform_script="$SCRIPT_DIR/build-$platform.sh" if [[ -x "$platform_script" ]]; then print_step "Executing platform-specific build" print_info "Running: $platform_script $config $arch" # Execute platform-specific build script "$platform_script" "$config" "$arch" return $? else print_error "Platform-specific build script not found: $platform_script" return 1 fi } # ============================================================================= # Clean Build Support # ============================================================================= clean_build() { print_step "Cleaning build directory" if [[ -d "$BUILD_ROOT" ]]; then print_info "Removing $BUILD_ROOT" rm -rf "$BUILD_ROOT" fi print_success "Build directory cleaned" } # ============================================================================= # Main Build Process # ============================================================================= main() { local platform="${1:-}" local config="${2:-debug}" local arch="${3:-}" # Handle help request if [[ "$1" == "help" || "$1" == "-h" || "$1" == "--help" ]]; then show_usage return 0 fi # Handle clean request if [[ "$1" == "clean" ]]; then clean_build return 0 fi print_step "4coder Simplified Build System" # Auto-detect platform and arch if not provided if [[ -z "$platform" || -z "$arch" ]]; then local detected_info detected_platform detected_arch detected_info=$(detect_platform_and_arch) if [[ $? -ne 0 ]]; then print_error "Failed to auto-detect platform and architecture" return 1 fi read -r detected_platform detected_arch <<< "$detected_info" platform="${platform:-$detected_platform}" arch="${arch:-$detected_arch}" print_info "Auto-detected platform: $platform" print_info "Auto-detected architecture: $arch" fi # Validate parameters if ! validate_parameters "$platform" "$config" "$arch"; then echo "" show_usage return 1 fi # Clean if requested if [[ "${BUILD_CLEAN:-}" == "1" ]]; then clean_build fi # Setup build environment if ! setup_build_environment "$platform" "$config" "$arch"; then return 1 fi # Record build start time local build_start_time build_start_time=$(date +%s) # Execute platform-specific build print_step "Starting build process" if execute_platform_build "$platform" "$config" "$arch"; then local build_end_time build_duration build_end_time=$(date +%s) build_duration=$((build_end_time - build_start_time)) print_step "Build completed successfully!" print_success "Build time: ${build_duration}s" print_info "Outputs in: $BUILD_ROOT" # List built artifacts print_info "Built artifacts:" if [[ -f "$BUILD_ROOT/4ed" ]]; then print_success " 4ed (main executable)" fi if [[ -f "$BUILD_ROOT/4ed_app.so" ]]; then print_success " 4ed_app.so (core engine)" fi if [[ -f "$BUILD_ROOT/custom_4coder.so" ]]; then print_success " custom_4coder.so (custom layer)" fi return 0 else print_error "Build failed" return 1 fi } # Only run main if script is executed directly (not sourced) if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then main "$@" fi