[cmake] Build presets and System profiles
All checks were successful
eden-license / license-header (pull_request) Successful in 30s

- Build Preset (Linux only): enables arch optimizations, e.g. generic,
  v3, zen2/4, armv8, armv9
- System Profiles: currently only steamdeck, uses an older sdl commit to
  fix virtual gamepad bug

Signed-off-by: crueter <crueter@eden-emu.dev>
This commit is contained in:
crueter 2025-07-26 15:59:09 -04:00
parent 12d8cf79ea
commit 780f058d69
6 changed files with 102 additions and 54 deletions

View file

@ -3,47 +3,53 @@
# SPDX-FileCopyrightText: 2025 eden Emulator Project # SPDX-FileCopyrightText: 2025 eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
case "$1" in case "$1" in
amd64|"") amd64 | "")
echo "Making amd64-v3 optimized build of Eden" echo "Making amd64-v3 optimized build of Eden"
ARCH="amd64_v3" ARCH="amd64_v3"
ARCH_FLAGS="-march=x86-64-v3" ARCH_FLAGS="-march=x86-64-v3"
;; export EXTRA_CMAKE_FLAGS=(-DYUZU_BUILD_PRESET=v3)
steamdeck|zen2) ;;
echo "Making Steam Deck (Zen 2) optimized build of Eden" steamdeck | zen2)
ARCH="steamdeck" echo "Making Steam Deck (Zen 2) optimized build of Eden"
ARCH_FLAGS="-march=znver2 -mtune=znver2" ARCH="steamdeck"
;; ARCH_FLAGS="-march=znver2 -mtune=znver2"
rog-ally|allyx|zen4) export EXTRA_CMAKE_FLAGS=(-DYUZU_BUILD_PRESET=zen2 -DYUZU_SYSTEM_PROFILE=steamdeck)
echo "Making ROG Ally X (Zen 4) optimized build of Eden" ;;
ARCH="rog-ally-x" rog-ally | allyx | zen4)
ARCH_FLAGS="-march=znver4 -mtune=znver4" echo "Making ROG Ally X (Zen 4) optimized build of Eden"
;; ARCH="rog-ally-x"
legacy) ARCH_FLAGS="-march=znver4 -mtune=znver4"
echo "Making amd64 generic build of Eden" export EXTRA_CMAKE_FLAGS=(-DYUZU_BUILD_PRESET=zen2 -DYUZU_SYSTEM_PROFILE=steamdeck)
ARCH=amd64 ;;
ARCH_FLAGS="-march=x86-64 -mtune=generic" legacy)
;; echo "Making amd64 generic build of Eden"
aarch64) ARCH=amd64
echo "Making armv8-a build of Eden" ARCH_FLAGS="-march=x86-64 -mtune=generic"
ARCH=aarch64 export EXTRA_CMAKE_FLAGS=(-DYUZU_BUILD_PRESET=generic)
ARCH_FLAGS="-march=armv8-a -mtune=generic -w" ;;
;; aarch64)
armv9) echo "Making armv8-a build of Eden"
echo "Making armv9-a build of Eden" ARCH=aarch64
ARCH=armv9 ARCH_FLAGS="-march=armv8-a -mtune=generic -w"
ARCH_FLAGS="-march=armv9-a -mtune=generic -w" export EXTRA_CMAKE_FLAGS=(-DYUZU_BUILD_PRESET=generic)
;; ;;
native) armv9)
echo "Making native build of Eden" echo "Making armv9-a build of Eden"
ARCH="$(uname -m)" ARCH=armv9
ARCH_FLAGS="-march=native -mtune=native" ARCH_FLAGS="-march=armv9-a -mtune=generic -w"
;; export EXTRA_CMAKE_FLAGS=(-DYUZU_BUILD_PRESET=armv9)
*) ;;
echo "Invalid target $1 specified, must be one of native, amd64, steamdeck, zen2, allyx, rog-ally, zen4, legacy, aarch64, armv9" native)
exit 1 echo "Making native build of Eden"
;; ARCH="$(uname -m)"
ARCH_FLAGS="-march=native -mtune=native"
export EXTRA_CMAKE_FLAGS=(-DYUZU_BUILD_PRESET=native)
;;
*)
echo "Invalid target $1 specified, must be one of native, amd64, steamdeck, zen2, allyx, rog-ally, zen4, legacy, aarch64, armv9"
exit 1
;;
esac esac
export ARCH_FLAGS="$ARCH_FLAGS -O3" export ARCH_FLAGS="$ARCH_FLAGS -O3"
@ -55,10 +61,10 @@ fi
if [ "$1" != "" ]; then shift; fi if [ "$1" != "" ]; then shift; fi
if [ "$TARGET" = "appimage" ]; then if [ "$TARGET" = "appimage" ]; then
export EXTRA_CMAKE_FLAGS=(-DCMAKE_INSTALL_PREFIX=/usr -DYUZU_ROOM=ON -DYUZU_ROOM_STANDALONE=OFF -DYUZU_CMD=OFF) export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" -DCMAKE_INSTALL_PREFIX=/usr -DYUZU_ROOM=ON -DYUZU_ROOM_STANDALONE=OFF -DYUZU_CMD=OFF)
else else
# For the linux-fresh verification target, verify compilation without PCH as well. # For the linux-fresh verification target, verify compilation without PCH as well.
export EXTRA_CMAKE_FLAGS=(-DYUZU_USE_PRECOMPILED_HEADERS=OFF) export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" -DYUZU_USE_PRECOMPILED_HEADERS=OFF)
fi fi
if [ "$DEVEL" != "true" ]; then if [ "$DEVEL" != "true" ]; then
@ -86,7 +92,7 @@ export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" $@)
mkdir -p build && cd build mkdir -p build && cd build
cmake .. -G Ninja \ cmake .. -G Ninja \
-DCMAKE_BUILD_TYPE="$BUILD_TYPE" \ -DCMAKE_BUILD_TYPE="$BUILD_TYPE" \
-DENABLE_QT_TRANSLATION=ON \ -DENABLE_QT_TRANSLATION=ON \
-DUSE_DISCORD_PRESENCE=ON \ -DUSE_DISCORD_PRESENCE=ON \
-DCMAKE_CXX_FLAGS="$ARCH_FLAGS" \ -DCMAKE_CXX_FLAGS="$ARCH_FLAGS" \
-DCMAKE_C_FLAGS="$ARCH_FLAGS" \ -DCMAKE_C_FLAGS="$ARCH_FLAGS" \
@ -99,12 +105,12 @@ cmake .. -G Ninja \
-DYUZU_USE_QT_WEB_ENGINE=$WEBENGINE \ -DYUZU_USE_QT_WEB_ENGINE=$WEBENGINE \
-DYUZU_USE_FASTER_LD=ON \ -DYUZU_USE_FASTER_LD=ON \
-DYUZU_ENABLE_LTO=ON \ -DYUZU_ENABLE_LTO=ON \
"${EXTRA_CMAKE_FLAGS[@]}" "${EXTRA_CMAKE_FLAGS[@]}"
ninja -j${NPROC} ninja -j${NPROC}
if [ -d "bin/Release" ]; then if [ -d "bin/Release" ]; then
strip -s bin/Release/* strip -s bin/Release/*
else else
strip -s bin/* strip -s bin/*
fi fi

View file

@ -92,7 +92,6 @@ chmod +x ./sharun-aio
xvfb-run -a ./sharun-aio l -p -v -e -s -k \ xvfb-run -a ./sharun-aio l -p -v -e -s -k \
../$BUILDDIR/bin/eden* \ ../$BUILDDIR/bin/eden* \
$LIBDIR/lib*GL*.so* \ $LIBDIR/lib*GL*.so* \
$LIBDIR/libSDL2*.so* \
$LIBDIR/dri/* \ $LIBDIR/dri/* \
$LIBDIR/vdpau/* \ $LIBDIR/vdpau/* \
$LIBDIR/libvulkan* \ $LIBDIR/libvulkan* \

3
.gitmodules vendored
View file

@ -16,9 +16,6 @@
[submodule "opus"] [submodule "opus"]
path = externals/opus path = externals/opus
url = https://github.com/xiph/opus.git url = https://github.com/xiph/opus.git
[submodule "SDL"]
path = externals/SDL
url = https://github.com/libsdl-org/SDL.git
[submodule "cpp-httplib"] [submodule "cpp-httplib"]
path = externals/cpp-httplib path = externals/cpp-httplib
url = https://github.com/yhirose/cpp-httplib.git url = https://github.com/yhirose/cpp-httplib.git

View file

@ -33,9 +33,9 @@ endif()
option(ENABLE_SDL2 "Enable the SDL2 frontend" ON) option(ENABLE_SDL2 "Enable the SDL2 frontend" ON)
CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 binaries" ON "ENABLE_SDL2;MSVC" OFF) CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 binaries" ON "ENABLE_SDL2;MSVC" OFF)
if (${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD") if (${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD")
CMAKE_DEPENDENT_OPTION(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" OFF "ENABLE_SDL2;NOT MSVC" OFF) CMAKE_DEPENDENT_OPTION(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" OFF "ENABLE_SDL2;NOT MSVC" OFF)
else() else()
CMAKE_DEPENDENT_OPTION(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" ON "ENABLE_SDL2;NOT MSVC" OFF) CMAKE_DEPENDENT_OPTION(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" ON "ENABLE_SDL2;NOT MSVC" OFF)
endif() endif()
cmake_dependent_option(ENABLE_LIBUSB "Enable the use of LibUSB" ON "NOT ANDROID" OFF) cmake_dependent_option(ENABLE_LIBUSB "Enable the use of LibUSB" ON "NOT ANDROID" OFF)
@ -332,6 +332,41 @@ if (YUZU_ROOM)
add_definitions(-DYUZU_ROOM) add_definitions(-DYUZU_ROOM)
endif() endif()
# Build/optimization presets
if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
if (ARCHITECTURE_x86_64)
set(YUZU_BUILD_PRESET "generic" CACHE STRING "Build preset to use. One of: generic, v3, zen2, zen4, native")
if (${YUZU_BUILD_PRESET} STREQUAL "generic")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=x86-64 -mtune=generic")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=x86-64 -mtune=generic")
elseif (${YUZU_BUILD_PRESET} STREQUAL "v3")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=x86-64-v3 -mtune=generic")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=x86-64-v3 -mtune=generic")
elseif (${YUZU_BUILD_PRESET} STREQUAL "zen2")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=znver2 -mtune=znver2")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=znver2 -mtune=znver2")
elseif (${YUZU_BUILD_PRESET} STREQUAL "zen4")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=znver4 -mtune=znver4")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=znver4 -mtune=znver4")
elseif (${YUZU_BUILD_PRESET} STREQUAL "native")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native -mtune=native")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=native -mtune=native")
endif()
elseif(ARCHITECTURE_arm64)
set(YUZU_BUILD_PRESET "generic" CACHE STRING "Build preset to use. One of: generic, armv9")
if (${YUZU_BUILD_PRESET} STREQUAL "generic")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8-a -mtune=generic")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8-a -mtune=generic")
elseif (${YUZU_BUILD_PRESET} STREQUAL "armv9")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv9-a -mtune=generic")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv9-a -mtune=generic")
endif()
endif()
endif()
# Other presets, e.g. steamdeck
set(YUZU_SYSTEM_PROFILE "generic" CACHE STRING "CMake and Externals profile to use. One of: generic, steamdeck")
# Configure C++ standard # Configure C++ standard
# =========================== # ===========================
@ -420,6 +455,7 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Linux" OR ANDROID)
endif() endif()
# find SDL2 exports a bunch of variables that are needed, so its easier to do this outside of the YUZU_find_package # find SDL2 exports a bunch of variables that are needed, so its easier to do this outside of the YUZU_find_package
# TODO(crueter): combine this all with CPM.
if (ENABLE_SDL2) if (ENABLE_SDL2)
if (YUZU_USE_BUNDLED_SDL2) if (YUZU_USE_BUNDLED_SDL2)
# Detect toolchain and platform # Detect toolchain and platform

View file

@ -83,7 +83,18 @@ if (YUZU_USE_EXTERNAL_SDL2)
set(SDL_FILE ON) set(SDL_FILE ON)
endif() endif()
add_subdirectory(SDL) include(CPM)
set(CPM_SOURCE_CACHE ${CMAKE_SOURCE_DIR}/.cache/cpm)
set(CPM_USE_LOCAL_PACKAGES OFF)
if ("${YUZU_SYSTEM_PROFILE}" STREQUAL "steamdeck")
set(SDL_HASH cc016b0046)
set(SDL_PIPEWIRE OFF) # build errors out with this on
else()
set(SDL_HASH 2e4c12cd2c)
endif()
CPMAddPackage("gh:libsdl-org/SDL#${SDL_HASH}")
endif() endif()
# ENet # ENet

1
externals/SDL vendored

@ -1 +0,0 @@
Subproject commit 2e4c12cd2cb2c5d0b60ef2196b400339591e733c