From 27e274a9f32b2788d416b5949fba8ae2305f4fd9 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sun, 2 Nov 2025 22:27:01 +0000 Subject: [PATCH] cross compile instructions; ignore toolchain files Signed-off-by: lizzie --- .gitignore | 1 + docs/CrossCompile.md | 32 ++----- externals/powah/powah_emit.hpp | 1 + .../src/dynarmic/backend/ppc64/code_block.h | 3 +- tools/README.md | 1 + tools/setup-cross-sysroot.sh | 86 +++++++++++++++++++ 6 files changed, 98 insertions(+), 26 deletions(-) create mode 100755 tools/setup-cross-sysroot.sh diff --git a/.gitignore b/.gitignore index d070d94681..2e8f9d0edb 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ log.txt # Generated source files src/common/scm_rev.cpp dist/english_plurals/generated_en.ts +*-toolchain.cmake # Project/editor files *.swp diff --git a/docs/CrossCompile.md b/docs/CrossCompile.md index 03a1cc85ff..2c7bcf654d 100644 --- a/docs/CrossCompile.md +++ b/docs/CrossCompile.md @@ -13,34 +13,16 @@ A painless guide for cross compilation (or to test NCE) from a x86_64 system wit This is a guide for FreeBSD users mainly. -Now you got a PowerPC sysroot - quickly decompress it somewhere, say `/home/user/opt/powerpc64le`. +Now you got a PowerPC sysroot - quickly decompress it somewhere, say `/home/user/opt/powerpc64le`. Create a toolchain file, for example `powerpc64le-toolchain.cmake`; always [consult the manual](https://man.freebsd.org/cgi/man.cgi?query=cmake-toolchains&sektion=7&manpath=FreeBSD+13.2-RELEASE+and+Ports). -```sh -fetch https://download.freebsd.org/ftp/releases/powerpc/powerpc64le/14.3-RELEASE/base.txz -mkdir -p ~/opt/powerpc64le/sysroot -mkdir -p ~/opt/powerpc64le/staging -cd ~/opt/powerpc64le/sysroot -tar -xvzf base.txz -``` - -Create a toolchain file, for example `powerpc64le-toolchain.cmake`; always [consult the manual](https://man.freebsd.org/cgi/man.cgi?query=cmake-toolchains&sektion=7&manpath=FreeBSD+13.2-RELEASE+and+Ports). - -```sh -set(CMAKE_SYSROOT "$ENV{HOME}/opt/powerpc64le/sysroot") -set(CMAKE_STAGING_PREFIX "$ENV{HOME}/opt/powerpc64le/sysroot") - -set(CMAKE_C_COMPILER /usr/bin/clang) -set(CMAKE_CXX_COMPILER /usr/bin/clang++) -set(CMAKE_C_FLAGS "--target=ppc64le-pc-freebsd") -set(CMAKE_CXX_FLAGS "--target=ppc64le-pc-freebsd") - -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) -``` +There is a script to automatically do all of this under `./tools/setup-cross-sysroot.sh` Specify: - `YUZU_USE_CPM`: Set this to `ON` so packages can be found and built if your sysroot doesn't have them. - `YUZU_USE_EXTERNAL_FFMPEG`: Set this to `ON` as well. +Then run using a program such as QEMU to emulate userland syscalls: + +```sh +cmake --build build-ppc64-pc-freebsd -t dynarmic_tests -- -j8 && qemu-ppc64-static -L $HOME/opt/ppc64-freebsd/sysroot ./build-ppc64-pc-freebsd/bin/dynarmic_tests +``` diff --git a/externals/powah/powah_emit.hpp b/externals/powah/powah_emit.hpp index d10fc835ff..82cb2450c9 100644 --- a/externals/powah/powah_emit.hpp +++ b/externals/powah/powah_emit.hpp @@ -8,6 +8,7 @@ #include #include #include +#include //#ifndef __cpp_lib_unreachable namespace std { diff --git a/src/dynarmic/src/dynarmic/backend/ppc64/code_block.h b/src/dynarmic/src/dynarmic/backend/ppc64/code_block.h index 3877b9c13f..063863100f 100644 --- a/src/dynarmic/src/dynarmic/backend/ppc64/code_block.h +++ b/src/dynarmic/src/dynarmic/backend/ppc64/code_block.h @@ -4,6 +4,7 @@ #pragma once #include +#include #include #include @@ -15,7 +16,7 @@ namespace Dynarmic::Backend::PPC64 { class CodeBlock { public: explicit CodeBlock(std::size_t size) noexcept : memsize(size) { - mem = (u8*)mmap(nullptr, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0); + mem = (u8*)mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); ASSERT(mem != nullptr); } ~CodeBlock() noexcept { diff --git a/tools/README.md b/tools/README.md index 767892e7ac..b3b011def0 100644 --- a/tools/README.md +++ b/tools/README.md @@ -13,6 +13,7 @@ Tools for Eden and other subprojects. - `shellcheck.sh`: Ensure POSIX compliance (and syntax sanity) for all tools in this directory and subdirectories. - `llvmpipe-run.sh`: Sets environment variables needed to run any command (or Eden) with llvmpipe. - `optimize-assets.sh`: Optimizes PNG assets with OptiPng. +- `setup-cross-sysroot.sh`: Allows to quickly create a sysroot of a given system for cross compilation (experimental). - `update-cpm.sh`: Updates CPM.cmake to the latest version. - `update-icons.sh`: Rebuild all icons (macOS, Windows, bitmaps) based on the master SVG file (`dist/dev.eden_emu.eden.svg`) * Also optimizes the master SVG diff --git a/tools/setup-cross-sysroot.sh b/tools/setup-cross-sysroot.sh new file mode 100755 index 0000000000..746197d911 --- /dev/null +++ b/tools/setup-cross-sysroot.sh @@ -0,0 +1,86 @@ +#!/bin/sh -e +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + +die() { + echo "$@" >&2 + exit 1 +} +help() { + cat << EOF +--arch Specify the target architecture (default: ppc64) +--os Specify the OS sysroot to use (default: freebsd) +--sysroot Specify sysroot to use +EOF +} + +TARGET_ARCH="ppc64" +TARGET_OS="freebsd" +TARGET_CMAKE="$TARGET_ARCH-pc-$TARGET_OS" +BASE_DIR="$PWD" + +while true; do + case "$1" in + --arch) shift; TARGET_ARCH=$1; [ -z "$TARGET_ARCH" ] && die "Expected argument";; + --os) shift; TARGET_OS=$1; [ -z "$TARGET_OS" ] && die "Expected argument";; + --sysroot) shift; SYSROOT=$1; [ -z "$SYSROOT" ] && die "Expected argument";; + --help) help "$@";; + --*) die "Invalid option $1" ;; + "$0" | "") break;; + esac + shift +done + +[ -z "$SYSROOT" ] && SYSROOT="$HOME/opt/$TARGET_ARCH-$TARGET_OS/sysroot" +mkdir -p "$SYSROOT" && cd "$SYSROOT" +case "$TARGET_OS" in +freebsd*) + case "$TARGET_ARCH" in + ppc64pe) URL="https://download.freebsd.org/ftp/releases/powerpc/powerpc64pe/14.3-RELEASE/base.txz" break;; + ppc64le) URL="https://download.freebsd.org/ftp/releases/powerpc/powerpc64le/14.3-RELEASE/base.txz" break;; + ppc64) URL="https://download.freebsd.org/ftp/releases/powerpc/powerpc64/14.3-RELEASE/base.txz" break;; + ppc) URL="https://download.freebsd.org/ftp/releases/powerpc/powerpc/14.3-RELEASE/base.txz" break;; + amd64 | x86_64) URL="https://download.freebsd.org/ftp/releases/amd64/14.3-RELEASE/base.txz" break;; + arm64*) URL="https://download.freebsd.org/ftp/releases/arm64/$TARGET_ARCH/14.3-RELEASE/base.txz" break;; + arm*) URL="https://download.freebsd.org/ftp/releases/arm/$TARGET_ARCH/14.3-RELEASE/base.txz" break;; + *) die "Unknown arch $TARGET_ARCH" break;; + esac + [ -z "$TARGET_CMAKE" ] && TARGET_CMAKE="$TARGET_ARCH-pc-$TARGET_OS" + [ -f "base.txz" ] || fetch "$URL" || die "Can't download" + tar -xvzf base.txz + break;; +*) die "Unknown OS $TARGET_OS" break;; +esac + +[ -z "$CC" ] && CC=$(which clang) +[ -z "$CXX" ] && CXX=$(which clang++) + +TOOLCHAIN_FILE="$BASE_DIR/$TARGET_CMAKE-toolchain.cmake" +cat << EOF >"$TOOLCHAIN_FILE" +# Script to generate .cmake toolchain files :) +# See https://man.freebsd.org/cgi/man.cgi?query=cmake-toolchains&sektion=7&manpath=FreeBSD+13.2-RELEASE+and+Ports + +set(CMAKE_SYSROOT "$SYSROOT") +set(CMAKE_STAGING_PREFIX "$SYSROOT") + +set(CMAKE_C_COMPILER $CC) +set(CMAKE_CXX_COMPILER $CXX) +set(CMAKE_C_FLAGS "--target=$TARGET_CMAKE") +set(CMAKE_CXX_FLAGS "--target=$TARGET_CMAKE") + +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) +EOF + +# cmake \ +# -DCMAKE_TOOLCHAIN_FILE="$TOOLCHAIN_FILE" \ +# -DCMAKE_BUILD_TYPE=Release \ +# -B "build-$TARGET_CMAKE" \ +# -DDYNARMIC_TESTS=ON \ +# -DENABLE_QT=OFF \ +# -DENABLE_SDL2=OFF \ +# -DYUZU_USE_CPM=ON \ +# -DYUZU_USE_EXTERNAL_FFMPEG=ON +#cmake --build "build-$TARGET_CMAKE" dynarmic_tests -- -j8