Browse Source

cross compile instructions; ignore toolchain files

Signed-off-by: lizzie <lizzie@eden-emu.dev>
dynarmic-ppc64
lizzie 2 months ago
parent
commit
27e274a9f3
No known key found for this signature in database GPG Key ID: 287378CADCAB13
  1. 1
      .gitignore
  2. 32
      docs/CrossCompile.md
  3. 1
      externals/powah/powah_emit.hpp
  4. 3
      src/dynarmic/src/dynarmic/backend/ppc64/code_block.h
  5. 1
      tools/README.md
  6. 86
      tools/setup-cross-sysroot.sh

1
.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

32
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
```

1
externals/powah/powah_emit.hpp

@ -8,6 +8,7 @@
#include <ranges>
#include <bit>
#include <utility>
#include <sys/mman.h>
//#ifndef __cpp_lib_unreachable
namespace std {

3
src/dynarmic/src/dynarmic/backend/ppc64/code_block.h

@ -4,6 +4,7 @@
#pragma once
#include <cstdint>
#include <cstdio>
#include <new>
#include <sys/mman.h>
@ -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 {

1
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

86
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 <name> Specify the target architecture (default: ppc64)
--os <name> Specify the OS sysroot to use (default: freebsd)
--sysroot <path> 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
Loading…
Cancel
Save