307 lines
8.5 KiB
Bash
Executable File
307 lines
8.5 KiB
Bash
Executable File
#!/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 |