#!/bin/bash # build-config.sh - Essential build configuration extracted from 4ed_build.cpp # This file contains all the platform-specific compiler flags, linker flags, and build settings # ============================================================================= # Directory Configuration # ============================================================================= # Get the directory containing this script CONFIG_SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$CONFIG_SCRIPT_DIR/../.." && pwd)" # Build directories (absolute paths) BUILD_DIR="$PROJECT_ROOT/build" BUILD_TEMP_DIR="$PROJECT_ROOT/build_new/temp" PACK_DIR="$PROJECT_ROOT/distributions" SITE_DIR="$PROJECT_ROOT/site" # Source directories (absolute paths) CODE_DIR="$PROJECT_ROOT/code" GENERATED_DIR="$PROJECT_ROOT/code/generated" CUSTOM_DIR="$PROJECT_ROOT/code/custom" CUSTOM_GENERATED_DIR="$PROJECT_ROOT/code/custom/generated" FOREIGN_DIR="$PROJECT_ROOT/non-source/foreign" SCRIPTS_DIR="$PROJECT_ROOT/build_new/scripts" HELPERS_DIR="$PROJECT_ROOT/build_new/helpers" # Include directories INCLUDES=( "$CUSTOM_DIR" "$FOREIGN_DIR/freetype2" ) # ============================================================================= # Platform Detection # ============================================================================= # Platform codes PLATFORM_WINDOWS=0 PLATFORM_LINUX=1 PLATFORM_MAC=2 # Architecture codes ARCH_X64=0 ARCH_X86=1 # ============================================================================= # Build Flags # ============================================================================= # Build flag bits (matching 4ed_build.cpp) FLAG_OPTS=$((0x1)) # Compiler warnings/options FLAG_LIBS=$((0x2)) # Link libraries FLAG_ICON=$((0x4)) # Windows icon resource FLAG_SHARED_CODE=$((0x8)) # Build as shared library FLAG_DEBUG_INFO=$((0x10)) # Debug symbols FLAG_OPTIMIZATION=$((0x20)) # Optimization level FLAG_SUPER=$((0x40)) # Super tier features FLAG_INTERNAL=$((0x80)) # Internal build flags FLAG_SHIP=$((0x100)) # Shipping build # ============================================================================= # Compiler Options - Windows (CL equivalent using clang) # ============================================================================= # Windows compiler options (translated from CL to clang) CLANG_OPTS_WINDOWS=( "-Wall" # Enable most warnings "-Wno-unused-parameter" # Disable unused parameter warnings "-Wno-unused-variable" # Disable unused variable warnings "-Wno-missing-field-initializers" # Disable missing field initializer warnings "-Wno-deprecated-declarations" # Disable deprecated declarations warnings "-Wno-missing-braces" # Disable missing braces warnings "-Wno-tautological-compare" # Disable tautological compare warnings "-Wno-write-strings" # Disable write strings warnings "-Werror" # Treat warnings as errors "-fno-rtti" # Disable RTTI (equivalent to /GR-) "-fno-exceptions" # Disable exceptions (equivalent to /EHa-) "-std=c++11" # C++11 standard "-target x86_64-pc-windows-msvc" # Target Windows with MSVC ABI ) # Windows libraries LIBS_WINDOWS=( "-luser32" "-lwinmm" "-lgdi32" "-lopengl32" "-lcomdlg32" "-luserenv" ) # Windows FreeType libraries FREETYPE_LIB_WINDOWS_X64="$FOREIGN_DIR/x64/freetype.lib" FREETYPE_LIB_WINDOWS_X86="$FOREIGN_DIR/x86/freetype.lib" # Windows icon resource WINDOWS_ICON="$PROJECT_ROOT/non-source/res/icon.res" # ============================================================================= # Compiler Options - Linux (GCC equivalent using clang) # ============================================================================= CLANG_OPTS_LINUX=( "-Wno-write-strings" "-D_GNU_SOURCE" "-fPIC" "-fno-threadsafe-statics" "-pthread" "-Wno-unused-result" "-std=c++11" "-target x86_64-linux-gnu" # Target Linux ) # Linux libraries LIBS_LINUX=( "-lX11" "-lpthread" "-lm" "-lrt" "-lGL" "-ldl" "-lXfixes" "-lfreetype" "-lfontconfig" ) # Linux platform includes PLATFORM_INCLUDES_LINUX=( "platform_all" "platform_unix" ) # ============================================================================= # Compiler Options - macOS (Clang native) # ============================================================================= CLANG_OPTS_MACOS=( "-Wno-write-strings" "-Wno-deprecated-declarations" "-Wno-comment" "-Wno-switch" "-Wno-null-dereference" "-Wno-tautological-compare" "-Wno-unused-result" "-Wno-missing-declarations" "-Wno-nullability-completeness" "-std=c++11" # Target will be set based on architecture ) # macOS frameworks (equivalent to libraries) FRAMEWORKS_MACOS=( "-lc++" "-lobjc" -framework Cocoa -framework QuartzCore -framework CoreServices -framework OpenGL -framework IOKit -framework Metal -framework MetalKit ) # macOS FreeType libraries FREETYPE_LIB_MACOS_X64="$FOREIGN_DIR/x64/libfreetype-mac.a" FREETYPE_LIB_MACOS_X86="$FOREIGN_DIR/x86/libfreetype-mac.a" # macOS platform includes PLATFORM_INCLUDES_MACOS=( "platform_all" "platform_unix" ) # ============================================================================= # Architecture-specific flags # ============================================================================= # 64-bit architecture ARCH_FLAGS_X64=( "-m64" "-DFTECH_64_BIT" ) # 32-bit architecture ARCH_FLAGS_X86=( "-m32" "-DFTECH_32_BIT" ) # ============================================================================= # Build Mode Flags # ============================================================================= # Debug flags DEBUG_FLAGS=( "-g" # Debug symbols "-O0" # No optimization "-DDO_CRAZY_EXPENSIVE_ASSERTS" # Enable expensive assertions ) # Release flags RELEASE_FLAGS=( "-O2" # Optimization level 2 (clang equivalent to -O3 for performance) ) # ============================================================================= # File Lists (from 4ed_build.cpp) # ============================================================================= # Platform layer files PLATFORM_FILES_WINDOWS=("platform_win32/win32_4ed.cpp") PLATFORM_FILES_LINUX=("platform_linux/linux_4ed.cpp") PLATFORM_FILES_MACOS=("platform_mac/mac_4ed.mm") # Custom layer default target DEFAULT_CUSTOM_TARGET="$CUSTOM_DIR/4coder_default_bindings.cpp" # ============================================================================= # Build Defines # ============================================================================= # Function to get defines from flags (equivalent to get_defines_from_flags in 4ed_build.cpp) get_defines_from_flags() { local flags=$1 local defines=() if (( flags & FLAG_SHIP )); then defines+=("-DSHIP_MODE") fi if (( flags & FLAG_INTERNAL )); then defines+=("-DFRED_INTERNAL") fi if (( flags & FLAG_SUPER )); then defines+=("-DFRED_SUPER") fi echo "${defines[@]}" } # ============================================================================= # Build Outputs # ============================================================================= # Main executable names EXECUTABLE_WINDOWS="4ed.exe" EXECUTABLE_LINUX="4ed" EXECUTABLE_MACOS="4ed" # Shared library names SHARED_LIB_WINDOWS="4ed_app.dll" SHARED_LIB_LINUX="4ed_app.so" SHARED_LIB_MACOS="4ed_app.so" # Custom layer library names CUSTOM_LIB_WINDOWS="custom_4coder.dll" CUSTOM_LIB_LINUX="custom_4coder.so" CUSTOM_LIB_MACOS="custom_4coder.so" # ============================================================================= # Utility Functions # ============================================================================= # Get platform-specific settings get_platform_settings() { local platform=$1 case $platform in "windows"|"win32") echo "PLATFORM_WINDOWS" ;; "linux") echo "PLATFORM_LINUX" ;; "macos"|"mac") echo "PLATFORM_MAC" ;; *) echo "UNKNOWN_PLATFORM" return 1 ;; esac } # Get architecture-specific settings get_arch_settings() { local arch=$1 case $arch in "x64"|"x86_64") echo "ARCH_X64" ;; "x86"|"i386") echo "ARCH_X86" ;; *) echo "UNKNOWN_ARCH" return 1 ;; esac } # Check if flag is set has_flag() { local flags=$1 local flag=$2 (( flags & flag )) }