From 84839dec382d2ac6799194650f194b02db50a616 Mon Sep 17 00:00:00 2001 From: crueter Date: Wed, 28 Jan 2026 23:54:49 +0100 Subject: [PATCH] [cmake] add a `YUZU_STATIC_ROOM` option (#3411) Lets you build ONLY the necessary targets to get a statically linked room executable. Only intended to be used on musl targets due to getaddrinfo et al. Signed-off-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3411 Reviewed-by: MaranBr --- CMakeLists.txt | 144 +++++++++++++++--------- externals/CMakeLists.txt | 66 ++++++----- src/CMakeLists.txt | 31 ++--- src/common/logging/text_formatter.cpp | 2 + src/yuzu_room_standalone/CMakeLists.txt | 10 +- 5 files changed, 151 insertions(+), 102 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 147d175989..f1bd5d75b4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,6 +41,37 @@ if (PLATFORM_NETBSD) set(ENV{PKG_CONFIG_PATH} "${PKG_CONFIG_PATH}:${CMAKE_SYSROOT}/usr/pkg/lib/ffmpeg7/pkgconfig") endif() +cmake_dependent_option(YUZU_STATIC_ROOM "Build a static room executable only (CI only)" OFF "PLATFORM_LINUX" OFF) +if (YUZU_STATIC_ROOM) + set(YUZU_ROOM ON) + set(YUZU_ROOM_STANDALONE ON) + + # disable e v e r y t h i n g + set(ENABLE_QT OFF) + set(ENABLE_SDL2 OFF) + set(YUZU_CMD OFF) + set(ENABLE_CUBEB OFF) + set(ENABLE_UPDATE_CHECKER OFF) + set(USE_DISCORD_PRESENCE OFF) + set(BUILD_TESTING OFF) + set(ENABLE_OPENSSL OFF) + set(ENABLE_WEB_SERVICE OFF) + set(ENABLE_LIBUSB OFF) + + # allow static libs for boost and mbedtls though + set(Boost_USE_STATIC_LIBS ON) + set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") + set(MBEDTLS_LIB_SUFFIX "_static") + set(YUZU_USE_CPM ON) + + set(zstd_FORCE_BUNDLED ON) + set(fmt_FORCE_BUNDLED ON) +endif() + +# common network mbedtls +# common: xbyak? booost fmt lz4 zstd +# network: enet boost + # qt stuff option(ENABLE_QT "Enable the Qt frontend" ON) option(ENABLE_QT_TRANSLATION "Enable translations for the Qt frontend" OFF) @@ -226,11 +257,9 @@ endif() option(ENABLE_OPENSSL "Enable OpenSSL backend for ISslConnection" ${DEFAULT_ENABLE_OPENSSL}) -if (ENABLE_OPENSSL) - set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL OFF) - if (EXT_DEFAULT OR PLATFORM_SUN) - set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL ON) - endif() +set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL OFF) +if (EXT_DEFAULT OR PLATFORM_SUN) + set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL ON) endif() cmake_dependent_option(YUZU_USE_BUNDLED_OPENSSL "Download bundled OpenSSL build" ${DEFAULT_YUZU_USE_BUNDLED_OPENSSL} "ENABLE_OPENSSL" OFF) @@ -420,16 +449,6 @@ if (YUZU_USE_CPM) add_library(lz4::lz4 ALIAS lz4_static) endif() - # nlohmann - AddJsonPackage(nlohmann) - - # zlib - AddJsonPackage(zlib) - - if (ZLIB_ADDED) - add_library(ZLIB::ZLIB ALIAS zlibstatic) - endif() - # zstd AddJsonPackage(zstd) @@ -438,19 +457,31 @@ if (YUZU_USE_CPM) add_library(zstd::libzstd ALIAS libzstd_static) endif() - # Opus - AddJsonPackage(opus) + if (NOT YUZU_STATIC_ROOM) + # nlohmann + AddJsonPackage(nlohmann) - if (Opus_ADDED) - if (MSVC AND CXX_CLANG) - target_compile_options(opus PRIVATE - -Wno-implicit-function-declaration - ) + # zlib + AddJsonPackage(zlib) + + if (ZLIB_ADDED) + add_library(ZLIB::ZLIB ALIAS zlibstatic) endif() - endif() - if (NOT TARGET Opus::opus) - add_library(Opus::opus ALIAS opus) + # Opus + AddJsonPackage(opus) + + if (Opus_ADDED) + if (MSVC AND CXX_CLANG) + target_compile_options(opus PRIVATE + -Wno-implicit-function-declaration + ) + endif() + endif() + + if (NOT TARGET Opus::opus) + add_library(Opus::opus ALIAS opus) + endif() endif() else() # TODO: we can probably just use CPM for this... right? @@ -537,47 +568,50 @@ message(STATUS "Platform Libraries: ${PLATFORM_LIBRARIES}") add_subdirectory(externals) # pass targets from externals -find_package(libusb) -find_package(VulkanMemoryAllocator) find_package(enet) find_package(MbedTLS) -find_package(VulkanUtilityLibraries) -find_package(SimpleIni) -find_package(SPIRV-Tools) -find_package(sirit) -find_package(gamemode) -find_package(mcl) - -if (ARCHITECTURE_riscv64) - find_package(biscuit) -endif() if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64) find_package(xbyak) endif() -if (ENABLE_WEB_SERVICE OR ENABLE_UPDATE_CHECKER) - find_package(cpp-jwt) -endif() +if (NOT YUZU_STATIC_ROOM) + find_package(libusb) + find_package(VulkanMemoryAllocator) + find_package(VulkanUtilityLibraries) + find_package(SimpleIni) + find_package(SPIRV-Tools) + find_package(sirit) + find_package(gamemode) + find_package(mcl) -if (ARCHITECTURE_arm64 OR DYNARMIC_TESTS) - find_package(oaknut) -endif() + if (ARCHITECTURE_riscv64) + find_package(biscuit) + endif() -if (ENABLE_SDL2) - find_package(SDL2) -endif() + if (ENABLE_WEB_SERVICE OR ENABLE_UPDATE_CHECKER) + find_package(cpp-jwt) + endif() -if (USE_DISCORD_PRESENCE) - find_package(DiscordRPC) -endif() + if (ARCHITECTURE_arm64 OR DYNARMIC_TESTS) + find_package(oaknut) + endif() -if (ENABLE_CUBEB) - find_package(cubeb) -endif() + if (ENABLE_SDL2) + find_package(SDL2) + endif() -if (YUZU_TESTS OR DYNARMIC_TESTS) - find_package(Catch2) + if (USE_DISCORD_PRESENCE) + find_package(DiscordRPC) + endif() + + if (ENABLE_CUBEB) + find_package(cubeb) + endif() + + if (YUZU_TESTS OR DYNARMIC_TESTS) + find_package(Catch2) + endif() endif() # Qt stuff @@ -658,7 +692,7 @@ if (ENABLE_QT) set_target_properties(Qt6::Platform PROPERTIES INTERFACE_COMPILE_FEATURES "") endif() -if (NOT (YUZU_USE_BUNDLED_FFMPEG OR YUZU_USE_EXTERNAL_FFMPEG)) +if (NOT YUZU_STATIC_ROOM AND NOT (YUZU_USE_BUNDLED_FFMPEG OR YUZU_USE_EXTERNAL_FFMPEG)) # Use system installed FFmpeg find_package(FFmpeg REQUIRED QUIET COMPONENTS ${FFmpeg_COMPONENTS}) diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 6851016a07..271e49caaa 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later # SPDX-FileCopyrightText: 2016 Citra Emulator Project @@ -34,19 +34,6 @@ if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64) endif() endif() -# Oaknut -if (ARCHITECTURE_arm64 OR DYNARMIC_TESTS) - AddJsonPackage(oaknut) -endif() - -# biscuit -if (ARCHITECTURE_riscv64) - AddJsonPackage(biscuit) -endif() - -# mcl -AddJsonPackage(mcl) - # enet AddJsonPackage(enet) @@ -61,6 +48,41 @@ endif() # mbedtls AddJsonPackage(mbedtls) +# stb +add_library(stb stb/stb_dxt.cpp) +target_include_directories(stb PUBLIC ./stb) + +if (NOT TARGET stb::headers) + add_library(stb::headers ALIAS stb) +endif() + +# ItaniumDemangle +if (NOT TARGET LLVM::Demangle) + add_library(demangle demangle/ItaniumDemangle.cpp) + target_include_directories(demangle PUBLIC ./demangle) + if (NOT MSVC) + target_compile_options(demangle PRIVATE -Wno-deprecated-declarations) # std::is_pod + endif() + add_library(LLVM::Demangle ALIAS demangle) +endif() + +if (YUZU_STATIC_ROOM) + return() +endif() + +# Oaknut +if (ARCHITECTURE_arm64 OR DYNARMIC_TESTS) + AddJsonPackage(oaknut) +endif() + +# biscuit +if (ARCHITECTURE_riscv64) + AddJsonPackage(biscuit) +endif() + +# mcl +AddJsonPackage(mcl) + # VulkanUtilityHeaders - pulls in headers and utility libs AddJsonPackage(vulkan-utility-headers) @@ -243,22 +265,6 @@ endif() # TZDB (Time Zone Database) add_subdirectory(nx_tzdb) -if (NOT TARGET LLVM::Demangle) - add_library(demangle demangle/ItaniumDemangle.cpp) - target_include_directories(demangle PUBLIC ./demangle) - if (NOT MSVC) - target_compile_options(demangle PRIVATE -Wno-deprecated-declarations) # std::is_pod - endif() - add_library(LLVM::Demangle ALIAS demangle) -endif() - -add_library(stb stb/stb_dxt.cpp) -target_include_directories(stb PUBLIC ./stb) - -if (NOT TARGET stb::headers) - add_library(stb::headers ALIAS stb) -endif() - add_library(tz tz/tz/tz.cpp) target_include_directories(tz PUBLIC ./tz) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6cafe4882a..014134c14e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -7,7 +7,7 @@ include_directories(.) # Dynarmic -if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) +if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64 AND NOT YUZU_STATIC_ROOM) add_subdirectory(dynarmic) add_library(dynarmic::dynarmic ALIAS dynarmic) endif() @@ -201,19 +201,29 @@ else() endif() add_subdirectory(common) -add_subdirectory(core) -add_subdirectory(audio_core) -add_subdirectory(video_core) -add_subdirectory(hid_core) add_subdirectory(network) -add_subdirectory(input_common) -add_subdirectory(frontend_common) -add_subdirectory(shader_recompiler) if (YUZU_ROOM) add_subdirectory(dedicated_room) endif() +if (YUZU_ROOM_STANDALONE) + add_subdirectory(yuzu_room_standalone) + set_target_properties(yuzu-room PROPERTIES OUTPUT_NAME "eden-room") +endif() + +if (YUZU_STATIC_ROOM) + return() +endif() + +add_subdirectory(core) +add_subdirectory(audio_core) +add_subdirectory(video_core) +add_subdirectory(hid_core) +add_subdirectory(input_common) +add_subdirectory(frontend_common) +add_subdirectory(shader_recompiler) + if (YUZU_TESTS) add_subdirectory(tests) endif() @@ -223,11 +233,6 @@ if (ENABLE_SDL2 AND YUZU_CMD) set_target_properties(yuzu-cmd PROPERTIES OUTPUT_NAME "eden-cli") endif() -if (YUZU_ROOM_STANDALONE) - add_subdirectory(yuzu_room_standalone) - set_target_properties(yuzu-room PROPERTIES OUTPUT_NAME "eden-room") -endif() - if (ENABLE_QT) add_definitions(-DYUZU_QT_WIDGETS) add_subdirectory(qt_common) diff --git a/src/common/logging/text_formatter.cpp b/src/common/logging/text_formatter.cpp index 092001e224..68b84d0e1b 100644 --- a/src/common/logging/text_formatter.cpp +++ b/src/common/logging/text_formatter.cpp @@ -25,6 +25,8 @@ namespace Common::Log { // Some IDEs prefer : instead, so let's just do that :) std::string FormatLogMessage(const Entry& entry) { + if (!entry.filename) return ""; + auto const time_seconds = uint32_t(entry.timestamp.count() / 1000000); auto const time_fractional = uint32_t(entry.timestamp.count() % 1000000); char const* class_name = GetLogClassName(entry.log_class); diff --git a/src/yuzu_room_standalone/CMakeLists.txt b/src/yuzu_room_standalone/CMakeLists.txt index f1db470495..125c7c911d 100644 --- a/src/yuzu_room_standalone/CMakeLists.txt +++ b/src/yuzu_room_standalone/CMakeLists.txt @@ -1,9 +1,7 @@ -# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later -add_executable(yuzu_room_standalone - yuzu_room_standalone.cpp -) +add_executable(yuzu_room_standalone yuzu_room_standalone.cpp) set_target_properties(yuzu_room_standalone PROPERTIES OUTPUT_NAME "eden-room") @@ -13,4 +11,8 @@ if(UNIX AND NOT APPLE) install(TARGETS yuzu_room_standalone RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}/bin") endif() +if (YUZU_STATIC_ROOM) + target_link_options(yuzu_room_standalone PRIVATE "-static") +endif() + create_target_directory_groups(yuzu_room_standalone)