4coder/build_new/scripts/build-macos.sh

319 lines
8.9 KiB
Bash
Executable File

#!/bin/bash
# build-macos.sh - macOS-specific build logic using clang
# Handles Objective-C++ files, frameworks, etc.
# Usage: ./build-macos.sh [debug|release] [x64|x86|arm64]
set -e # Exit on error
# =============================================================================
# Configuration
# =============================================================================
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CONFIG_DIR="$SCRIPT_DIR/../config"
# Source configuration files
source "$CONFIG_DIR/build-config.sh"
source "$HELPERS_DIR/print-routines.sh"
source "$HELPERS_DIR/copy-resources.sh"
# =============================================================================
# Platform-specific settings
# =============================================================================
setup_macos_vars() {
local config=$1
local arch=$2
# Use directories from build-config.sh (already set to absolute paths)
# BUILD_DIR, CODE_DIR, CUSTOM_DIR, FOREIGN_DIR are already set
# Compiler
CXX="clang++"
CC="clang"
# Base flags for macOS
COMMON_FLAGS=(
"${CLANG_OPTS_MACOS[@]}"
"-I$CODE_DIR"
"-I$FOREIGN_DIR/freetype2"
)
# Architecture-specific flags
case "$arch" in
"x64")
ARCH_FLAGS=("${ARCH_FLAGS_X64[@]}")
FREETYPE_LIB="$FREETYPE_LIB_MACOS_X64"
;;
"arm64")
ARCH_FLAGS=("-arch" "arm64" "-DFTECH_64_BIT")
FREETYPE_LIB="$FREETYPE_LIB_MACOS_X64" # Use x64 lib for now
;;
"x86")
ARCH_FLAGS=("${ARCH_FLAGS_X86[@]}")
FREETYPE_LIB="$FREETYPE_LIB_MACOS_X86"
;;
*)
echo "Error: Unsupported architecture: $arch" >&2
return 1
;;
esac
# Configuration-specific flags
case "$config" in
"debug")
CONFIG_FLAGS=("${DEBUG_FLAGS[@]}")
;;
"release")
CONFIG_FLAGS=("${RELEASE_FLAGS[@]}")
;;
*)
echo "Error: Unsupported config: $config" >&2
return 1
;;
esac
# Combine all flags
COMPILE_FLAGS=(
"${COMMON_FLAGS[@]}"
"${ARCH_FLAGS[@]}"
"${CONFIG_FLAGS[@]}"
)
# Libraries and frameworks
LINK_LIBS=(
"${FRAMEWORKS_MACOS[@]}"
"$FREETYPE_LIB"
)
# Platform includes
PLATFORM_INCLUDES=()
for inc in "${PLATFORM_INCLUDES_MACOS[@]}"; do
PLATFORM_INCLUDES+=("-I$CODE_DIR/$inc")
done
print_info "macOS build configuration:"
print_info " Architecture: $arch"
print_info " Configuration: $config"
print_info " Compiler: $CXX"
print_info " FreeType: $FREETYPE_LIB"
}
# =============================================================================
# Build functions
# =============================================================================
build_core_engine() {
print_step "Building API Parser..."
$CUSTOM_DIR/bin/build_one_time.sh $CODE_DIR/4ed_api_parser_main.cpp $BUILD_DIR && cp $BUILD_DIR/one_time $BUILD_DIR/api_parser
print_step "Building System API..."
$CUSTOM_DIR/bin/build_one_time.sh $CODE_DIR/4ed_system_api.cpp $BUILD_DIR && $BUILD_DIR/one_time
print_step "Building API Check..."
$CUSTOM_DIR/bin/build_one_time.sh $CODE_DIR/4ed_api_check.cpp $BUILD_DIR && cp $BUILD_DIR/one_time $BUILD_DIR/api_checker
print_step "Running API Parser..."
$BUILD_DIR/api_parser $CODE_DIR/4ed_api_implementation.cpp
print_step "Building Font API..."
$CUSTOM_DIR/bin/build_one_time.sh $CODE_DIR/4ed_font_api.cpp $BUILD_DIR && $BUILD_DIR/one_time
print_step "Building Graphics API..."
$CUSTOM_DIR/bin/build_one_time.sh $CODE_DIR/4ed_graphics_api.cpp $BUILD_DIR && $BUILD_DIR/one_time
print_step "Building core engine (4ed_app.so)"
local app_target="$CODE_DIR/4ed_app_target.cpp"
local output_lib="$BUILD_DIR/4ed_app.so"
# Build flags for shared library
local build_flags=(
"${COMPILE_FLAGS[@]}"
"-shared"
"-fPIC"
"-DFRED_SUPER"
"-DFRED_INTERNAL"
)
# Include directories for custom layer
local include_flags=(
"-I$CUSTOM_DIR"
"-I$CUSTOM_DIR/generated"
)
print_info "Compiling core application library..."
print_info "Input: $app_target"
print_info "Output: $output_lib"
# Compile core application shared library
if [[ "${BUILD_VERBOSE:-}" == "1" ]]; then
echo "Executing: $CXX ${build_flags[*]} ${include_flags[*]} -o $output_lib $app_target ${LINK_LIBS[*]}"
fi
$CXX \
"${build_flags[@]}" \
"${include_flags[@]}" \
-o "$output_lib" \
"$app_target" \
"${LINK_LIBS[@]}"
print_success "Core engine built successfully"
}
build_platform_layer() {
print_step "Building platform layer (4ed executable)"
local platform_source="$CODE_DIR/platform_mac/mac_4ed.mm"
local output_exe="$BUILD_DIR/4ed"
local include_flags=(
"-I$CUSTOM_DIR"
)
# Build flags for executable
local build_flags=(
"${COMPILE_FLAGS[@]}"
"${PLATFORM_INCLUDES[@]}"
"${include_flags[@]}"
"-DFRED_SUPER"
"-DFRED_INTERNAL"
)
print_info "Compiling platform layer executable..."
print_info "Input: $platform_source"
print_info "Output: $output_exe"
# Compile platform layer executable
if [[ "${BUILD_VERBOSE:-}" == "1" ]]; then
echo "Executing: $CXX ${build_flags[*]} -o $output_exe $platform_source ${LINK_LIBS[*]}"
fi
$CXX \
"${build_flags[@]}" \
-o "$output_exe" \
"$platform_source" \
"${LINK_LIBS[@]}"
print_success "Platform layer built successfully"
}
build_custom_layer() {
print_step "Building custom layer (custom_4coder.so)"
local custom_target="$CUSTOM_DIR/4coder_default_bindings.cpp"
local output_lib="$BUILD_DIR/custom_4coder.so"
local temp_dir="$BUILD_DIR/temp"
# Create temp directory
mkdir -p "$temp_dir"
# Multi-stage custom layer build process
# Stage 0: Build and Run Generators
mkdir -p "$CODE_DIR/generated"
print_step "Building CPP Lexer Gen..."
$CUSTOM_DIR/bin/build_one_time.sh $CUSTOM_DIR/languages/4coder_cpp_lexer_gen.cpp $BUILD_DIR && $BUILD_DIR/one_time
print_step "Building Generate Keycodes..."
$CUSTOM_DIR/bin/build_one_time.sh $CODE_DIR/4ed_generate_keycodes.cpp $BUILD_DIR && $BUILD_DIR/one_time
print_step "Building Docs..."
$CUSTOM_DIR/bin/build_one_time.sh $CODE_DIR/docs/4ed_doc_custom_api_main.cpp $BUILD_DIR && $BUILD_DIR/one_time
# Ensure generated directory exists
mkdir -p "$CUSTOM_DIR/generated"
# Stage 3: Generate metadata
$SCRIPTS_DIR/build-metadata.sh
print_success "Metadata generated"
# Stage 4: Compile custom layer shared library
print_info "Stage 4: Compiling custom layer shared library..."
local build_flags=(
"${COMPILE_FLAGS[@]}"
"-shared"
"-fPIC"
"-I$CUSTOM_DIR"
"-I$CUSTOM_DIR/generated"
"-DFRED_SUPER"
"-DFRED_INTERNAL"
)
if [[ "${BUILD_VERBOSE:-}" == "1" ]]; then
echo "Executing: $CXX ${build_flags[*]} -o $output_lib $custom_target"
fi
$CXX \
"${build_flags[@]}" \
-o "$output_lib" \
"$custom_target"
print_success "Custom layer built successfully"
# Clean up temporary files
print_info "Cleaning up temporary files..."
# rm -f "$preprocessed_file" "$metadata_generator"
}
validate_build() {
print_step "Validating build outputs"
local all_good=true
local expected_files=("4ed" "4ed_app.so" "custom_4coder.so")
for file in "${expected_files[@]}"; do
if [[ -f "$BUILD_DIR/$file" ]]; then
local file_size
file_size=$(stat -f%z "$BUILD_DIR/$file" 2>/dev/null || echo "unknown")
print_success "$file (${file_size} bytes)"
else
echo -e "${RED}${NC} Missing: $file"
all_good=false
fi
done
if [[ "$all_good" == "true" ]]; then
print_success "All build outputs validated"
return 0
else
echo -e "${RED}${NC} Build validation failed"
return 1
fi
}
# =============================================================================
# Main execution
# =============================================================================
main() {
local config="${1:-debug}"
local arch="${2:-x64}"
print_step "macOS Build Process"
print_info "Configuration: $config"
print_info "Architecture: $arch"
# Setup platform-specific variables
setup_macos_vars "$config" "$arch"
# Create build directory
mkdir -p "$BUILD_DIR"
# Execute build steps
build_custom_layer
build_core_engine
build_platform_layer
copy_resources
validate_build
print_success "macOS build completed successfully!"
}
# Only run main if script is executed directly (not sourced)
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
main "$@"
fi