#!/bin/bash CMAKE=1 # Check arguments while test $# -gt 0 do case "$1" in --qt) echo "Qt enabled" QT=1 CMAKE_ARGS="-DUSING_QT_UI=ON ${CMAKE_ARGS}" ;; --qtbrew) echo "Qt enabled (homebrew)" QT=1 CMAKE_ARGS="-DUSING_QT_UI=ON -DCMAKE_PREFIX_PATH=$(brew --prefix qt5) ${CMAKE_ARGS}" ;; --ios) CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=cmake/Toolchains/ios.cmake ${CMAKE_ARGS}" TARGET_OS=iOS ;; --ios-xcode) CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=cmake/Toolchains/ios.cmake -DIOS_PLATFORM=OS -GXcode ${CMAKE_ARGS}" TARGET_OS=iOS-xcode ;; --fat) CMAKE_ARGS="-DCMAKE_OSX_ARCHITECTURES=arm64;x86_64 ${CMAKE_ARGS}" ;; --x64) CMAKE_ARGS="-DCMAKE_OSX_ARCHITECTURES=x86_64 ${CMAKE_ARGS}" ;; --arm64) CMAKE_ARGS="-DCMAKE_OSX_ARCHITECTURES=arm64 ${CMAKE_ARGS}" ;; --no-png) CMAKE_ARGS="-DUSE_SYSTEM_LIBPNG=OFF ${CMAKE_ARGS}" ;; --no-sdl2) CMAKE_ARGS="-DUSE_SYSTEM_LIBSDL2=OFF ${CMAKE_ARGS}" ;; --rpi-armv6) CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=cmake/Toolchains/raspberry.armv6.cmake ${CMAKE_ARGS}" ;; --rpi) CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=cmake/Toolchains/raspberry.armv7.cmake ${CMAKE_ARGS}" ;; --rpi64) CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=cmake/Toolchains/raspberry.armv8.cmake ${CMAKE_ARGS}" ;; --loongarch64) CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=cmake/Toolchains/loongarch64-linux-gnu.cmake -DHEADLESS=ON -DUSE_SYSTEM_LIBPNG=OFF -DUSE_SYSTEM_LIBSDL2=OFF ${CMAKE_ARGS}" TARGET_OS=loongarch64 LOONGARCH64_BUILD=1 ;; --android) CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=android/android.toolchain.cmake ${CMAKE_ARGS}" TARGET_OS=Android PACKAGE=1 ;; --simulator) echo "Simulator mode enabled" CMAKE_ARGS="-DSIMULATOR=ON ${CMAKE_ARGS}" ;; --release) CMAKE_ARGS="-DCMAKE_BUILD_TYPE=Release ${CMAKE_ARGS}" ;; --debug) CMAKE_ARGS="-DCMAKE_BUILD_TYPE=Debug ${CMAKE_ARGS}" ;; --reldebug) CMAKE_ARGS="-DCMAKE_BUILD_TYPE=RelWithDebInfo ${CMAKE_ARGS}" ;; --headless) echo "Headless mode enabled" CMAKE_ARGS="-DHEADLESS=ON ${CMAKE_ARGS}" ;; --atlas-tool) echo "Atlas tool enabled" CMAKE_ARGS="-DATLAS_TOOL=ON ${CMAKE_ARGS}" ;; --libretro) echo "Build Libretro core" CMAKE_ARGS="-DLIBRETRO=ON ${CMAKE_ARGS}" ;; --libretro_android) echo "Build Libretro Android core" CMAKE_ARGS="-DLIBRETRO=ON -DCMAKE_TOOLCHAIN_FILE=${NDK}/build/cmake/android.toolchain.cmake -DANDROID_ABI=${APP_ABI} ${CMAKE_ARGS}" ;; --unittest) echo "Build unittest" CMAKE_ARGS="-DUNITTEST=ON ${CMAKE_ARGS}" ;; --no-package) echo "Packaging disabled" PACKAGE=0 ;; --clang) echo "Clang enabled" export CC=/usr/bin/clang export CXX=/usr/bin/clang++ ;; --sanitize) echo "Enabling address-sanitizer if available" CMAKE_ARGS="-DUSE_ASAN=ON ${CMAKE_ARGS}" ;; --sanitizeub) echo "Enabling ub-sanitizer if available" CMAKE_ARGS="-DUSE_UBSAN=ON ${CMAKE_ARGS}" ;; --gold) echo "Gold build enabled" CMAKE_ARGS="-DGOLD=ON ${CMAKE_ARGS}" ;; --alderlake) echo "Alderlake opt" CMAKE_ARGS="-DCMAKE_C_FLAGS=\"-march=alderlake\" -DCMAKE_CPP_FLAGS=\"-march=alderlake\"" ;; --no_mmap) echo "Disable mmap" CMAKE_ARGS="-DUSE_NO_MMAP=ON ${CMAKE_ARGS}" ;; --gles) echo "Using GLES/EGL" CMAKE_ARGS="-DUSING_GLES2=ON -DUSING_EGL=ON ${CMAKE_ARGS}" ;; *) MAKE_OPT="$1 ${MAKE_OPT}" ;; esac shift done if [ ! -z "$TARGET_OS" ]; then echo "Building for $TARGET_OS" BUILD_DIR="$(tr [A-Z] [a-z] <<< build-"$TARGET_OS")" else echo "Building for native host." BUILD_DIR="build" fi CORES_COUNT=4 if [[ "$OSTYPE" == "linux-gnu"* ]]; then CORES_COUNT="$(nproc)" elif [[ "$OSTYPE" == "darwin"* ]]; then CORES_COUNT="$(sysctl -n hw.physicalcpu)" fi # Strict errors. Any non-zero return exits this script set -e echo Building with $CORES_COUNT threads mkdir -p ${BUILD_DIR} # For loongarch64 cross-compilation, build a comprehensive GL/GLX stub into # /stublibs/libGL.so so GLEW's static archive can resolve its symbols # via PLT entries (a direct B26 branch to address 0 overflows on LoongArch). # This stub is always (re)generated to pick up any new needed symbols. if [ ! -z "$LOONGARCH64_BUILD" ]; then STUB_DIR=${BUILD_DIR}/stublibs STUB_GL=${STUB_DIR}/libGL.so mkdir -p "${STUB_DIR}" STUB_C=$(mktemp /tmp/gl_stub_XXXXXX.c) echo "/* Loongarch64 GL/GLX stub - cross-compilation only */" > "$STUB_C" # Collect all T (exported) symbols from GL/GLX libs, deduplicate, emit stubs { for lib in /usr/lib/x86_64-linux-gnu/libGL.so.1 \ /usr/lib/x86_64-linux-gnu/libGLX.so.0 \ /usr/lib/x86_64-linux-gnu/libGLdispatch.so.0; do [ -f "$lib" ] && nm -D "$lib" 2>/dev/null | awk '/^[0-9a-f]+ T /{ print $3 }' done # Always include the minimal GLX symbols GLEW directly references printf '%s\n' glXGetProcAddressARB glXGetClientString glXQueryVersion \ glBindTexture glGetString glGetIntegerv } | sort -u | awk '{ print "void "$1"(void){}" }' >> "$STUB_C" loongarch64-linux-gnu-gcc-14 -shared -fPIC -Wno-implicit-function-declaration \ -o "${STUB_GL}" "$STUB_C" rm "$STUB_C" fi pushd ${BUILD_DIR} cmake $CMAKE_ARGS .. make -j$CORES_COUNT $MAKE_OPT popd