mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-07-11 01:25:07 +02:00
A cross compilation setup by Claude for loongarch64 to check that things build.
This commit is contained in:
+66
-63
@@ -1499,78 +1499,81 @@ elseif(WIN32)
|
|||||||
set(TargetBin PPSSPPWindows)
|
set(TargetBin PPSSPPWindows)
|
||||||
elseif(LIBRETRO)
|
elseif(LIBRETRO)
|
||||||
else()
|
else()
|
||||||
if(GOLD)
|
if(SDL2_FOUND OR SDL2Fwk)
|
||||||
set(TargetBin PPSSPPGold)
|
if(GOLD)
|
||||||
else()
|
set(TargetBin PPSSPPGold)
|
||||||
set(TargetBin PPSSPPSDL)
|
else()
|
||||||
endif()
|
set(TargetBin PPSSPPSDL)
|
||||||
# Require SDL
|
|
||||||
add_compile_definitions(SDL)
|
|
||||||
list(APPEND nativeExtra
|
|
||||||
SDL/SDLJoystick.h
|
|
||||||
SDL/SDLJoystick.cpp
|
|
||||||
SDL/SDLMain.cpp
|
|
||||||
SDL/SDLGLGraphicsContext.cpp
|
|
||||||
)
|
|
||||||
if(NOT USE_LIBNX)
|
|
||||||
list(APPEND nativeExtra
|
|
||||||
SDL/SDLVulkanGraphicsContext.cpp
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
if(SDL2_ttf_FOUND OR
|
|
||||||
(SDL2_ttf_PKGCONFIG_FOUND AND
|
|
||||||
SDL2_ttf_PKGCONFIG_VERSION VERSION_GREATER_EQUAL "2.0.18"))
|
|
||||||
add_compile_definitions(USE_SDL2_TTF)
|
|
||||||
if(FONTCONFIG_FOUND)
|
|
||||||
add_compile_definitions(USE_SDL2_TTF_FONTCONFIG)
|
|
||||||
list(APPEND nativeExtraLibs Fontconfig::Fontconfig)
|
|
||||||
endif()
|
endif()
|
||||||
elseif(SDL2_ttf_PKGCONFIG_FOUND)
|
add_compile_definitions(SDL)
|
||||||
message(WARNING "Found SDL2_ttf <2.0.18 - this is too old, falling back to atlas")
|
|
||||||
endif()
|
|
||||||
if(SDL2_ttf_FOUND)
|
|
||||||
list(APPEND nativeExtraLibs SDL2_ttf::SDL2_ttf)
|
|
||||||
elseif(SDL2_ttf_PKGCONFIG_FOUND)
|
|
||||||
list(APPEND nativeExtraLibs PkgConfig::SDL2_ttf_PKGCONFIG)
|
|
||||||
endif()
|
|
||||||
if(APPLE)
|
|
||||||
list(APPEND nativeExtra
|
list(APPEND nativeExtra
|
||||||
SDL/SDLMain.h
|
SDL/SDLJoystick.h
|
||||||
SDL/SDLMain.mm
|
SDL/SDLJoystick.cpp
|
||||||
SDL/SDLCocoaMetalLayer.h
|
SDL/SDLMain.cpp
|
||||||
SDL/SDLCocoaMetalLayer.mm
|
SDL/SDLGLGraphicsContext.cpp
|
||||||
SDL/CocoaBarItems.mm
|
)
|
||||||
SDL/CocoaBarItems.h
|
if(NOT USE_LIBNX)
|
||||||
SDL/PPSSPPAboutViewController.m
|
list(APPEND nativeExtra
|
||||||
SDL/PPSSPPAboutViewController.h
|
SDL/SDLVulkanGraphicsContext.cpp
|
||||||
SDL/MacCameraHelper.mm
|
)
|
||||||
Common/Battery/AppleBatteryClient.m
|
endif()
|
||||||
UI/PSPNSApplicationDelegate.mm
|
if(SDL2_ttf_FOUND OR
|
||||||
UI/PSPNSApplicationDelegate.h)
|
(SDL2_ttf_PKGCONFIG_FOUND AND
|
||||||
|
SDL2_ttf_PKGCONFIG_VERSION VERSION_GREATER_EQUAL "2.0.18"))
|
||||||
# TODO
|
add_compile_definitions(USE_SDL2_TTF)
|
||||||
# set_source_files_properties(SDL/SDLMain.mm PROPERTIES COMPILE_FLAGS -fobjc-arc)
|
if(FONTCONFIG_FOUND)
|
||||||
|
add_compile_definitions(USE_SDL2_TTF_FONTCONFIG)
|
||||||
set_source_files_properties(Core/Util/DarwinFileSystemServices.mm
|
list(APPEND nativeExtraLibs Fontconfig::Fontconfig)
|
||||||
UI/PSPNSApplicationDelegate.mm
|
endif()
|
||||||
SDL/CocoaMetalLayer.mm
|
elseif(SDL2_ttf_PKGCONFIG_FOUND)
|
||||||
|
message(WARNING "Found SDL2_ttf <2.0.18 - this is too old, falling back to atlas")
|
||||||
|
endif()
|
||||||
|
if(SDL2_ttf_FOUND)
|
||||||
|
list(APPEND nativeExtraLibs SDL2_ttf::SDL2_ttf)
|
||||||
|
elseif(SDL2_ttf_PKGCONFIG_FOUND)
|
||||||
|
list(APPEND nativeExtraLibs PkgConfig::SDL2_ttf_PKGCONFIG)
|
||||||
|
endif()
|
||||||
|
if(APPLE)
|
||||||
|
list(APPEND nativeExtra
|
||||||
|
SDL/SDLMain.h
|
||||||
|
SDL/SDLMain.mm
|
||||||
|
SDL/SDLCocoaMetalLayer.h
|
||||||
|
SDL/SDLCocoaMetalLayer.mm
|
||||||
SDL/CocoaBarItems.mm
|
SDL/CocoaBarItems.mm
|
||||||
|
SDL/CocoaBarItems.h
|
||||||
SDL/PPSSPPAboutViewController.m
|
SDL/PPSSPPAboutViewController.m
|
||||||
|
SDL/PPSSPPAboutViewController.h
|
||||||
SDL/MacCameraHelper.mm
|
SDL/MacCameraHelper.mm
|
||||||
Common/Battery/AppleBatteryClient.m
|
Common/Battery/AppleBatteryClient.m
|
||||||
Common/Render/Text/draw_text_cocoa.mm
|
UI/PSPNSApplicationDelegate.mm
|
||||||
PROPERTIES COMPILE_FLAGS -fobjc-arc)
|
UI/PSPNSApplicationDelegate.h)
|
||||||
list(APPEND nativeExtraLibs ${COCOA_LIBRARY} ${QUARTZ_CORE_LIBRARY} ${IOKIT_LIBRARY} "-framework AVFoundation" "-framework CoreMedia" "-framework CoreVideo")
|
|
||||||
|
|
||||||
if(USE_SYSTEM_LIBSDL2)
|
# TODO
|
||||||
list(APPEND nativeExtraLibs SDL2::SDL2)
|
# set_source_files_properties(SDL/SDLMain.mm PROPERTIES COMPILE_FLAGS -fobjc-arc)
|
||||||
|
|
||||||
|
set_source_files_properties(Core/Util/DarwinFileSystemServices.mm
|
||||||
|
UI/PSPNSApplicationDelegate.mm
|
||||||
|
SDL/CocoaMetalLayer.mm
|
||||||
|
SDL/CocoaBarItems.mm
|
||||||
|
SDL/PPSSPPAboutViewController.m
|
||||||
|
SDL/MacCameraHelper.mm
|
||||||
|
Common/Battery/AppleBatteryClient.m
|
||||||
|
Common/Render/Text/draw_text_cocoa.mm
|
||||||
|
PROPERTIES COMPILE_FLAGS -fobjc-arc)
|
||||||
|
list(APPEND nativeExtraLibs ${COCOA_LIBRARY} ${QUARTZ_CORE_LIBRARY} ${IOKIT_LIBRARY} "-framework AVFoundation" "-framework CoreMedia" "-framework CoreVideo")
|
||||||
|
|
||||||
|
if(USE_SYSTEM_LIBSDL2)
|
||||||
|
list(APPEND nativeExtraLibs SDL2::SDL2)
|
||||||
|
else()
|
||||||
|
list(APPEND nativeExtraLibs ${SDL2Fwk})
|
||||||
|
endif()
|
||||||
|
elseif(USING_EGL)
|
||||||
|
list(APPEND nativeExtraLibs pthread SDL2::SDL2)
|
||||||
else()
|
else()
|
||||||
list(APPEND nativeExtraLibs ${SDL2Fwk})
|
list(APPEND nativeExtraLibs SDL2::SDL2)
|
||||||
endif()
|
endif()
|
||||||
elseif(USING_EGL)
|
elseif(NOT CMAKE_CROSSCOMPILING)
|
||||||
list(APPEND nativeExtraLibs pthread SDL2::SDL2)
|
message(FATAL_ERROR "SDL2 not found - required for this platform")
|
||||||
else()
|
|
||||||
list(APPEND nativeExtraLibs SDL2::SDL2)
|
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,11 @@ do
|
|||||||
--rpi64)
|
--rpi64)
|
||||||
CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=cmake/Toolchains/raspberry.armv8.cmake ${CMAKE_ARGS}"
|
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}"
|
--android) CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=android/android.toolchain.cmake ${CMAKE_ARGS}"
|
||||||
TARGET_OS=Android
|
TARGET_OS=Android
|
||||||
PACKAGE=1
|
PACKAGE=1
|
||||||
@@ -121,6 +126,33 @@ set -e
|
|||||||
echo Building with $CORES_COUNT threads
|
echo Building with $CORES_COUNT threads
|
||||||
|
|
||||||
mkdir -p ${BUILD_DIR}
|
mkdir -p ${BUILD_DIR}
|
||||||
|
|
||||||
|
# For loongarch64 cross-compilation, build a comprehensive GL/GLX stub into
|
||||||
|
# <build>/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}
|
pushd ${BUILD_DIR}
|
||||||
|
|
||||||
cmake $CMAKE_ARGS ..
|
cmake $CMAKE_ARGS ..
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
set(CMAKE_SYSTEM_NAME Linux)
|
||||||
|
set(CMAKE_SYSTEM_PROCESSOR loongarch64)
|
||||||
|
|
||||||
|
set(CMAKE_C_COMPILER loongarch64-linux-gnu-gcc-14)
|
||||||
|
set(CMAKE_CXX_COMPILER loongarch64-linux-gnu-g++-14)
|
||||||
|
set(CMAKE_ASM_COMPILER loongarch64-linux-gnu-gcc-14)
|
||||||
|
|
||||||
|
set(CMAKE_FIND_ROOT_PATH /usr/loongarch64-linux-gnu)
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
|
||||||
|
|
||||||
|
# No X11 in the sysroot; disable the X11 Vulkan path to avoid include-dir errors.
|
||||||
|
set(USING_X11_VULKAN OFF CACHE BOOL "" FORCE)
|
||||||
|
|
||||||
|
# Bypass find_package(OpenGL REQUIRED). A stub libGL.so is required so that
|
||||||
|
# GLEW's static archive can be linked via PLT entries (direct B26 branches to
|
||||||
|
# address 0 would overflow on LoongArch).
|
||||||
|
#
|
||||||
|
# Primary: run cmake/scripts/setup-loongarch64-cross.sh (sudo) once — it
|
||||||
|
# installs the stub + GL headers into the sysroot.
|
||||||
|
# Fallback: the stub can also sit in <build-dir>/stublibs/libGL.so;
|
||||||
|
# b.sh --loongarch64 creates this automatically on first run.
|
||||||
|
set(OPENGL_LIBRARIES GL CACHE STRING "" FORCE)
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS
|
||||||
|
"${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_BINARY_DIR}/stublibs"
|
||||||
|
CACHE STRING "" FORCE)
|
||||||
|
|
||||||
|
# Allow CMake's compile-check programs to run via QEMU.
|
||||||
|
# The /lib64 symlink is created by the setup script; without it, pass -L
|
||||||
|
# explicitly so QEMU can find the loongarch64 dynamic linker.
|
||||||
|
if(EXISTS "/lib64/ld-linux-loongarch-lp64d.so.1")
|
||||||
|
set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-loongarch64-static"
|
||||||
|
CACHE STRING "" FORCE)
|
||||||
|
else()
|
||||||
|
set(CMAKE_CROSSCOMPILING_EMULATOR
|
||||||
|
"qemu-loongarch64-static;-L;/usr/loongarch64-linux-gnu"
|
||||||
|
CACHE STRING "" FORCE)
|
||||||
|
endif()
|
||||||
Executable
+75
@@ -0,0 +1,75 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Sets up the loongarch64 cross-compilation environment.
|
||||||
|
# Run once with sudo. After this, ./b.sh --loongarch64 works on a fresh checkout.
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
SYSROOT=/usr/loongarch64-linux-gnu
|
||||||
|
CROSS_GCC=loongarch64-linux-gnu-gcc-14
|
||||||
|
|
||||||
|
if ! command -v $CROSS_GCC &>/dev/null; then
|
||||||
|
echo "Error: $CROSS_GCC not found. Install it first:"
|
||||||
|
echo " sudo apt install gcc-14-loongarch64-linux-gnu g++-14-loongarch64-linux-gnu binutils-loongarch64-linux-gnu"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$(id -u)" -ne 0 ]; then
|
||||||
|
echo "This script must be run with sudo."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ── OpenGL headers ───────────────────────────────────────────────────────────
|
||||||
|
# GL headers are platform-independent C headers; copy from the host.
|
||||||
|
echo "Installing GL headers into sysroot..."
|
||||||
|
mkdir -p $SYSROOT/include/GL
|
||||||
|
for h in gl.h glext.h glcorearb.h; do
|
||||||
|
[ -f /usr/include/GL/$h ] && cp /usr/include/GL/$h $SYSROOT/include/GL/ && echo " $h"
|
||||||
|
done
|
||||||
|
|
||||||
|
# ── GL stub library ──────────────────────────────────────────────────────────
|
||||||
|
# Generate a loongarch64 libGL.so that exports all symbols from the host
|
||||||
|
# libGL so that GLEW's static archive can be linked via PLT entries (a direct
|
||||||
|
# B26 branch to address 0 would overflow on LoongArch).
|
||||||
|
echo "Generating libGL.so stub..."
|
||||||
|
|
||||||
|
HOST_GL=""
|
||||||
|
for candidate in \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libGL.so.1 \
|
||||||
|
/usr/lib/x86_64-linux-gnu/libGL.so \
|
||||||
|
/usr/lib/libGL.so.1 ; do
|
||||||
|
[ -f "$candidate" ] && HOST_GL="$candidate" && break
|
||||||
|
done
|
||||||
|
|
||||||
|
STUB_C=$(mktemp /tmp/gl_stub_XXXXXX.c)
|
||||||
|
echo "/* Loongarch64 GL/GLX stub - for cross-compilation only */" > "$STUB_C"
|
||||||
|
echo "void __loongarch64_gl_placeholder(void) {}" >> "$STUB_C"
|
||||||
|
|
||||||
|
if [ -n "$HOST_GL" ]; then
|
||||||
|
nm -D "$HOST_GL" 2>/dev/null | awk '/^[0-9a-f]+ T /{ print "void "$3"(void){}" }' >> "$STUB_C"
|
||||||
|
echo " Extracted symbols from $HOST_GL"
|
||||||
|
fi
|
||||||
|
# Always include the minimal set GLEW needs (in case host GL wasn't found)
|
||||||
|
for sym in glXGetProcAddressARB glXGetClientString glXQueryVersion \
|
||||||
|
glBindTexture glGetString glGetIntegerv glGetError; do
|
||||||
|
grep -q "void ${sym}(" "$STUB_C" || echo "void ${sym}(void){}" >> "$STUB_C"
|
||||||
|
done
|
||||||
|
|
||||||
|
$CROSS_GCC -shared -fPIC -Wno-implicit-function-declaration \
|
||||||
|
-o $SYSROOT/lib/libGL.so "$STUB_C"
|
||||||
|
rm "$STUB_C"
|
||||||
|
echo " Installed to $SYSROOT/lib/libGL.so"
|
||||||
|
|
||||||
|
# ── Dynamic linker symlink ───────────────────────────────────────────────────
|
||||||
|
# Without this, binfmt_misc can't find the loongarch64 dynamic linker.
|
||||||
|
LD_LINUX=$SYSROOT/lib/ld-linux-loongarch-lp64d.so.1
|
||||||
|
if [ -f "$LD_LINUX" ]; then
|
||||||
|
mkdir -p /lib64
|
||||||
|
ln -sf "$LD_LINUX" /lib64/ld-linux-loongarch-lp64d.so.1
|
||||||
|
echo "Created /lib64/ld-linux-loongarch-lp64d.so.1 -> $LD_LINUX"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Setup complete."
|
||||||
|
echo "Build: ./b.sh --loongarch64"
|
||||||
|
echo "Run: qemu-loongarch64-static -L $SYSROOT <binary>"
|
||||||
|
echo " (after setup the /lib64 symlink lets you run loongarch64 binaries directly)"
|
||||||
Reference in New Issue
Block a user