aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrueter <crueter@eden-emu.dev>2025-08-11 22:27:29 +0200
committercrueter <crueter@eden-emu.dev>2025-08-11 22:27:29 +0200
commit1551387739959d4a0ba23767a21664ea9a860848 (patch)
tree49c4b555e6c8418ad8ada5db2ed142d54063f6ed
parent3f02d7713f1bfb36245486019bc014ecc49a1b19 (diff)
[cmake, frontend] feat: CPMUtil + dependency viewer (#238)
- creates a CPMUtil.cmake module that makes my job 10x easier and removes boilerplate - also lets us generate dependency names/versions at compiletime, thus letting the frontend display each dependency's versions. Signed-off-by: crueter <crueter@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/238
-rw-r--r--CMakeLists.txt39
-rw-r--r--CMakeModules/CPMUtil.cmake117
-rw-r--r--CMakeModules/DownloadExternals.cmake14
-rw-r--r--CMakeModules/GenerateDepHashes.cmake21
-rw-r--r--externals/CMakeLists.txt209
-rw-r--r--externals/ffmpeg/CMakeLists.txt15
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/common/CMakeLists.txt3
-rw-r--r--src/dep_hashes.h.in20
-rw-r--r--src/dynarmic/externals/CMakeLists.txt42
-rw-r--r--src/network/announce_multiplayer_session.cpp12
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp2
-rw-r--r--src/video_core/CMakeLists.txt4
-rw-r--r--src/video_core/vulkan_common/vulkan_device.cpp4
-rw-r--r--src/yuzu/CMakeLists.txt4
-rw-r--r--src/yuzu/aboutdialog.ui2
-rw-r--r--src/yuzu/deps_dialog.cpp121
-rw-r--r--src/yuzu/deps_dialog.h41
-rw-r--r--src/yuzu/deps_dialog.ui166
-rw-r--r--src/yuzu/externals/CMakeLists.txt12
-rw-r--r--src/yuzu/main.cpp9
-rw-r--r--src/yuzu/main.h1
-rw-r--r--src/yuzu/main.ui6
-rwxr-xr-xtools/cpm-hash.sh7
24 files changed, 690 insertions, 183 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index a364821734..f654ac7d46 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -216,14 +216,14 @@ if (YUZU_USE_BUNDLED_VCPKG)
list(APPEND VCPKG_MANIFEST_FEATURES "android")
endif()
- include(CPM)
- set(CPM_USE_LOCAL_PACKAGES OFF)
+ include(CPMUtil)
- CPMAddPackage(
+ AddPackage(
+ NAME vcpkg
DOWNLOAD_ONLY YES
- GIT_REPOSITORY "https://github.com/microsoft/vcpkg.git"
+ URL "https://github.com/microsoft/vcpkg.git"
GIT_TAG "ea2a964f93"
- CUSTOM_CACHE_KEY "ea2a"
+ SHA "ea2a964f93"
)
include(${vcpkg_SOURCE_DIR}/scripts/buildsystems/vcpkg.cmake)
@@ -277,6 +277,30 @@ function(check_submodules_present)
message(FATAL_ERROR "Git submodule ${module} not found. "
"Please run: \ngit submodule update --init --recursive")
endif()
+
+ set(SUBMODULE_DIR "${PROJECT_SOURCE_DIR}/${module}")
+
+ execute_process(
+ COMMAND git rev-parse --short=10 HEAD
+ WORKING_DIRECTORY ${SUBMODULE_DIR}
+ OUTPUT_VARIABLE SUBMODULE_SHA
+ )
+
+ # would probably be better to do string parsing, but whatever
+ execute_process(
+ COMMAND git remote get-url origin
+ WORKING_DIRECTORY ${SUBMODULE_DIR}
+ OUTPUT_VARIABLE SUBMODULE_URL
+ )
+
+ string(REGEX REPLACE "\n|\r" "" SUBMODULE_SHA ${SUBMODULE_SHA})
+ string(REGEX REPLACE "\n|\r|\\.git" "" SUBMODULE_URL ${SUBMODULE_URL})
+
+ get_filename_component(SUBMODULE_NAME ${SUBMODULE_DIR} NAME)
+
+ set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_NAMES ${SUBMODULE_NAME})
+ set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS ${SUBMODULE_SHA})
+ set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_URLS ${SUBMODULE_URL})
endforeach()
endfunction()
@@ -453,7 +477,7 @@ if (ENABLE_SDL2)
endif()
if (DEFINED SDL2_VER)
- download_bundled_external("sdl2/" ${SDL2_VER} "sdl2-bundled" SDL2_PREFIX)
+ download_bundled_external("sdl2/" ${SDL2_VER} "sdl2-bundled" SDL2_PREFIX 2.32.8)
endif()
set(SDL2_FOUND YES)
@@ -584,7 +608,7 @@ endif()
if (WIN32 AND YUZU_CRASH_DUMPS)
set(BREAKPAD_VER "breakpad-c89f9dd")
- download_bundled_external("breakpad/" ${BREAKPAD_VER} "breakpad-win" BREAKPAD_PREFIX)
+ download_bundled_external("breakpad/" ${BREAKPAD_VER} "breakpad-win" BREAKPAD_PREFIX "c89f9dd")
set(BREAKPAD_CLIENT_INCLUDE_DIR "${BREAKPAD_PREFIX}/include")
set(BREAKPAD_CLIENT_LIBRARY "${BREAKPAD_PREFIX}/lib/libbreakpad_client.lib")
@@ -722,7 +746,6 @@ else()
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT yuzu-cmd)
endif()
-
# Installation instructions
# =========================
diff --git a/CMakeModules/CPMUtil.cmake b/CMakeModules/CPMUtil.cmake
new file mode 100644
index 0000000000..bd1a15b0cc
--- /dev/null
+++ b/CMakeModules/CPMUtil.cmake
@@ -0,0 +1,117 @@
+# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# Created-By: crueter
+# Docs will come at a later date, mostly this is to just reduce boilerplate
+# and some cmake magic to allow for runtime viewing of dependency versions
+
+cmake_minimum_required(VERSION 3.22)
+include(CPM)
+
+function(AddPackage)
+ cpm_set_policies()
+
+ set(oneValueArgs
+ NAME
+ VERSION
+ REPO
+ SHA
+ HASH
+ KEY
+ URL # Only for custom non-GitHub urls
+ DOWNLOAD_ONLY
+ FIND_PACKAGE_ARGUMENTS
+ SYSTEM_PACKAGE
+ BUNDLED_PACKAGE
+ )
+
+ set(multiValueArgs OPTIONS PATCHES)
+
+ cmake_parse_arguments(PKG_ARGS "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}")
+
+ if (NOT DEFINED PKG_ARGS_NAME)
+ message(FATAL_ERROR "CPMUtil: No package name defined")
+ endif()
+
+ if (NOT DEFINED PKG_ARGS_URL)
+ if (DEFINED PKG_ARGS_REPO AND DEFINED PKG_ARGS_SHA)
+ set(PKG_GIT_URL https://github.com/${PKG_ARGS_REPO})
+ set(PKG_URL "${PKG_GIT_URL}/archive/${PKG_ARGS_SHA}.zip")
+ else()
+ message(FATAL_ERROR "CPMUtil: No custom URL and no repository + sha defined")
+ endif()
+ else()
+ set(PKG_URL ${PKG_ARGS_URL})
+ set(PKG_GIT_URL ${PKG_URL})
+ endif()
+
+ message(STATUS "CPMUtil: Downloading package ${PKG_ARGS_NAME} from ${PKG_URL}")
+
+ if (NOT DEFINED PKG_ARGS_KEY)
+ if (DEFINED PKG_ARGS_SHA)
+ string(SUBSTRING ${PKG_ARGS_SHA} 0 4 PKG_KEY)
+ message(STATUS "CPMUtil: No custom key defined, using ${PKG_KEY} from sha")
+ else()
+ message(FATAL_ERROR "CPMUtil: No custom key and no commit sha defined")
+ endif()
+ else()
+ set(PKG_KEY ${PKG_ARGS_KEY})
+ endif()
+
+ if (DEFINED PKG_ARGS_HASH)
+ set(PKG_HASH "SHA512=${PKG_ARGS_HASH}")
+ endif()
+
+ # Default behavior is bundled
+ if (DEFINED PKG_ARGS_SYSTEM_PACKAGE)
+ set(CPM_USE_LOCAL_PACKAGES ${PKG_ARGS_SYSTEM_PACKAGE})
+ elseif (DEFINED PKG_ARGS_BUNDLED_PACKAGE)
+ if (PKG_ARGS_BUNDLED_PACKAGE)
+ set(CPM_USE_LOCAL_PACKAGES OFF)
+ else()
+ set(CPM_USE_LOCAL_PACKAGES ON)
+ endif()
+ else()
+ set(CPM_USE_LOCAL_PACKAGES OFF)
+ endif()
+
+ CPMAddPackage(
+ NAME ${PKG_ARGS_NAME}
+ VERSION ${PKG_ARGS_VERSION}
+ URL ${PKG_URL}
+ URL_HASH ${PKG_HASH}
+ CUSTOM_CACHE_KEY ${PKG_KEY}
+ DOWNLOAD_ONLY ${PKG_ARGS_DOWNLOAD_ONLY}
+ FIND_PACKAGE_ARGUMENTS ${PKG_ARGS_FIND_PACKAGE_ARGUMENTS}
+
+ OPTIONS ${PKG_ARGS_OPTIONS}
+ PATCHES ${PKG_ARGS_PATCHES}
+
+ ${PKG_ARGS_UNPARSED_ARGUMENTS}
+ )
+
+ set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_NAMES ${PKG_ARGS_NAME})
+ set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_URLS ${PKG_GIT_URL})
+
+ if (${PKG_ARGS_NAME}_ADDED)
+ if (DEFINED PKG_ARGS_SHA)
+ set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS ${PKG_ARGS_SHA})
+ elseif(DEFINED PKG_ARGS_VERSION)
+ set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS ${PKG_ARGS_VERSION})
+ else()
+ message(WARNING "CPMUtil: Package ${PKG_ARGS_NAME} has no specified sha or version")
+ set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS "unknown")
+ endif()
+ else()
+ if (DEFINED CPM_PACKAGE_${PKG_ARGS_NAME}_VERSION)
+ set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS "${CPM_PACKAGE_${PKG_ARGS_NAME}_VERSION} (system)")
+ else()
+ set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS "unknown (system)")
+ endif()
+ endif()
+
+ # pass stuff to parent scope
+ set(${PKG_ARGS_NAME}_ADDED "${${PKG_ARGS_NAME}_ADDED}" PARENT_SCOPE)
+ set(${PKG_ARGS_NAME}_SOURCE_DIR "${${PKG_ARGS_NAME}_SOURCE_DIR}" PARENT_SCOPE)
+ set(${PKG_ARGS_NAME}_BINARY_DIR "${${PKG_ARGS_NAME}_BINARY_DIR}" PARENT_SCOPE)
+endfunction()
diff --git a/CMakeModules/DownloadExternals.cmake b/CMakeModules/DownloadExternals.cmake
index d4c1042740..62cf2689ab 100644
--- a/CMakeModules/DownloadExternals.cmake
+++ b/CMakeModules/DownloadExternals.cmake
@@ -6,7 +6,7 @@
# remote_path: path to the file to download, relative to the remote repository root
# prefix_var: name of a variable which will be set with the path to the extracted contents
set(CURRENT_MODULE_DIR ${CMAKE_CURRENT_LIST_DIR})
-function(download_bundled_external remote_path lib_name cpm_key prefix_var)
+function(download_bundled_external remote_path lib_name cpm_key prefix_var version)
set(package_base_url "https://github.com/eden-emulator/")
set(package_repo "no_platform")
set(package_extension "no_platform")
@@ -29,13 +29,13 @@ function(download_bundled_external remote_path lib_name cpm_key prefix_var)
set(package_url "${package_base_url}${package_repo}")
set(full_url ${package_url}${remote_path}${lib_name}${package_extension})
- set(CPM_USE_LOCAL_PACKAGES OFF)
-
- CPMAddPackage(
+ AddPackage(
NAME ${cpm_key}
+ VERSION ${version}
URL ${full_url}
DOWNLOAD_ONLY YES
- CUSTOM_CACHE_KEY ${CACHE_KEY}
+ KEY ${CACHE_KEY}
+ # TODO(crueter): hash
)
set(${prefix_var} "${${cpm_key}_SOURCE_DIR}" PARENT_SCOPE)
@@ -46,11 +46,11 @@ function(download_win_archives)
set(FORCE_WIN_ARCHIVES ON)
set(FFmpeg_EXT_NAME "ffmpeg-7.1.1")
- download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" "")
+ download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" "" 7.1.1)
# TODO(crueter): separate handling for arm64
set(SDL2_VER "SDL2-2.32.8")
- download_bundled_external("sdl2/" ${SDL2_VER} "sdl2-bundled" "")
+ download_bundled_external("sdl2/" ${SDL2_VER} "sdl2-bundled" "" 2.32.8)
set(FORCE_WIN_ARCHIVES OFF)
endfunction()
diff --git a/CMakeModules/GenerateDepHashes.cmake b/CMakeModules/GenerateDepHashes.cmake
new file mode 100644
index 0000000000..d0d59bd22f
--- /dev/null
+++ b/CMakeModules/GenerateDepHashes.cmake
@@ -0,0 +1,21 @@
+# SPDX-FileCopyrightText: 2025 Eden Emulator Project
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+get_property(NAMES GLOBAL PROPERTY CPM_PACKAGE_NAMES)
+get_property(SHAS GLOBAL PROPERTY CPM_PACKAGE_SHAS)
+get_property(URLS GLOBAL PROPERTY CPM_PACKAGE_URLS)
+
+list(LENGTH NAMES DEPS_LENGTH)
+
+list(JOIN NAMES "\",\n\t\"" DEP_NAME_DIRTY)
+set(DEP_NAMES "\t\"${DEP_NAME_DIRTY}\"")
+
+list(JOIN SHAS "\",\n\t\"" DEP_SHAS_DIRTY)
+set(DEP_SHAS "\t\"${DEP_SHAS_DIRTY}\"")
+
+list(JOIN URLS "\",\n\t\"" DEP_URLS_DIRTY)
+set(DEP_URLS "\t\"${DEP_URLS_DIRTY}\"")
+
+configure_file(dep_hashes.h.in dep_hashes.h @ONLY)
+target_sources(common PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/dep_hashes.h)
+target_include_directories(common PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt
index 13e81b11b6..6e5f0d22ab 100644
--- a/externals/CMakeLists.txt
+++ b/externals/CMakeLists.txt
@@ -5,7 +5,7 @@
# SPDX-License-Identifier: GPL-2.0-or-later
# cpm
-include(CPM)
+include(CPMUtil)
# Explicitly declare this option here to propagate to the oaknut CPM call
option(DYNARMIC_TESTS "Build tests" ${BUILD_TESTING})
@@ -29,8 +29,6 @@ endif()
# Xbyak (also used by Dynarmic, so needs to be added first)
if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
- set(CPM_USE_LOCAL_PACKAGES OFF)
-
if ("${CMAKE_SYSTEM_NAME}" STREQUAL "SunOS")
# Fix regset.h collisions
set(XBYAK_HASH 51f507b0b3)
@@ -40,22 +38,22 @@ if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
set(XBYAK_SHA512SUM 5824e92159e07fa36a774aedd3b3ef3541d0241371d522cffa4ab3e1f215fa5097b1b77865b47b2481376c704fa079875557ea463ca63d0a7fd6a8a20a589e70)
endif()
- CPMAddPackage(
+ AddPackage(
NAME xbyak
- URL "https://github.com/Lizzie841/xbyak/archive/${XBYAK_HASH}.zip"
- URL_HASH SHA512=${XBYAK_SHA512SUM}
- CUSTOM_CACHE_KEY ${XBYAK_HASH}
+ REPO "Lizzie841/xbyak"
+ SHA ${XBYAK_HASH}
+ HASH ${XBYAK_SHA512SUM}
)
endif()
# Oaknut (also used by Dynarmic, so needs to be added first)
if (ARCHITECTURE_arm64 OR DYNARMIC_TESTS)
- CPMAddPackage(
+ AddPackage(
NAME oaknut
VERSION 2.0.1
- URL "https://github.com/merryhime/oaknut/archive/94c726ce03.zip"
- URL_HASH SHA512=d8d082242fa1881abce3c82f8dafa002c4e561e66a69e7fc038af67faa5eff2630f082d3d19579c88c4c9f9488e54552accc8cb90e7ce743efe043b6230c08ac
- CUSTOM_CACHE_KEY "94c7"
+ REPO "merryhime/oaknut"
+ SHA 94c726ce03
+ HASH d8d082242fa1881abce3c82f8dafa002c4e561e66a69e7fc038af67faa5eff2630f082d3d19579c88c4c9f9488e54552accc8cb90e7ce743efe043b6230c08ac
)
endif()
@@ -69,15 +67,14 @@ add_subdirectory(glad)
# mbedtls
# TODO(crueter): test local mbedtls
-set(CPM_USE_LOCAL_PACKAGES ON)
-
-CPMAddPackage(
+AddPackage(
NAME mbedtls
- URL "https://github.com/Mbed-TLS/mbedtls/archive/8c88150ca1.zip"
- URL_HASH SHA512=769ad1e94c570671071e1f2a5c0f1027e0bf6bcdd1a80ea8ac970f2c86bc45ce4e31aa88d6d8110fc1bed1de81c48bc624df1b38a26f8b340a44e109d784a966
+ REPO "Mbed-TLS/mbedtls"
+ SHA "8c88150ca1"
+ HASH 769ad1e94c570671071e1f2a5c0f1027e0bf6bcdd1a80ea8ac970f2c86bc45ce4e31aa88d6d8110fc1bed1de81c48bc624df1b38a26f8b340a44e109d784a966
PATCHES
${CMAKE_SOURCE_DIR}/.patch/mbedtls/0001-cmake-version.patch
- CUSTOM_CACHE_KEY "8c88"
+ SYSTEM_PACKAGE ON
)
if (mbedtls_ADDED)
@@ -131,11 +128,12 @@ if (YUZU_USE_EXTERNAL_SDL2)
set(SDL_SHA512SUM d95af47f469a312876f8ab361074a1e7b8083db19935a102d9c6e5887ace6008e64475a8c54b00164b40cad86492bb1b2366084efdd0b2555e5fea6d9c5da80e)
endif()
- CPMAddPackage(
+ AddPackage(
NAME SDL2
- URL "https://github.com/libsdl-org/SDL/archive/${SDL_HASH}.zip"
- URL_HASH SHA512=${SDL_SHA512SUM}
- CUSTOM_CACHE_KEY "${YUZU_SYSTEM_PROFILE}"
+ REPO "libsdl-org/SDL"
+ SHA ${SDL_HASH}
+ HASH ${SDL_SHA512SUM}
+ KEY ${YUZU_SYSTEM_PROFILE}
)
endif()
@@ -146,18 +144,17 @@ if (NOT TARGET enet::enet)
add_library(enet::enet ALIAS enet)
endif()
-# TODO(crueter): Create a common CPMUtil.cmake that does this for me
-set(CPM_USE_LOCAL_PACKAGES ON)
-
-CPMAddPackage(
+AddPackage(
NAME cubeb
- URL "https://github.com/mozilla/cubeb/archive/fa02160712.zip"
+ REPO "mozilla/cubeb"
+ SHA fa02160712
+ HASH 82d808356752e4064de48c8fecbe7856715ade1e76b53937116bf07129fc1cc5b3de5e4b408de3cd000187ba8dc32ca4109661cb7e0355a52e54bd81b9be1c61
FIND_PACKAGE_ARGUMENTS "CONFIG" # not sure this works outside of gentoo
OPTIONS
"USE_SANITIZERS OFF"
"BUILD_TESTS OFF"
"BUILD_TOOLS OFF"
- CUSTOM_CACHE_KEY "fa02"
+ SYSTEM_PACKAGE ON
)
if (cubeb_ADDED)
@@ -184,19 +181,17 @@ endif()
# DiscordRPC
if (USE_DISCORD_PRESENCE)
- set(CPM_USE_LOCAL_PACKAGES OFF)
-
- CPMAddPackage(
+ AddPackage(
NAME discord-rpc
- URL "https://github.com/discord/discord-rpc/archive/963aa9f3e5.zip"
- URL_HASH SHA512=386e1344e9a666d730f2d335ee3aef1fd05b1039febefd51aa751b705009cc764411397f3ca08dffd46205c72f75b235c870c737b2091a4ed0c3b061f5919bde
+ REPO "discord/discord-rpc"
+ SHA 963aa9f3e5
+ HASH 386e1344e9a666d730f2d335ee3aef1fd05b1039febefd51aa751b705009cc764411397f3ca08dffd46205c72f75b235c870c737b2091a4ed0c3b061f5919bde
OPTIONS
"BUILD_EXAMPLES OFF"
PATCHES
${CMAKE_SOURCE_DIR}/.patch/discord-rpc/0001-cmake-version.patch
${CMAKE_SOURCE_DIR}/.patch/discord-rpc/0002-no-clang-format.patch
${CMAKE_SOURCE_DIR}/.patch/discord-rpc/0003-fix-cpp17.patch
- CUSTOM_CACHE_KEY "963a"
)
target_include_directories(discord-rpc INTERFACE ${discord-rpc_SOURCE_DIR}/include)
@@ -205,76 +200,68 @@ endif()
# Sirit
# TODO(crueter): spirv-tools doesn't work w/ system
-set(CPM_USE_LOCAL_PACKAGES OFF)
-
-CPMAddPackage(
+AddPackage(
NAME SPIRV-Headers
- URL "https://github.com/KhronosGroup/SPIRV-Headers/archive/4e209d3d7e.zip"
- URL_HASH SHA512=f48bbe18341ed55ea0fe280dbbbc0a44bf222278de6e716e143ca1e95ca320b06d4d23d6583fbf8d03e1428f3dac8fa00e5b82ddcd6b425e6236d85af09550a4
- CUSTOM_CACHE_KEY "4e20"
+ REPO "KhronosGroup/SPIRV-Headers"
+ SHA 4e209d3d7e
+ HASH f48bbe18341ed55ea0fe280dbbbc0a44bf222278de6e716e143ca1e95ca320b06d4d23d6583fbf8d03e1428f3dac8fa00e5b82ddcd6b425e6236d85af09550a4
)
-set(CPM_USE_LOCAL_PACKAGES ON)
-
-CPMAddPackage(
+AddPackage(
NAME sirit
- URL "https://github.com/raphaelthegreat/sirit/archive/51fcf9720f.zip"
- URL_HASH SHA512=a8f98ea0c51763b89924d836ad482ebdfe9130251cf4e14733ccaacc885ae8cc4c8b03d1dc43e8861609e5f7929c16f935879c1f6bf61866fd75077954774394
+ REPO "eden-emulator/sirit"
+ SHA db1f1e8ab5
+ HASH 73eb3a042848c63a10656545797e85f40d142009dfb7827384548a385e1e28e1ac72f42b25924ce530d58275f8638554281e884d72f9c7aaf4ed08690a414b05
OPTIONS
"SIRIT_USE_SYSTEM_SPIRV_HEADERS ON"
- CUSTOM_CACHE_KEY "51fc"
+ SYSTEM_PACKAGE ON
)
# httplib
if ((ENABLE_WEB_SERVICE OR ENABLE_QT_UPDATE_CHECKER))
- set(CPM_USE_LOCAL_PACKAGES ${YUZU_USE_SYSTEM_HTTPLIB})
-
- # TODO(crueter): fix local package (gentoo?)
- CPMAddPackage(
+ AddPackage(
NAME httplib
VERSION 0.12
- URL "https://github.com/yhirose/cpp-httplib/archive/a609330e4c.zip"
- URL_HASH SHA512=dd3fd0572f8367d8549e1319fd98368b3e75801a293b0c3ac9b4adb806473a4506a484b3d389dc5bee5acc460cb90af7a20e5df705a1696b56496b30b9ce7ed2
+ REPO "yhirose/cpp-httplib"
+ SHA a609330e4c
+ HASH dd3fd0572f8367d8549e1319fd98368b3e75801a293b0c3ac9b4adb806473a4506a484b3d389dc5bee5acc460cb90af7a20e5df705a1696b56496b30b9ce7ed2
FIND_PACKAGE_ARGUMENTS "MODULE"
OPTIONS
"HTTPLIB_REQUIRE_OPENSSL ON"
- CUSTOM_CACHE_KEY "a609"
+ SYSTEM_PACKAGE ${YUZU_USE_SYSTEM_HTTPLIB}
)
endif()
# cpp-jwt
if (ENABLE_WEB_SERVICE)
- set(CPM_USE_LOCAL_PACKAGES OFF)
-
- CPMAddPackage(
+ AddPackage(
NAME cpp-jwt
VERSION 1.4
- URL "https://github.com/arun11299/cpp-jwt/archive/10ef5735d8.zip"
- URL_HASH SHA512=ebba3d26b33a3b0aa909f475e099594560edbce10ecd03e76d7fea68549a28713ea606d363808f88a5495b62c54c3cdb7e47aee2d946eceabd36e310479dadb7
+ REPO "arun11299/cpp-jwt"
+ SHA 10ef5735d8
+ HASH ebba3d26b33a3b0aa909f475e099594560edbce10ecd03e76d7fea68549a28713ea606d363808f88a5495b62c54c3cdb7e47aee2d946eceabd36e310479dadb7
FIND_PACKAGE_ARGUMENTS "CONFIG"
OPTIONS
"CPP_JWT_BUILD_EXAMPLES OFF"
"CPP_JWT_BUILD_TESTS OFF"
"CPP_JWT_USE_VENDORED_NLOHMANN_JSON OFF"
- CUSTOM_CACHE_KEY "10ef"
)
endif()
# Opus
-set(CPM_USE_LOCAL_PACKAGES ${YUZU_USE_SYSTEM_OPUS})
-
-CPMAddPackage(
+AddPackage(
NAME Opus
VERSION 1.3
- URL "https://github.com/xiph/opus/archive/5ded705cf4.zip"
- URL_HASH SHA512=0dc89e58ddda1f3bc6a7037963994770c5806c10e66f5cc55c59286fc76d0544fe4eca7626772b888fd719f434bc8a92f792bdb350c807968b2ac14cfc04b203
+ REPO "xiph/opus"
+ SHA 5ded705cf4
+ HASH 0dc89e58ddda1f3bc6a7037963994770c5806c10e66f5cc55c59286fc76d0544fe4eca7626772b888fd719f434bc8a92f792bdb350c807968b2ac14cfc04b203
FIND_PACKAGE_ARGUMENTS "MODULE"
OPTIONS
"OPUS_BUILD_TESTING OFF"
"OPUS_BUILD_PROGRAMS OFF"
"OPUS_INSTALL_PKG_CONFIG_MODULE OFF"
"OPUS_INSTALL_CMAKE_CONFIG_MODULE OFF"
- CUSTOM_CACHE_KEY "5ded"
+ SYSTEM_PACKAGE ${YUZU_USE_SYSTEM_OPUS}
)
# FFMpeg
@@ -290,31 +277,36 @@ endif()
if (YUZU_USE_EXTERNAL_VULKAN_HEADERS)
set(CPM_USE_LOCAL_PACKAGES OFF)
else()
- set(CPM_USE_LOCAL_PACKAGES ON)
+ set(CPM_USE_LOCAL_PACKAGES OFF)
endif()
-# TODO(crueter): System vk-headers are too new for externals vk-util
+# TODO(crueter): Vk1.4 impl
-CPMAddPackage(
+# TODO(crueter): allow sys packages?
+AddPackage(
NAME VulkanHeaders
VERSION 1.3.274
- URL "https://github.com/KhronosGroup/Vulkan-Headers/archive/89268a6d17.zip"
- URL_HASH SHA512=3ab349f74298ba72cafb8561015690c0674d428a09fb91ccd3cd3daca83650d190d46d33fd97b0a8fd4223fe6df2bcabae89136fbbf7c0bfeb8776f9448304c8
- CUSTOM_CACHE_KEY "8926"
+ REPO "KhronosGroup/Vulkan-Headers"
+ SHA 89268a6d17
+ HASH 3ab349f74298ba72cafb8561015690c0674d428a09fb91ccd3cd3daca83650d190d46d33fd97b0a8fd4223fe6df2bcabae89136fbbf7c0bfeb8776f9448304c8
+ BUNDLED_PACKAGE ${YUZU_USE_EXTERNAL_VULKAN_HEADERS}
)
-# Vulkan-Utility-Libraries
-if (YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES)
- set(CPM_USE_LOCAL_PACKAGES OFF)
-else()
- set(CPM_USE_LOCAL_PACKAGES ON)
+# CMake's interface generator sucks
+if (VulkanHeaders_ADDED)
+ target_include_directories(Vulkan-Headers INTERFACE ${VulkanHeaders_SOURCE_DIR}/include)
endif()
-CPMAddPackage(
+set(VulkanHeaders_SOURCE_DIR "${VulkanHeaders_SOURCE_DIR}" PARENT_SCOPE)
+set(VulkanHeaders_ADDED "${VulkanHeaders_ADDED}" PARENT_SCOPE)
+
+# Vulkan-Utility-Libraries
+AddPackage(
NAME VulkanUtilityLibraries
- URL "https://github.com/KhronosGroup/Vulkan-Utility-Libraries/archive/df2e358152.zip"
- URL_HASH SHA512=3e468c3d9ff93f6d418d71e5527abe0a12c8c7ab5b0b52278bbbee4d02bb87e99073906729b727e0147242b7e3fd5dedf68b803f1878cb4c0e4f730bc2238d79
- CUSTOM_CACHE_KEY "df2e"
+ REPO "KhronosGroup/Vulkan-Utility-Libraries"
+ SHA df2e358152
+ HASH 3e468c3d9ff93f6d418d71e5527abe0a12c8c7ab5b0b52278bbbee4d02bb87e99073906729b727e0147242b7e3fd5dedf68b803f1878cb4c0e4f730bc2238d79
+ BUNDLED_PACKAGE ${YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES}
)
set(VulkanUtilityLibraries_SOURCE_DIR "${VulkanUtilityLibraries_SOURCE_DIR}" PARENT_SCOPE)
@@ -322,38 +314,35 @@ set(VulkanUtilityLibraries_ADDED "${VulkanUtilityLibraries_ADDED}" PARENT_SCOPE)
# SPIRV-Tools
if (YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS)
- CPMAddPackage(
+ AddPackage(
NAME SPIRV-Tools
- URL "https://github.com/KhronosGroup/SPIRV-Tools/archive/40eb301f32.zip"
- URL_HASH SHA512=58d0fb1047d69373cf24c73e6f78c73a72a6cca3b4df1d9f083b9dcc0962745ef154abf3dbe9b3623b835be20c6ec769431cf11733349f45e7568b3525f707aa
+ REPO "KhronosGroup/SPIRV-Tools"
+ SHA 40eb301f32
+ HASH 58d0fb1047d69373cf24c73e6f78c73a72a6cca3b4df1d9f083b9dcc0962745ef154abf3dbe9b3623b835be20c6ec769431cf11733349f45e7568b3525f707aa
OPTIONS
"SPIRV_SKIP_EXECUTABLES ON"
- CUSTOM_CACHE_KEY "40eb"
)
endif()
# Boost headers
-set(CPM_USE_LOCAL_PACKAGES OFF)
-
-CPMAddPackage(
+AddPackage(
NAME boost_headers
- URL "https://github.com/boostorg/headers/archive/0456900fad.zip"
- URL_HASH SHA512=50cd75dcdfc5f082225cdace058f47b4fb114a47585f7aee1d22236a910a80b667186254c214fa2fcebac67ae6d37ba4b6e695e1faea8affd6fd42a03cf996e3
- CUSTOM_CACHE_KEY "0456"
+ REPO "boostorg/headers"
+ SHA 0456900fad
+ HASH 50cd75dcdfc5f082225cdace058f47b4fb114a47585f7aee1d22236a910a80b667186254c214fa2fcebac67ae6d37ba4b6e695e1faea8affd6fd42a03cf996e3
)
# TZDB (Time Zone Database)
add_subdirectory(nx_tzdb)
# VMA
-set(CPM_USE_LOCAL_PACKAGES ON)
-
-CPMAddPackage(
+AddPackage(
NAME VulkanMemoryAllocator
- URL "https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator/archive/1076b348ab.zip"
- URL_HASH SHA512=a46b44e4286d08cffda058e856c47f44c7fed3da55fe9555976eb3907fdcc20ead0b1860b0c38319cda01dbf9b1aa5d4b4038c7f1f8fbd97283d837fa9af9772
+ REPO "GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator"
+ SHA 1076b348ab
+ HASH a46b44e4286d08cffda058e856c47f44c7fed3da55fe9555976eb3907fdcc20ead0b1860b0c38319cda01dbf9b1aa5d4b4038c7f1f8fbd97283d837fa9af9772
FIND_PACKAGE_ARGUMENTS "CONFIG"
- CUSTOM_CACHE_KEY "1076"
+ # SYSTEM_PACKAGE ON
)
set(VulkanMemoryAllocator_SOURCE_DIR "${VulkanMemoryAllocator_SOURCE_DIR}" PARENT_SCOPE)
@@ -389,15 +378,13 @@ endif()
if (ANDROID)
if (ARCHITECTURE_arm64)
- set(CPM_USE_LOCAL_PACKAGES OFF)
-
- CPMAddPackage(
+ AddPackage(
NAME libadrenotools
- URL "https://github.com/bylaws/libadrenotools/archive/8fae8ce254.zip"
- URL_HASH SHA512=c74fa855f0edebbf25c9bce40b00966daa2447bfc5e15f0cf1a95f86cbf70fc6b02590707edbde16328a0a2a4fb9a1fc419d2dfc22a4a4150971be91892d4edb
+ REPO "bylaws/libadrenotools"
+ SHA 8fae8ce254
+ HASH c74fa855f0edebbf25c9bce40b00966daa2447bfc5e15f0cf1a95f86cbf70fc6b02590707edbde16328a0a2a4fb9a1fc419d2dfc22a4a4150971be91892d4edb
PATCHES
${CMAKE_SOURCE_DIR}/.patch/libadrenotools/0001-linkerns-cpm.patch
- CUSTOM_CACHE_KEY "8fae"
)
endif()
endif()
@@ -422,13 +409,12 @@ if (YUZU_CRASH_DUMPS AND NOT TARGET libbreakpad_client)
_CRT_NONSTDC_NO_DEPRECATE
)
- set(CPM_USE_LOCAL_PACKAGES OFF)
- CPMAddPackage(
+ AddPackage(
NAME breakpad
- URL "https://github.com/google/breakpad/archive/f80f288803.zip"
- URL_HASH SHA512=4a87ee88cea99bd633d52a5b00135a649f1475e3b65db325a6df9c804ab82b054ad7e62419b35f6e22cc5dfbbb569214041d7ad5d10fab10106e700bb5050e1d
+ URL "google/breakpad"
+ SHA f80f288803
+ HASH 4a87ee88cea99bd633d52a5b00135a649f1475e3b65db325a6df9c804ab82b054ad7e62419b35f6e22cc5dfbbb569214041d7ad5d10fab10106e700bb5050e1d
DOWNLOAD_ONLY YES
- CUSTOM_CACHE_KEY "f80f"
)
# libbreakpad
@@ -528,14 +514,11 @@ endif()
# oboe
if (ANDROID)
- set(CPM_USE_LOCAL_PACKAGES ON)
- CPMAddPackage(
+ AddPackage(
NAME oboe
- URL "https://github.com/google/oboe/archive/2bc873e53c.zip"
- URL_HASH SHA512=02329058a7f9cf7d5039afaae5ab170d9f42f60f4c01e21eaf4f46073886922b057a9ae30eeac040b3ac182f51b9c1bfe9fe1050a2c9f6ce567a1a9a0ec2c768
- OPTIONS
- "SPIRV_SKIP_EXECUTABLES ON"
- CUSTOM_CACHE_KEY "2bc8"
+ REPO "google/oboe"
+ SHA 2bc873e53c
+ HASH 02329058a7f9cf7d5039afaae5ab170d9f42f60f4c01e21eaf4f46073886922b057a9ae30eeac040b3ac182f51b9c1bfe9fe1050a2c9f6ce567a1a9a0ec2c768
)
add_library(oboe::oboe ALIAS oboe)
diff --git a/externals/ffmpeg/CMakeLists.txt b/externals/ffmpeg/CMakeLists.txt
index 1a2ec0e180..02ce6c1f7c 100644
--- a/externals/ffmpeg/CMakeLists.txt
+++ b/externals/ffmpeg/CMakeLists.txt
@@ -19,14 +19,11 @@ if (NOT WIN32 AND NOT ANDROID)
message(FATAL_ERROR "Required program `autoconf` not found.")
endif()
- include(CPM)
- set(CPM_USE_LOCAL_PACKAGES OFF)
-
- CPMAddPackage(
+ AddPackage(
NAME ffmpeg
- URL "https://github.com/FFmpeg/FFmpeg/archive/c2184b65d2.zip"
- URL_HASH SHA512=2a89d664119debbb3c006ab1c48d5d7f26e889f4a65ad2e25c8b0503308295123d5a9c5c78bf683aef5ff09acef8c3fc2837f22d3e8c611528b933bf03bcdd97
- CUSTOM_CACHE_KEY "c218"
+ REPO "FFmpeg/FFmpeg"
+ SHA c2184b65d2
+ HASH 2a89d664119debbb3c006ab1c48d5d7f26e889f4a65ad2e25c8b0503308295123d5a9c5c78bf683aef5ff09acef8c3fc2837f22d3e8c611528b933bf03bcdd97
)
set(FFmpeg_PREFIX ${ffmpeg_SOURCE_DIR})
@@ -243,7 +240,7 @@ elseif(ANDROID)
message(FATAL_ERROR "Unsupported architecture for Android FFmpeg")
endif()
- download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" FFmpeg_PATH)
+ download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" FFmpeg_PATH 7.1.1)
set(FFmpeg_FOUND YES)
set(FFmpeg_INCLUDE_DIR "${FFmpeg_PATH}/include" CACHE PATH "Path to FFmpeg headers" FORCE)
set(FFmpeg_LIBRARY_DIR "${FFmpeg_PATH}/lib" CACHE PATH "Path to FFmpeg library directory" FORCE)
@@ -268,7 +265,7 @@ elseif(WIN32)
# Use yuzu FFmpeg binaries
set(FFmpeg_EXT_NAME "ffmpeg-7.1.1")
- download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" FFmpeg_PATH)
+ download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" FFmpeg_PATH 7.1.1)
set(FFmpeg_FOUND YES)
set(FFmpeg_INCLUDE_DIR "${FFmpeg_PATH}/include" CACHE PATH "Path to FFmpeg headers" FORCE)
set(FFmpeg_LIBRARY_DIR "${FFmpeg_PATH}/bin" CACHE PATH "Path to FFmpeg library directory" FORCE)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index aa23f1b50e..bd1285b2bc 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -232,3 +232,5 @@ if (ANDROID)
add_subdirectory(android/app/src/main/jni)
target_include_directories(yuzu-android PRIVATE android/app/src/main)
endif()
+
+include(GenerateDepHashes)
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index f97dca2432..580f984ad8 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -159,7 +159,8 @@ add_library(
wall_clock.cpp
wall_clock.h
zstd_compression.cpp
- zstd_compression.h)
+ zstd_compression.h
+)
if(YUZU_ENABLE_PORTABLE)
add_compile_definitions(YUZU_ENABLE_PORTABLE)
diff --git a/src/dep_hashes.h.in b/src/dep_hashes.h.in
new file mode 100644
index 0000000000..cee9df0537
--- /dev/null
+++ b/src/dep_hashes.h.in
@@ -0,0 +1,20 @@
+// SPDX-FileCopyrightText: 2025 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+namespace Common {
+
+static const constexpr std::array<const char *, @DEPS_LENGTH@> dep_names = {
+@DEP_NAMES@
+};
+
+static const constexpr std::array<const char *, @DEPS_LENGTH@> dep_hashes = {
+@DEP_SHAS@
+};
+
+static const constexpr std::array<const char *, @DEPS_LENGTH@> dep_urls = {
+@DEP_URLS@
+};
+
+} // namespace Common
diff --git a/src/dynarmic/externals/CMakeLists.txt b/src/dynarmic/externals/CMakeLists.txt
index 7925744153..ce262d04d2 100644
--- a/src/dynarmic/externals/CMakeLists.txt
+++ b/src/dynarmic/externals/CMakeLists.txt
@@ -1,4 +1,4 @@
-include(CPM)
+include(CPMUtil)
# Always build externals as static libraries, even when dynarmic is built as shared
if (BUILD_SHARED_LIBS)
@@ -22,12 +22,12 @@ set(BUILD_TESTING OFF)
if ("riscv" IN_LIST ARCHITECTURE)
add_subdirectory(biscuit)
- CPMAddPackage(
+ AddPackage(
NAME biscuit
VERSION 0.9.1
- URL "https://github.com/lioncash/biscuit/archive/76b0be8dae.zip"
- URL_HASH SHA512=47d55ed02d032d6cf3dc107c6c0a9aea686d5f25aefb81d1af91db027b6815bd5add1755505e19d76625feeb17aa2db6cd1668fe0dad2e6a411519bde6ca4489
- CUSTOM_CACHE_KEY "76b0"
+ REPO "lioncash/biscuit"
+ SHA 76b0be8dae
+ HASH 47d55ed02d032d6cf3dc107c6c0a9aea686d5f25aefb81d1af91db027b6815bd5add1755505e19d76625feeb17aa2db6cd1668fe0dad2e6a411519bde6ca4489
)
endif()
@@ -49,14 +49,14 @@ if (NOT TARGET fmt::fmt)
endif()
# mcl
-CPMAddPackage(
+AddPackage(
NAME mcl
VERSION 0.1.12
- URL "https://github.com/azahar-emu/mcl/archive/7b08d83418.zip"
- URL_HASH SHA512=f943bac39c1879986decad7a442ff4288eaeca4a2907684c7914e115a55ecc43c2782ded85c0835763fe04e40d5c82220ce864423e489e648e408a84f54dc4f3
+ REPO "azahar-emu/mcl"
+ SHA 7b08d83418
+ HASH f943bac39c1879986decad7a442ff4288eaeca4a2907684c7914e115a55ecc43c2782ded85c0835763fe04e40d5c82220ce864423e489e648e408a84f54dc4f3
OPTIONS
"MCL_INSTALL OFF"
- CUSTOM_CACHE_KEY "7b08"
)
# oaknut
@@ -71,14 +71,14 @@ CPMAddPackage(
# unordered_dense
-CPMAddPackage(
+AddPackage(
NAME unordered_dense
- URL "https://github.com/Lizzie841/unordered_dense/archive/e59d30b7b1.zip"
- URL_HASH SHA512=71eff7bd9ba4b9226967bacd56a8ff000946f8813167cb5664bb01e96fb79e4e220684d824fe9c59c4d1cc98c606f13aff05b7940a1ed8ab3c95d6974ee34fa0
+ REPO "Lizzie841/unordered_dense"
+ SHA e59d30b7b1
+ HASH 71eff7bd9ba4b9226967bacd56a8ff000946f8813167cb5664bb01e96fb79e4e220684d824fe9c59c4d1cc98c606f13aff05b7940a1ed8ab3c95d6974ee34fa0
FIND_PACKAGE_ARGUMENTS "CONFIG"
OPTIONS
"UNORDERED_DENSE_INSTALL OFF"
- CUSTOM_CACHE_KEY "e59d"
)
# xbyak
@@ -93,24 +93,24 @@ CPMAddPackage(
# zydis
if ("x86_64" IN_LIST ARCHITECTURE)
- CPMAddPackage(
+ AddPackage(
NAME Zycore
- URL "https://github.com/zyantific/zycore-c/archive/75a36c45ae.zip"
- URL_HASH SHA512=15aa399f39713e042c4345bc3175c82f14dca849fde2a21d4f591f62c43e227b70d868d8bb86beb5f4eb68b1d6bd3792cdd638acf89009e787e3d10ee7401924
- CUSTOM_CACHE_KEY "75a3"
+ REPO "zyantific/zycore-c"
+ SHA 75a36c45ae
+ HASH 15aa399f39713e042c4345bc3175c82f14dca849fde2a21d4f591f62c43e227b70d868d8bb86beb5f4eb68b1d6bd3792cdd638acf89009e787e3d10ee7401924
)
- CPMAddPackage(
+ AddPackage(
NAME Zydis
VERSION 4
- URL "https://github.com/zyantific/zydis/archive/c2d2bab025.zip"
- URL_HASH SHA512=7b48f213ff7aab2926f8c9c65195959143bebbfb2b9a25051ffd8b8b0f1baf1670d9739781de674577d955925f91ac89376e16b476a03828c84e2fd765d45020
+ REPO "zyantific/zydis"
+ SHA c2d2bab025
+ HASH 7b48f213ff7aab2926f8c9c65195959143bebbfb2b9a25051ffd8b8b0f1baf1670d9739781de674577d955925f91ac89376e16b476a03828c84e2fd765d45020
OPTIONS
"ZYDIS_BUILD_TOOLS OFF"
"ZYDIS_BUILD_EXAMPLES OFF"
"ZYDIS_BUILD_DOXYGEN OFF"
"ZYAN_ZYCORE_PATH ${Zycore_SOURCE_DIR}"
"CMAKE_DISABLE_FIND_PACKAGE_Doxygen ON"
- CUSTOM_CACHE_KEY "c2d2"
)
endif()
diff --git a/src/network/announce_multiplayer_session.cpp b/src/network/announce_multiplayer_session.cpp
index 8836524c73..9d86ea378c 100644
--- a/src/network/announce_multiplayer_session.cpp
+++ b/src/network/announce_multiplayer_session.cpp
@@ -23,13 +23,13 @@ namespace Core {
static constexpr std::chrono::seconds announce_time_interval(15);
AnnounceMultiplayerSession::AnnounceMultiplayerSession() {
-//#ifdef ENABLE_WEB_SERVICE
+#ifdef ENABLE_WEB_SERVICE
backend = std::make_unique<WebService::RoomJson>(Settings::values.web_api_url.GetValue(),
Settings::values.eden_username.GetValue(),
Settings::values.eden_token.GetValue());
-//#else
-// backend = std::make_unique<AnnounceMultiplayerRoom::NullBackend>();
-//#endif
+#else
+ backend = std::make_unique<AnnounceMultiplayerRoom::NullBackend>();
+#endif
}
WebService::WebResult AnnounceMultiplayerSession::Register() {
@@ -156,11 +156,11 @@ bool AnnounceMultiplayerSession::IsRunning() const {
void AnnounceMultiplayerSession::UpdateCredentials() {
ASSERT_MSG(!IsRunning(), "Credentials can only be updated when session is not running");
-//#ifdef ENABLE_WEB_SERVICE
+#ifdef ENABLE_WEB_SERVICE
backend = std::make_unique<WebService::RoomJson>(Settings::values.web_api_url.GetValue(),
Settings::values.eden_username.GetValue(),
Settings::values.eden_token.GetValue());
-//#endif
+#endif
}
} // namespace Core
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp
index 74884ab4eb..77ff8c5731 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp
@@ -70,7 +70,7 @@ Id GetMaxThreadId(EmitContext& ctx, Id thread_id, Id clamp, Id segmentation_mask
Id SelectValue(EmitContext& ctx, Id in_range, Id value, Id src_thread_id) {
return ctx.OpSelect(
ctx.U32[1], in_range,
- ctx.OpGroupNonUniformShuffleXor(ctx.U32[1], SubgroupScope(ctx), value, src_thread_id), value);
+ ctx.OpGroupNonUniformShuffle(ctx.U32[1], SubgroupScope(ctx), value, src_thread_id), value);
}
Id AddPartitionBase(EmitContext& ctx, Id thread_id) {
diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt
index 211727be2e..eed1a73bff 100644
--- a/src/video_core/CMakeLists.txt
+++ b/src/video_core/CMakeLists.txt
@@ -337,6 +337,10 @@ if (VulkanUtilityLibraries_ADDED)
target_include_directories(video_core PUBLIC ${VulkanUtilityLibraries_SOURCE_DIR}/include)
endif()
+if (VulkanHeaders_ADDED)
+ target_include_directories(video_core PUBLIC ${VulkanHeaders_SOURCE_DIR}/include)
+endif()
+
target_link_libraries(video_core PRIVATE sirit Vulkan::Headers)
if (ENABLE_NSIGHT_AFTERMATH)
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp
index 474e420daf..fc9e78a234 100644
--- a/src/video_core/vulkan_common/vulkan_device.cpp
+++ b/src/video_core/vulkan_common/vulkan_device.cpp
@@ -974,7 +974,6 @@ bool Device::GetSuitability(bool requires_swapchain) {
// Configure properties.
VkPhysicalDeviceVulkan12Features features_1_2{};
VkPhysicalDeviceVulkan13Features features_1_3{};
- VkPhysicalDeviceVulkan14Features features_1_4{};
// Configure properties.
properties.properties = physical.GetProperties();
@@ -1053,13 +1052,10 @@ bool Device::GetSuitability(bool requires_swapchain) {
if (instance_version >= VK_API_VERSION_1_2) {
features_1_2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
features_1_3.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES;
- features_1_4.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_4_FEATURES;
features_1_2.pNext = &features_1_3;
- features_1_3.pNext = &features_1_4;
*next = &features_1_2;
- // next = &features_1_4.pNext;
}
// Test all features we know about. If the feature is not available in core at our
diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt
index 2902b695ad..fb42962840 100644
--- a/src/yuzu/CMakeLists.txt
+++ b/src/yuzu/CMakeLists.txt
@@ -238,6 +238,10 @@ add_executable(yuzu
migration_dialog.h migration_dialog.cpp
migration_worker.h
migration_worker.cpp
+
+ deps_dialog.cpp
+ deps_dialog.h
+ deps_dialog.ui
)
set_target_properties(yuzu PROPERTIES OUTPUT_NAME "eden")
diff --git a/src/yuzu/aboutdialog.ui b/src/yuzu/aboutdialog.ui
index c220472142..1fedb01814 100644
--- a/src/yuzu/aboutdialog.ui
+++ b/src/yuzu/aboutdialog.ui
@@ -11,7 +11,7 @@
</rect>
</property>
<property name="windowTitle">
- <string>About eden</string>
+ <string>About Eden</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
diff --git a/src/yuzu/deps_dialog.cpp b/src/yuzu/deps_dialog.cpp
new file mode 100644
index 0000000000..4cef05e054
--- /dev/null
+++ b/src/yuzu/deps_dialog.cpp
@@ -0,0 +1,121 @@
+// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "yuzu/deps_dialog.h"
+#include <QAbstractTextDocumentLayout>
+#include <QDesktopServices>
+#include <QIcon>
+#include <QPainter>
+#include <QTableWidget>
+#include <QTextEdit>
+#include "dep_hashes.h"
+#include "ui_deps_dialog.h"
+#include <fmt/ranges.h>
+
+DepsDialog::DepsDialog(QWidget* parent)
+ : QDialog(parent)
+ , ui{std::make_unique<Ui::DepsDialog>()}
+{
+ ui->setupUi(this);
+
+ constexpr size_t rows = Common::dep_hashes.size();
+ ui->tableDeps->setRowCount(rows);
+
+ QStringList labels;
+ labels << tr("Dependency") << tr("Version");
+
+ ui->tableDeps->setHorizontalHeaderLabels(labels);
+ ui->tableDeps->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeMode::Stretch);
+ ui->tableDeps->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeMode::Fixed);
+ ui->tableDeps->horizontalHeader()->setMinimumSectionSize(200);
+
+ for (size_t i = 0; i < rows; ++i) {
+ const std::string name = Common::dep_names.at(i);
+ const std::string sha = Common::dep_hashes.at(i);
+ const std::string url = Common::dep_urls.at(i);
+
+ std::string dependency = fmt::format("<a href=\"{}\">{}</a>", url, name);
+
+ QTableWidgetItem *nameItem = new QTableWidgetItem(QString::fromStdString(dependency));
+ QTableWidgetItem *shaItem = new QTableWidgetItem(QString::fromStdString(sha));
+
+ ui->tableDeps->setItem(i, 0, nameItem);
+ ui->tableDeps->setItem(i, 1, shaItem);
+ }
+
+ ui->tableDeps->setItemDelegateForColumn(0, new LinkItemDelegate(this));
+}
+
+DepsDialog::~DepsDialog() = default;
+
+LinkItemDelegate::LinkItemDelegate(QObject *parent)
+ : QStyledItemDelegate(parent)
+{}
+
+void LinkItemDelegate::paint(QPainter *painter,
+ const QStyleOptionViewItem &option,
+ const QModelIndex &index) const
+{
+ auto options = option;
+ initStyleOption(&options, index);
+
+ QTextDocument doc;
+ QString html = index.data(Qt::DisplayRole).toString();
+ doc.setHtml(html);
+
+ options.text.clear();
+
+ painter->save();
+ painter->translate(options.rect.topLeft());
+ doc.drawContents(painter, QRectF(0, 0, options.rect.width(), options.rect.height()));
+ painter->restore();
+}
+
+QSize LinkItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
+{
+ QStyleOptionViewItem options = option;
+ initStyleOption(&options, index);
+
+ QTextDocument doc;
+ doc.setHtml(options.text);
+ doc.setTextWidth(options.rect.width());
+ return QSize(doc.idealWidth(), doc.size().height());
+}
+
+bool LinkItemDelegate::editorEvent(QEvent *event,
+ QAbstractItemModel *model,
+ const QStyleOptionViewItem &option,
+ const QModelIndex &index)
+{
+ if (event->type() == QEvent::MouseButtonRelease) {
+ QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
+ if (mouseEvent->button() == Qt::LeftButton) {
+ QString html = index.data(Qt::DisplayRole).toString();
+ QTextDocument doc;
+ doc.setHtml(html);
+ doc.setTextWidth(option.rect.width());
+
+ // this is kinda silly but it werks
+ QAbstractTextDocumentLayout *layout = doc.documentLayout();
+
+ QPoint pos = mouseEvent->pos() - option.rect.topLeft();
+ int charPos = layout->hitTest(pos, Qt::ExactHit);
+
+ if (charPos >= 0) {
+ QTextCursor cursor(&doc);
+ cursor.setPosition(charPos);
+
+ QTextCharFormat format = cursor.charFormat();
+
+ if (format.isAnchor()) {
+ QString href = format.anchorHref();
+ if (!href.isEmpty()) {
+ QDesktopServices::openUrl(QUrl(href));
+ return true;
+ }
+ }
+ }
+ }
+ }
+ return QStyledItemDelegate::editorEvent(event, model, option, index);
+}
diff --git a/src/yuzu/deps_dialog.h b/src/yuzu/deps_dialog.h
new file mode 100644
index 0000000000..f8e7f1d987
--- /dev/null
+++ b/src/yuzu/deps_dialog.h
@@ -0,0 +1,41 @@
+// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include <QDialog>
+#include <QStyledItemDelegate>
+#include <QTableView>
+#include <memory>
+
+namespace Ui { class DepsDialog; }
+
+class DepsDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit DepsDialog(QWidget *parent);
+ ~DepsDialog() override;
+
+private:
+ std::unique_ptr<Ui::DepsDialog> ui;
+};
+
+class LinkItemDelegate : public QStyledItemDelegate
+{
+ Q_OBJECT
+
+public:
+ explicit LinkItemDelegate(QObject *parent = 0);
+
+protected:
+ void paint(QPainter *painter,
+ const QStyleOptionViewItem &option,
+ const QModelIndex &index) const override;
+ QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;
+ bool editorEvent(QEvent *event,
+ QAbstractItemModel *model,
+ const QStyleOptionViewItem &option,
+ const QModelIndex &index) override;
+};
diff --git a/src/yuzu/deps_dialog.ui b/src/yuzu/deps_dialog.ui
new file mode 100644
index 0000000000..5c539d50e2
--- /dev/null
+++ b/src/yuzu/deps_dialog.ui
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>DepsDialog</class>
+ <widget class="QDialog" name="DepsDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>701</width>
+ <height>500</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Eden Dependencies</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1">
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QLabel" name="labelLogo">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <height>200</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="../../dist/qt_themes/default/default.qrc">:/icons/default/256x256/eden.png</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Orientation::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="labelEden">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:28pt;&quot;&gt;Eden Dependencies&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelInfo">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The projects that make Eden possible&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QTableWidget" name="tableDeps">
+ <property name="editTriggers">
+ <set>QAbstractItemView::EditTrigger::NoEditTriggers</set>
+ </property>
+ <property name="alternatingRowColors">
+ <bool>true</bool>
+ </property>
+ <property name="selectionMode">
+ <enum>QAbstractItemView::SelectionMode::NoSelection</enum>
+ </property>
+ <property name="columnCount">
+ <number>2</number>
+ </property>
+ <attribute name="horizontalHeaderShowSortIndicator" stdset="0">
+ <bool>false</bool>
+ </attribute>
+ <attribute name="verticalHeaderVisible">
+ <bool>false</bool>
+ </attribute>
+ <column/>
+ <column/>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Orientation::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::StandardButton::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources>
+ <include location="../../dist/qt_themes/default/default.qrc"/>
+ </resources>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>DepsDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>20</x>
+ <y>20</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>20</x>
+ <y>20</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>DepsDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>20</x>
+ <y>20</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>20</x>
+ <y>20</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/src/yuzu/externals/CMakeLists.txt b/src/yuzu/externals/CMakeLists.txt
index d159fa9229..1ded70813b 100644
--- a/src/yuzu/externals/CMakeLists.txt
+++ b/src/yuzu/externals/CMakeLists.txt
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: GPL-3.0-or-later
# cpm
-include(CPM)
+include(CPMUtil)
# Disable tests/tools in all externals supporting the standard option name
set(BUILD_TESTING OFF)
@@ -14,11 +14,11 @@ set(BUILD_SHARED_LIBS OFF)
set_directory_properties(PROPERTIES EXCLUDE_FROM_ALL ON)
# QuaZip
-set(CPM_USE_LOCAL_PACKAGES ON)
-
-CPMAddPackage(
+AddPackage(
NAME QuaZip-Qt6
VERSION 1.3
- URL "https://github.com/crueter/quazip-qt6/archive/f838774d63.zip"
- CUSTOM_CACHE_KEY "f838"
+ REPO "crueter/quazip-qt6"
+ SHA f838774d63
+ HASH 9f629a438699801244a106c8df6d5f8f8d19e80df54f530a89403a10c8c4e37a6e95606bbdd307f23636961e8ce34eb37a2186d589a1f227ac9c8e2c678e326e
+ SYSTEM_PACKAGE ON
)
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index 38c0e4b3ce..6c522794e5 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -160,6 +160,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual
#include "yuzu/debugger/console.h"
#include "yuzu/debugger/controller.h"
#include "yuzu/debugger/wait_tree.h"
+#include "yuzu/deps_dialog.h"
#include "yuzu/discord.h"
#include "yuzu/game_list.h"
#include "yuzu/game_list_p.h"
@@ -1769,6 +1770,7 @@ void GMainWindow::ConnectMenuEvents() {
connect_menu(ui->action_Firmware_From_ZIP, &GMainWindow::OnInstallFirmwareFromZIP);
connect_menu(ui->action_Install_Keys, &GMainWindow::OnInstallDecryptionKeys);
connect_menu(ui->action_About, &GMainWindow::OnAbout);
+ connect_menu(ui->action_Eden_Dependencies, &GMainWindow::OnEdenDependencies);
}
void GMainWindow::UpdateMenuState() {
@@ -3742,7 +3744,7 @@ void GMainWindow::OnOpenFAQ() {
}
void GMainWindow::OnOpenDiscord() {
- OpenURL(QUrl(QStringLiteral("https://discord.gg/kXAmGCXBGD")));
+ OpenURL(QUrl(QStringLiteral("https://discord.gg/HstXbPch7X")));
}
void GMainWindow::OnOpenRevolt() {
@@ -4582,6 +4584,11 @@ void GMainWindow::OnAbout() {
aboutDialog.exec();
}
+void GMainWindow::OnEdenDependencies() {
+ DepsDialog depsDialog(this);
+ depsDialog.exec();
+}
+
void GMainWindow::OnToggleFilterBar() {
game_list->SetFilterVisible(ui->action_Show_Filter_Bar->isChecked());
if (ui->action_Show_Filter_Bar->isChecked()) {
diff --git a/src/yuzu/main.h b/src/yuzu/main.h
index 5e0405ee7f..c7dd2a45fa 100644
--- a/src/yuzu/main.h
+++ b/src/yuzu/main.h
@@ -397,6 +397,7 @@ private slots:
void OnInstallFirmwareFromZIP();
void OnInstallDecryptionKeys();
void OnAbout();
+ void OnEdenDependencies();
void OnToggleFilterBar();
void OnToggleStatusBar();
void OnGameListRefresh();
diff --git a/src/yuzu/main.ui b/src/yuzu/main.ui
index 25aaf6ad1c..ac8a2b594e 100644
--- a/src/yuzu/main.ui
+++ b/src/yuzu/main.ui
@@ -217,6 +217,7 @@
<addaction name="action_Revolt"/>
<addaction name="separator"/>
<addaction name="action_About"/>
+ <addaction name="action_Eden_Dependencies"/>
</widget>
<addaction name="menu_File"/>
<addaction name="menu_Emulation"/>
@@ -575,6 +576,11 @@
<string/>
</property>
</action>
+ <action name="action_Eden_Dependencies">
+ <property name="text">
+ <string>&amp;Eden Dependencies</string>
+ </property>
+ </action>
</widget>
<resources>
<include location="yuzu.qrc"/>
diff --git a/tools/cpm-hash.sh b/tools/cpm-hash.sh
index 9fde15ff7d..da0fb395db 100755
--- a/tools/cpm-hash.sh
+++ b/tools/cpm-hash.sh
@@ -1,7 +1,4 @@
#!/bin/sh
-for i in $@; do
- SUM=`wget -q $i -O - | sha512sum`
- echo "$i"
- echo "URL_HASH SHA512=$SUM" | cut -d " " -f1-2
-done
+SUM=`wget -q https://github.com/$1/archive/$2.zip -O - | sha512sum`
+echo "$SUM" | cut -d " " -f1