mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-01 14:58:14 +00:00
The pieces were nearly all in place already - CMakeLists has detected riscv64 and set RISCV64 since the backend landed - so this is mostly a matter of not hardcoding loongarch64 in the cross-build plumbing: - setup-loongarch64-cross.sh becomes setup-cross.sh <target>, taking the triple and dynamic linker name from the argument. - b.sh gains --riscv64, and the GL stub block is keyed off a compiler variable rather than a loongarch64-only flag. - New cmake/Toolchains/riscv64-linux-gnu.cmake, mirroring the existing one. The SDL carve-out moves from LOONGARCH64_DEVICE to a new HEADLESS_CROSS option set by b.sh. That flag was keyed off the target architecture, which is also true when building natively on such a machine - harmless so far, but riscv64 hardware that people actually build PPSSPP on exists, and it should still get the normal SDL frontend. Both toolchain files now find qemu rather than assuming the static build: Debian ships the static binaries in qemu-user-static and the dynamic ones in qemu-user, and only the latter is available on some releases. Neither being present is fine too - it just means no compile-check programs run. Verified by a clean loongarch64 build; riscv64 is untested so far, the toolchain isn't installed here yet. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
97 lines
3.5 KiB
Bash
Executable File
97 lines
3.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# Sets up a cross-compilation environment for one of the headless-only targets.
|
|
# Run once with sudo. After this, ./b.sh --<target> works on a fresh checkout.
|
|
#
|
|
# Usage: sudo cmake/scripts/setup-cross.sh <loongarch64|riscv64>
|
|
|
|
set -e
|
|
|
|
TARGET="$1"
|
|
|
|
case "$TARGET" in
|
|
loongarch64)
|
|
TRIPLE=loongarch64-linux-gnu
|
|
LD_SO=ld-linux-loongarch-lp64d.so.1
|
|
;;
|
|
riscv64)
|
|
TRIPLE=riscv64-linux-gnu
|
|
LD_SO=ld-linux-riscv64-lp64d.so.1
|
|
;;
|
|
*)
|
|
echo "Usage: sudo $0 <loongarch64|riscv64>"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
SYSROOT=/usr/$TRIPLE
|
|
CROSS_GCC=$TRIPLE-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-$TRIPLE g++-14-$TRIPLE binutils-$TRIPLE"
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$(id -u)" -ne 0 ]; then
|
|
echo "This script must be run with sudo."
|
|
exit 1
|
|
fi
|
|
|
|
HOST_MULTIARCH=$(gcc -print-multiarch 2>/dev/null || dpkg-architecture -qDEB_HOST_MULTIARCH 2>/dev/null)
|
|
|
|
# ── 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 glu.h; do
|
|
[ -f /usr/include/GL/$h ] && cp /usr/include/GL/$h $SYSROOT/include/GL/ && echo " $h"
|
|
done
|
|
|
|
# ── GL stub library ──────────────────────────────────────────────────────────
|
|
# Generate a libGL.so for the target that exports all symbols from the host
|
|
# libGL so that GLEW's static archive can be linked via PLT entries (a direct
|
|
# branch to address 0 would overflow the relocation on these targets).
|
|
echo "Generating libGL.so stub..."
|
|
|
|
HOST_GL=""
|
|
for candidate in \
|
|
/usr/lib/$HOST_MULTIARCH/libGL.so.1 \
|
|
/usr/lib/$HOST_MULTIARCH/libGL.so \
|
|
/usr/lib/libGL.so.1 ; do
|
|
[ -f "$candidate" ] && HOST_GL="$candidate" && break
|
|
done
|
|
|
|
STUB_C=$(mktemp /tmp/gl_stub_XXXXXX.c)
|
|
echo "/* $TARGET GL/GLX stub - for cross-compilation only */" > "$STUB_C"
|
|
echo "void __cross_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 target's dynamic linker.
|
|
LD_LINUX=$SYSROOT/lib/$LD_SO
|
|
if [ -f "$LD_LINUX" ]; then
|
|
mkdir -p /lib64
|
|
ln -sf "$LD_LINUX" /lib64/$LD_SO
|
|
echo "Created /lib64/$LD_SO -> $LD_LINUX"
|
|
fi
|
|
|
|
echo ""
|
|
echo "Setup complete."
|
|
echo "Build: ./b.sh --$TARGET"
|
|
echo "Run: qemu-$TARGET -L $SYSROOT <binary>"
|
|
echo " (after setup the /lib64 symlink lets you run $TARGET binaries directly)"
|