aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrueter <crueter@eden-emu.dev>2025-08-29 00:18:02 +0200
committercrueter <crueter@eden-emu.dev>2025-08-29 00:18:02 +0200
commit702a2beb7c3b30f84b90e88fc06ece2cd64d36f4 (patch)
treeea6ea569fe9c5769225daa240d0e070ec18ff0d1
parentd709771d67d9405edaa215d25af2d521cdb1983b (diff)
[cmake] refactor: cpmfile, deps prefetch, force system and more (#322)
CPM Dependencies are now managed in a singular json file, where each can be properly prefetched at-will via `tools/cpm-fetch.sh <packages...>`, or all at once via `tools/cpm-fetch-all.sh`. Adds docs for CPMUtil as well. Also adds `<package>_FORCE_{BUNDLED,SYSTEM}` overrides Signed-off-by: crueter <crueter@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/322 Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
-rw-r--r--.gitignore1
-rw-r--r--CMakeLists.txt299
-rw-r--r--CMakeModules/CPMUtil.cmake354
-rw-r--r--CMakeModules/DownloadExternals.cmake1
-rw-r--r--CMakeModules/FindSPIRV-Tools.cmake19
-rw-r--r--CMakeModules/Findzstd.cmake17
-rw-r--r--cpmfile.json147
-rw-r--r--docs/CPM.md252
-rw-r--r--externals/CMakeLists.txt142
-rw-r--r--externals/cpmfile.json109
-rw-r--r--externals/ffmpeg/CMakeLists.txt12
-rw-r--r--externals/ffmpeg/cpmfile.json8
-rw-r--r--externals/nx_tzdb/CMakeLists.txt67
-rw-r--r--externals/nx_tzdb/cpmfile.json8
-rw-r--r--src/android/app/build.gradle.kts5
-rw-r--r--src/common/CMakeLists.txt8
-rw-r--r--src/dynarmic/externals/CMakeLists.txt86
-rw-r--r--src/dynarmic/externals/cpmfile.json47
-rw-r--r--src/shader_recompiler/CMakeLists.txt2
-rw-r--r--src/yuzu/externals/CMakeLists.txt13
-rw-r--r--src/yuzu/externals/cpmfile.json12
-rwxr-xr-xtools/cpm-fetch-all.sh10
-rwxr-xr-xtools/cpm-fetch.sh198
23 files changed, 1254 insertions, 563 deletions
diff --git a/.gitignore b/.gitignore
index 83881117ac..2b342e5145 100644
--- a/.gitignore
+++ b/.gitignore
@@ -52,3 +52,4 @@ Thumbs.db
eden-windows-msvc
artifacts
*.AppImage*
+/install*
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6a8401759d..d11b58bf1f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -99,7 +99,6 @@ option(FORCE_DOWNLOAD_WIN_BUNDLES "Forcefully download bundled Windows dependenc
if (YUZU_USE_CPM AND ENABLE_SDL2)
option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 build" "${MSVC}")
- CMAKE_DEPENDENT_OPTION(FORCE_DOWNLOAD_SDL2 "Forcefully download all bundled SDL2 builds (useful for CI)" OFF "YUZU_USE_BUNDLED_SDL2" OFF)
endif()
CMAKE_DEPENDENT_OPTION(YUZU_ROOM "Enable dedicated room functionality" ON "NOT ANDROID" OFF)
@@ -110,11 +109,7 @@ CMAKE_DEPENDENT_OPTION(YUZU_CMD "Compile the eden-cli executable" ON "NOT ANDROI
CMAKE_DEPENDENT_OPTION(YUZU_CRASH_DUMPS "Compile crash dump (Minidump) support" OFF "WIN32 OR LINUX" OFF)
-if (PLATFORM_FREEBSD)
- option(YUZU_CHECK_SUBMODULES "Check if submodules are present" OFF)
-else()
- option(YUZU_CHECK_SUBMODULES "Check if submodules are present" ON)
-endif()
+option(YUZU_CHECK_SUBMODULES "Check if submodules are present" ${EXT_DEFAULT})
option(YUZU_ENABLE_LTO "Enable link-time optimization" OFF)
@@ -143,9 +138,8 @@ endif()
option(ENABLE_OPENSSL "Enable OpenSSL backend for ISslConnection" ${DEFAULT_ENABLE_OPENSSL})
-if (YUZU_USE_CPM AND ENABLE_OPENSSL)
+if (ENABLE_OPENSSL)
CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_OPENSSL "Download bundled OpenSSL build" "${MSVC}" "NOT ANDROID" ON)
- CMAKE_DEPENDENT_OPTION(FORCE_DOWNLOAD_OPENSSL "Forcefully download all bundled OpenSSL builds (useful for CI)" OFF "YUZU_USE_BUNDLED_OPENSSL" OFF)
endif()
if (ANDROID AND YUZU_DOWNLOAD_ANDROID_VVL)
@@ -180,12 +174,12 @@ if (YUZU_USE_PRECOMPILED_HEADERS)
set(YUZU_USE_PRECOMPILED_HEADERS OFF CACHE BOOL "" FORCE)
endif()
endif()
+
if (YUZU_USE_PRECOMPILED_HEADERS)
message(STATUS "Using Precompiled Headers.")
set(CMAKE_PCH_INSTANTIATE_TEMPLATES ON)
endif()
-
# Default to a Release build
get_property(IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if (NOT IS_MULTI_CONFIG AND NOT CMAKE_BUILD_TYPE)
@@ -246,20 +240,24 @@ endfunction()
if(EXISTS ${PROJECT_SOURCE_DIR}/.gitmodules AND YUZU_CHECK_SUBMODULES)
check_submodules_present()
endif()
+
configure_file(${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.qrc
${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.qrc
COPYONLY)
+
if (EXISTS ${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.json)
configure_file("${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.json"
"${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json"
COPYONLY)
endif()
+
if (ENABLE_COMPATIBILITY_LIST_DOWNLOAD AND NOT EXISTS ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json)
message(STATUS "Downloading compatibility list for yuzu...")
file(DOWNLOAD
https://api.yuzu-emu.org/gamedb/
"${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json" SHOW_PROGRESS)
endif()
+
if (NOT EXISTS ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json)
file(WRITE ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json "")
endif()
@@ -303,8 +301,15 @@ if (NOT DEFINED ARCHITECTURE)
set(ARCHITECTURE_GENERIC 1)
add_definitions(-DARCHITECTURE_GENERIC=1)
endif()
+
message(STATUS "Target architecture: ${ARCHITECTURE}")
+if (MSVC AND ARCHITECTURE_x86)
+ message(FATAL_ERROR "Attempting to build with the x86 environment is not supported. \
+ This can typically happen if you used the Developer Command Prompt from the start menu;\
+ instead, run vcvars64.bat directly, located at C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Auxiliary/Build/vcvars64.bat")
+endif()
+
if (UNIX)
add_definitions(-DYUZU_UNIX=1)
endif()
@@ -367,6 +372,15 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
include(CPMUtil)
+# openssl funniness
+if (ENABLE_OPENSSL)
+ if (YUZU_USE_BUNDLED_OPENSSL)
+ AddJsonPackage(openssl)
+ endif()
+
+ find_package(OpenSSL 1.1.1 REQUIRED)
+endif()
+
if (YUZU_USE_CPM)
message(STATUS "Fetching needed dependencies with CPM")
@@ -375,36 +389,9 @@ if (YUZU_USE_CPM)
# TODO(crueter): renderdoc?
- # openssl funniness
- if (ENABLE_OPENSSL)
- if (YUZU_USE_BUNDLED_OPENSSL)
- AddCIPackage(
- PACKAGE OpenSSL
- NAME openssl
- REPO crueter-ci/OpenSSL
- VERSION 3.5.2
- MIN_VERSION 1.1.1
- FORCE_DOWNLOAD ${FORCE_DOWNLOAD_OPENSSL}
- )
- endif()
-
- find_package(OpenSSL 1.1.1 REQUIRED)
- endif()
-
# boost
set(BOOST_INCLUDE_LIBRARIES algorithm icl pool container heap asio headers process filesystem crc variant)
- AddPackage(
- NAME Boost
- REPO boostorg/boost
- TAG boost-1.88.0
- ARTIFACT boost-1.88.0-cmake.7z
-
- HASH e5b049e5b61964480ca816395f63f95621e66cb9bcf616a8b10e441e0e69f129e22443acb11e77bc1e8170f8e4171b9b7719891efc43699782bfcd4b3a365f01
-
- GIT_VERSION 1.88.0
- VERSION 1.57
- EXCLUDE_FROM_ALL ON
- )
+ AddJsonPackage(boost)
# really annoying thing where boost::headers doesn't work with cpm
# TODO(crueter) investigate
@@ -419,6 +406,10 @@ if (YUZU_USE_CPM)
if (NOT MSVC)
# boost sucks
+ if (NOT PLATFORM_LINUX AND NOT ANDROID)
+ target_compile_definitions(boost_container INTERFACE BOOST_HAS_PTHREADS)
+ endif()
+
target_compile_options(boost_heap INTERFACE -Wno-shadow)
target_compile_options(boost_icl INTERFACE -Wno-shadow)
target_compile_options(boost_asio INTERFACE -Wno-conversion -Wno-implicit-fallthrough)
@@ -426,151 +417,46 @@ if (YUZU_USE_CPM)
endif()
# fmt
- AddPackage(
- NAME fmt
- REPO fmtlib/fmt
- SHA 40626af88b
- HASH d59f06c24339f223de4ec2afeba1c67b5835a0f350a1ffa86242a72fc3e616a6b8b21798355428d4200c75287308b66634619ffa0b52ba5bd74cc01772ea1a8a
- VERSION 8
- OPTIONS
- "FMT_INSTALL OFF"
- EXCLUDE_FROM_ALL ON
- )
+ AddJsonPackage(fmt)
# lz4
- AddPackage(
- NAME lz4
- REPO lz4/lz4
- SHA ebb370ca83
- HASH 43600e87b35256005c0f2498fa56a77de6783937ba4cfce38c099f27c03188d097863e8a50c5779ca0a7c63c29c4f7ed0ae526ec798c1fd2e3736861b62e0a37
- SOURCE_SUBDIR build/cmake
- EXCLUDE_FROM_ALL ON
- )
+ AddJsonPackage(lz4)
if (lz4_ADDED)
add_library(lz4::lz4 ALIAS lz4_static)
endif()
# nlohmann
- AddPackage(
- NAME nlohmann_json
- REPO nlohmann/json
- SHA 55f93686c0
- HASH b739749b066800e21154506ea150d2c5cbce8a45344177f46f884547a1399d26753166fd0df8135269ce28cf223552b1b65cd625b88c844d54753f2434900486
- VERSION 3.8
- EXCLUDE_FROM_ALL ON
- )
+ AddJsonPackage(nlohmann)
# zlib
- AddPackage(
- NAME ZLIB
- REPO madler/zlib
- SHA 51b7f2abda
- HASH 16eaf1f3752489d12fd9ce30f7b5f7cbd5cb8ff53d617005a9847ae72d937f65e01e68be747f62d7ac19fd0c9aeba9956e60f16d6b465c5fdc2f3d08b4db2e6c
- VERSION 1.2
- OPTIONS
- "ZLIB_BUILD_SHARED OFF"
- "ZLIB_INSTALL OFF"
- EXCLUDE_FROM_ALL ON
- )
+ AddJsonPackage(zlib)
if (ZLIB_ADDED)
add_library(ZLIB::ZLIB ALIAS zlibstatic)
endif()
# zstd
- AddPackage(
- NAME zstd
- REPO facebook/zstd
- SHA f8745da6ff
- HASH 3037007f990040fe32573b46f9bef8762fd5dbeeb07ffffcbfeba51ec98167edae39bb9c87f9299efcd61c4e467c5e84f7c19f0df7799bc1fc04864a278792ee
- VERSION 1.5
- SOURCE_SUBDIR build/cmake
- OPTIONS
- "ZSTD_BUILD_SHARED OFF"
- EXCLUDE_FROM_ALL ON
- )
+ AddJsonPackage(zstd)
+
+ if (zstd_ADDED)
+ add_library(zstd::zstd ALIAS libzstd_static)
+ endif()
# Catch2
if (YUZU_TESTS OR DYNARMIC_TESTS)
- AddPackage(
- NAME Catch2
- REPO catchorg/Catch2
- SHA 644821ce28
- HASH f8795f98acf2c02c0db8e734cc866d5caebab4b4a306e93598b97cb3c0c728dafe8283dce27ffe8d42460e5ae7302f3f32e7e274a7f991b73511ac88eef21b1f
- VERSION 3.0.1
- EXCLUDE_FROM_ALL ON
- )
+ AddJsonPackage(catch2)
endif()
# ENet
- AddPackage(
- NAME enet
- REPO lsalzman/enet
- SHA 2662c0de09
- VERSION 1.3
- HASH 3de1beb4fa3d6b1e03eda8dd1e7580694f854af3ed3975dcdabfdcdf76b97f322b9734d35ea7f185855bb490d957842b938b26da4dd2dfded509390f8d2794dd
- FIND_PACKAGE_ARGUMENTS "MODULE"
- EXCLUDE_FROM_ALL ON
- )
+ AddJsonPackage(enet)
if (enet_ADDED)
target_include_directories(enet INTERFACE ${enet_SOURCE_DIR}/include)
endif()
# Opus
- AddPackage(
- NAME Opus
- VERSION 1.3
- 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"
- EXCLUDE_FROM_ALL ON
- )
-
- if(ENABLE_CUBEB)
- AddPackage(
- NAME cubeb
- 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"
- "BUNDLE_SPEEX ON"
- EXCLUDE_FROM_ALL ON
- )
-
- if (cubeb_ADDED)
- if (NOT MSVC)
- if (TARGET speex)
- target_compile_options(speex PRIVATE -Wno-sign-compare)
- endif()
-
- set_target_properties(cubeb PROPERTIES COMPILE_OPTIONS "")
- target_compile_options(cubeb INTERFACE
- -Wno-implicit-const-int-float-conversion
- -Wno-shadow
- -Wno-missing-declarations
- -Wno-return-type
- -Wno-uninitialized
- )
- else()
- target_compile_options(cubeb PRIVATE
- /wd4456
- /wd4458
- )
- endif()
- endif()
- endif()
+ AddJsonPackage(opus)
else()
# Enforce the search mode of non-required packages for better and shorter failure messages
find_package(fmt 8 REQUIRED)
@@ -582,11 +468,7 @@ else()
find_package(enet 1.3 MODULE REQUIRED)
find_package(Opus 1.3 MODULE REQUIRED)
find_package(ZLIB 1.2 REQUIRED)
- find_package(zstd 1.5 REQUIRED)
-
- if (ENABLE_CUBEB)
- find_package(cubeb CONFIG)
- endif()
+ find_package(zstd 1.5 REQUIRED MODULE)
if (YUZU_TESTS)
find_package(Catch2 3.0.1 REQUIRED)
@@ -602,14 +484,7 @@ else()
endif()
if(NOT TARGET Boost::headers)
- AddPackage(
- NAME boost_headers
- REPO "boostorg/headers"
- SHA 0456900fad
- HASH 50cd75dcdfc5f082225cdace058f47b4fb114a47585f7aee1d22236a910a80b667186254c214fa2fcebac67ae6d37ba4b6e695e1faea8affd6fd42a03cf996e3
- BUNDLED_PACKAGE ON
- EXCLUDE_FROM_ALL ON
- )
+ AddJsonPackage(boost_headers)
endif()
if (ENABLE_LIBUSB)
@@ -622,45 +497,45 @@ endif()
# DiscordRPC
if (USE_DISCORD_PRESENCE)
- AddPackage(
- NAME discord-rpc
- 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
- EXCLUDE_FROM_ALL ON
- )
+ AddJsonPackage(discord-rpc)
target_include_directories(discord-rpc INTERFACE ${discord-rpc_SOURCE_DIR}/include)
add_library(DiscordRPC::discord-rpc ALIAS discord-rpc)
endif()
# SimpleIni
-AddPackage(
- NAME SimpleIni
- REPO brofield/simpleini
- SHA 09c21bda1d
- HASH 99779ca9b6e040d36558cadf484f9ffdab5b47bcc8fc72e4d33639d1d60c0ceb4410d335ba445d72a4324e455167fd6769d99b459943aa135bec085dff2d4b7c
- FIND_PACKAGE_ARGUMENTS "MODULE"
- EXCLUDE_FROM_ALL ON
-)
-
-# TODO(crueter): Work around this
-if (NOT YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS)
- find_package(PkgConfig REQUIRED)
- pkg_check_modules(SPIRV-Tools REQUIRED SPIRV-Tools)
+AddJsonPackage(simpleini)
+
+# Most linux distros don't package cubeb, so enable regardless of cpm settings
+if(ENABLE_CUBEB)
+ AddJsonPackage(cubeb)
+
+ if (cubeb_ADDED)
+ if (NOT MSVC)
+ if (TARGET speex)
+ target_compile_options(speex PRIVATE -Wno-sign-compare)
+ endif()
+
+ set_target_properties(cubeb PROPERTIES COMPILE_OPTIONS "")
+ target_compile_options(cubeb INTERFACE
+ -Wno-implicit-const-int-float-conversion
+ -Wno-shadow
+ -Wno-missing-declarations
+ -Wno-return-type
+ -Wno-uninitialized
+ )
+ else()
+ target_compile_options(cubeb PRIVATE
+ /wd4456
+ /wd4458
+ )
+ endif()
+ endif()
endif()
# find SDL2 exports a bunch of variables that are needed, so its easier to do this outside of the YUZU_find_package
if (ENABLE_SDL2)
- # this was hard to get right, but ultimately I decided to make it so that FORCE_DOWNLOAD_SDL2 also downloads the
- # external one. Really silly behavior imo but in the interest of getting something out there I'm leaving it for now
- if (YUZU_USE_EXTERNAL_SDL2 OR FORCE_DOWNLOAD_SDL2)
+ if (YUZU_USE_EXTERNAL_SDL2)
message(STATUS "Using SDL2 from externals.")
if (NOT WIN32)
# Yuzu itself needs: Atomic Audio Events Joystick Haptic Sensor Threads Timers
@@ -683,37 +558,14 @@ if (ENABLE_SDL2)
endif()
if ("${YUZU_SYSTEM_PROFILE}" STREQUAL "steamdeck")
- set(SDL_HASH cc016b0046)
set(SDL_PIPEWIRE OFF) # build errors out with this on
- set(SDL_SHA512SUM 34d5ef58da6a4f9efa6689c82f67badcbd741f5a4f562a9c2c30828fa839830fb07681c5dc6a7851520e261c8405a416ac0a2c2513b51984fb3b4fa4dcb3e20b)
+ AddJsonPackage("sdl2_steamdeck")
else()
- set(SDL_HASH 54772f345a)
- set(SDL_SHA512SUM 2a68a0e01c390043aa9d9df63d8a20a52076c88bb460ac4e0f33194ca7d9bc8fadbbcc04e7506872ac4b6354a73fbc267c036f82200da59465789b87c7d9e3a4)
+ AddJsonPackage("sdl2_generic")
endif()
-
- AddPackage(
- NAME SDL2
- REPO "libsdl-org/SDL"
- SHA ${SDL_HASH}
- HASH ${SDL_SHA512SUM}
- KEY ${YUZU_SYSTEM_PROFILE}
- BUNDLED_PACKAGE ON
- EXCLUDE_FROM_ALL ON
- )
- endif()
-
- if (YUZU_USE_BUNDLED_SDL2)
+ elseif (YUZU_USE_BUNDLED_SDL2)
message(STATUS "Using bundled SDL2")
- AddCIPackage(
- PACKAGE SDL2
- NAME SDL2
- REPO crueter-ci/SDL2
- VERSION 2.32.8
- MIN_VERSION 2.26.4
- CMAKE_FILENAME sdl2
- FORCE_DOWNLOAD ${FORCE_DOWNLOAD_SDL2}
- TARGET "SDL2::SDL2"
- )
+ AddJsonPackage(sdl2)
endif()
find_package(SDL2 2.26.4 REQUIRED)
@@ -750,6 +602,7 @@ add_subdirectory(externals)
find_package(VulkanHeaders)
find_package(VulkanUtilityLibraries)
find_package(VulkanMemoryAllocator)
+find_package(SPIRV-Tools)
if (ENABLE_WEB_SERVICE)
find_package(httplib)
diff --git a/CMakeModules/CPMUtil.cmake b/CMakeModules/CPMUtil.cmake
index 519e7e32a8..4d7db6ed61 100644
--- a/CMakeModules/CPMUtil.cmake
+++ b/CMakeModules/CPMUtil.cmake
@@ -1,28 +1,222 @@
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
+# SPDX-FileCopyrightText: Copyright 2025 crueter
+# 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
-include(CMakeDependentOption)
+# Future crueter: Wow this was a lie and a half, at this point I might as well make my own CPN
+# haha just kidding... unless?
+
if (MSVC OR ANDROID)
- set(SYSTEM_DEFAULT OFF)
+ set(BUNDLED_DEFAULT OFF)
else()
- set(SYSTEM_DEFAULT ON)
+ set(BUNDLED_DEFAULT ON)
endif()
-CMAKE_DEPENDENT_OPTION(CPMUTIL_DEFAULT_SYSTEM
- "Allow usage of system packages for CPM dependencies" ${SYSTEM_DEFAULT}
- "NOT ANDROID" OFF)
+option(CPMUTIL_FORCE_BUNDLED
+ "Force bundled packages for all CPM depdendencies" ${BUNDLED_DEFAULT})
+
+option(CPMUTIL_FORCE_SYSTEM
+ "Force system packages for all CPM dependencies (NOT RECOMMENDED)" OFF)
cmake_minimum_required(VERSION 3.22)
include(CPM)
+# TODO(crueter): Better solution for separate cpmfiles e.g. per-directory
+set(CPMUTIL_JSON_FILE "${CMAKE_CURRENT_SOURCE_DIR}/cpmfile.json" CACHE STRING "Location of cpmfile.json")
+
+if (EXISTS ${CPMUTIL_JSON_FILE})
+ file(READ ${CPMUTIL_JSON_FILE} CPMFILE_CONTENT)
+else()
+ message(WARNING "[CPMUtil] cpmfile ${CPMUTIL_JSON_FILE} does not exist, AddJsonPackage will be a no-op")
+endif()
+
+# utility
function(cpm_utils_message level name message)
message(${level} "[CPMUtil] ${name}: ${message}")
endfunction()
+# utility
+function(array_to_list array length out)
+ math(EXPR range "${length} - 1")
+
+ foreach(IDX RANGE ${range})
+ string(JSON _element GET "${array}" "${IDX}")
+
+ list(APPEND NEW_LIST ${_element})
+ endforeach()
+
+ set("${out}" "${NEW_LIST}" PARENT_SCOPE)
+endfunction()
+
+# utility
+function(get_json_element object out member default)
+ string(JSON out_type ERROR_VARIABLE err TYPE "${object}" ${member})
+
+ if (err)
+ set("${out}" "${default}" PARENT_SCOPE)
+ return()
+ endif()
+
+ string(JSON outvar GET "${object}" ${member})
+
+ if (out_type STREQUAL "ARRAY")
+ string(JSON _len LENGTH "${object}" ${member})
+ # array_to_list("${outvar}" ${_len} outvar)
+ set("${out}_LENGTH" "${_len}" PARENT_SCOPE)
+ endif()
+
+ set("${out}" "${outvar}" PARENT_SCOPE)
+endfunction()
+
+# Kinda cancerous but whatever
+function(AddJsonPackage)
+ set(oneValueArgs
+ NAME
+
+ # these are overrides that can be generated at runtime, so can be defined separately from the json
+ DOWNLOAD_ONLY
+ SYSTEM_PACKAGE
+ BUNDLED_PACKAGE
+ )
+
+ set(multiValueArgs OPTIONS)
+
+ cmake_parse_arguments(JSON "" "${oneValueArgs}" "${multiValueArgs}"
+ "${ARGN}")
+
+ list(LENGTH ARGN argnLength)
+ # single name argument
+ if(argnLength EQUAL 1)
+ set(JSON_NAME "${ARGV0}")
+ endif()
+
+ if (NOT DEFINED CPMFILE_CONTENT)
+ cpm_utils_message(WARNING ${name} "No cpmfile, AddJsonPackage is a no-op")
+ return()
+ endif()
+
+ if (NOT DEFINED JSON_NAME)
+ cpm_utils_message(FATAL_ERROR "json package" "No name specified")
+ endif()
+
+ string(JSON object ERROR_VARIABLE err GET "${CPMFILE_CONTENT}" "${JSON_NAME}")
+
+ if (err)
+ cpm_utils_message(FATAL_ERROR ${JSON_NAME} "Not found in cpmfile")
+ endif()
+
+ get_json_element("${object}" package package ${JSON_NAME})
+ get_json_element("${object}" repo repo "")
+ get_json_element("${object}" ci ci OFF)
+ get_json_element("${object}" version version "")
+
+ if (ci)
+ get_json_element("${object}" name name "${JSON_NAME}")
+ get_json_element("${object}" extension extension "tar.zst")
+ get_json_element("${object}" min_version min_version "")
+ get_json_element("${object}" cmake_filename cmake_filename "")
+ get_json_element("${object}" raw_disabled disabled_platforms "")
+
+ if (raw_disabled)
+ array_to_list("${raw_disabled}" ${raw_disabled_LENGTH} disabled_platforms)
+ else()
+ set(disabled_platforms "")
+ endif()
+
+ AddCIPackage(
+ VERSION ${version}
+ NAME ${name}
+ REPO ${repo}
+ PACKAGE ${package}
+ EXTENSION ${extension}
+ MIN_VERSION ${min_version}
+ DISABLED_PLATFORMS ${disabled_platforms}
+ CMAKE_FILENAME ${cmake_filename}
+ )
+ return()
+ endif()
+
+ get_json_element("${object}" hash hash "")
+ get_json_element("${object}" sha sha "")
+ get_json_element("${object}" url url "")
+ get_json_element("${object}" key key "")
+ get_json_element("${object}" tag tag "")
+ get_json_element("${object}" artifact artifact "")
+ get_json_element("${object}" git_version git_version "")
+ get_json_element("${object}" source_subdir source_subdir "")
+ get_json_element("${object}" bundled bundled "unset")
+ get_json_element("${object}" find_args find_args "")
+ get_json_element("${object}" raw_patches patches "")
+
+ # format patchdir
+ if (raw_patches)
+ math(EXPR range "${raw_patches_LENGTH} - 1")
+
+ foreach(IDX RANGE ${range})
+ string(JSON _patch GET "${raw_patches}" "${IDX}")
+
+ set(full_patch "${CMAKE_SOURCE_DIR}/.patch/${JSON_NAME}/${_patch}")
+ if (NOT EXISTS ${full_patch})
+ cpm_utils_message(FATAL_ERROR ${JSON_NAME} "specifies patch ${full_patch} which does not exist")
+ endif()
+
+ list(APPEND patches "${full_patch}")
+ endforeach()
+ endif()
+ # end format patchdir
+
+ # options
+ get_json_element("${object}" raw_options options "")
+
+ if (raw_options)
+ array_to_list("${raw_options}" ${raw_options_LENGTH} options)
+ endif()
+
+ set(options ${options} ${JSON_OPTIONS})
+
+ # end options
+
+ # system/bundled
+ if (bundled STREQUAL "unset" AND DEFINED JSON_BUNDLED_PACKAGE)
+ set(bundled ${JSON_BUNDLED_PACKAGE})
+ else()
+ set(bundled ON)
+ endif()
+
+ AddPackage(
+ NAME "${package}"
+ VERSION "${version}"
+ URL "${url}"
+ HASH "${hash}"
+ SHA "${sha}"
+ REPO "${repo}"
+ KEY "${key}"
+ PATCHES "${patches}"
+ OPTIONS "${options}"
+ FIND_PACKAGE_ARGUMENTS "${find_args}"
+ BUNDLED_PACKAGE "${bundled}"
+ SOURCE_SUBDIR "${source_subdir}"
+
+ GIT_VERSION ${git_version}
+ ARTIFACT ${artifact}
+ TAG ${tag}
+ )
+
+ # pass stuff to parent scope
+ set(${package}_ADDED "${${package}_ADDED}"
+ PARENT_SCOPE)
+ set(${package}_SOURCE_DIR "${${package}_SOURCE_DIR}"
+ PARENT_SCOPE)
+ set(${package}_BINARY_DIR "${${package}_BINARY_DIR}"
+ PARENT_SCOPE)
+
+endfunction()
+
function(AddPackage)
cpm_set_policies()
@@ -64,9 +258,6 @@ function(AddPackage)
GIT_URL
KEY
- DOWNLOAD_ONLY
- FIND_PACKAGE_ARGUMENTS
- SYSTEM_PACKAGE
BUNDLED_PACKAGE
)
@@ -79,6 +270,9 @@ function(AddPackage)
cpm_utils_message(FATAL_ERROR "package" "No package name defined")
endif()
+ option(${PKG_ARGS_NAME}_FORCE_SYSTEM "Force the system package for ${PKG_ARGS_NAME}")
+ option(${PKG_ARGS_NAME}_FORCE_BUNDLED "Force the bundled package for ${PKG_ARGS_NAME}")
+
if (DEFINED PKG_ARGS_URL)
set(pkg_url ${PKG_ARGS_URL})
@@ -124,9 +318,9 @@ function(AddPackage)
cpm_utils_message(STATUS ${PKG_ARGS_NAME} "Download URL is ${pkg_url}")
if (DEFINED PKG_ARGS_GIT_VERSION)
- set(git_version ${PKG_ARGS_VERSION})
- elseif(DEFINED PKG_ARGS_VERSION)
set(git_version ${PKG_ARGS_GIT_VERSION})
+ elseif(DEFINED PKG_ARGS_VERSION)
+ set(git_version ${PKG_ARGS_VERSION})
endif()
if (NOT DEFINED PKG_ARGS_KEY)
@@ -178,25 +372,55 @@ function(AddPackage)
if (DEFINED hash_url)
set(outfile ${CMAKE_CURRENT_BINARY_DIR}/${PKG_ARGS_NAME}.hash)
- file(DOWNLOAD ${hash_url} ${outfile})
- file(READ ${outfile} pkg_hash_tmp)
- file(REMOVE ${outfile})
+ # TODO(crueter): This is kind of a bad solution
+ # because "technically" the hash is invalidated each week
+ # but it works for now kjsdnfkjdnfjksdn
+ string(TOLOWER ${PKG_ARGS_NAME} lowername)
+ if (NOT EXISTS ${outfile} AND NOT EXISTS ${CPM_SOURCE_CACHE}/${lowername}/${pkg_key})
+ file(DOWNLOAD ${hash_url} ${outfile})
+ endif()
+
+ if (EXISTS ${outfile})
+ file(READ ${outfile} pkg_hash_tmp)
+ endif()
- set(pkg_hash "${hash_algo}=${pkg_hash_tmp}")
+ if (DEFINED ${pkg_hash_tmp})
+ set(pkg_hash "${hash_algo}=${pkg_hash_tmp}")
+ endif()
endif()
- if (NOT CPMUTIL_DEFAULT_SYSTEM)
- set(CPM_USE_LOCAL_PACKAGES OFF)
- elseif (DEFINED PKG_ARGS_SYSTEM_PACKAGE)
- set(CPM_USE_LOCAL_PACKAGES ${PKG_ARGS_SYSTEM_PACKAGE})
+ macro(set_precedence local force)
+ set(CPM_USE_LOCAL_PACKAGES ${local})
+ set(CPM_LOCAL_PACKAGES_ONLY ${force})
+ endmacro()
+
+ #[[
+ Precedence:
+ - package_FORCE_SYSTEM
+ - package_FORCE_BUNDLED
+ - CPMUTIL_FORCE_SYSTEM
+ - CPMUTIL_FORCE_BUNDLED
+ - BUNDLED_PACKAGE
+ - default to allow local
+ ]]#
+ if (${PKG_ARGS_NAME}_FORCE_SYSTEM)
+ set_precedence(ON ON)
+ elseif (${PKG_ARGS_NAME}_FORCE_BUNDLED)
+ set_precedence(OFF OFF)
+ elseif (CPMUTIL_FORCE_SYSTEM)
+ set_precedence(ON ON)
+ elseif(NOT CPMUTIL_FORCE_BUNDLED)
+ set_precedence(OFF OFF)
elseif (DEFINED PKG_ARGS_BUNDLED_PACKAGE)
if (PKG_ARGS_BUNDLED_PACKAGE)
- set(CPM_USE_LOCAL_PACKAGES OFF)
+ set(local OFF)
else()
- set(CPM_USE_LOCAL_PACKAGES ON)
+ set(local ON)
endif()
+
+ set_precedence(${local} OFF)
else()
- set(CPM_USE_LOCAL_PACKAGES ON)
+ set_precedence(ON OFF)
endif()
CPMAddPackage(
@@ -210,6 +434,7 @@ function(AddPackage)
OPTIONS ${PKG_ARGS_OPTIONS}
PATCHES ${PKG_ARGS_PATCHES}
+ EXCLUDE_FROM_ALL ON
${PKG_ARGS_UNPARSED_ARGUMENTS}
)
@@ -257,7 +482,7 @@ function(add_ci_package key)
set(ARTIFACT ${ARTIFACT_NAME}-${key}-${ARTIFACT_VERSION}.${ARTIFACT_EXT})
AddPackage(
- NAME ${ARTIFACT_PACKAGE}-${key}
+ NAME ${ARTIFACT_PACKAGE}
REPO ${ARTIFACT_REPO}
TAG v${ARTIFACT_VERSION}
VERSION ${ARTIFACT_VERSION}
@@ -266,15 +491,12 @@ function(add_ci_package key)
KEY ${key}
HASH_SUFFIX sha512sum
BUNDLED_PACKAGE ON
- DOWNLOAD_ONLY ON
)
- if (NOT ARTIFACT_FORCE_DOWNLOAD OR ARTIFACT_OVERRIDE)
- set(ARTIFACT_DIR ${${ARTIFACT_PACKAGE}-${key}_SOURCE_DIR} PARENT_SCOPE)
- endif()
+ set(ARTIFACT_DIR ${${ARTIFACT_PACKAGE}_SOURCE_DIR} PARENT_SCOPE)
endfunction()
-# TODO(crueter): doc
+# name is the artifact name, package is for find_package override
function(AddCIPackage)
set(oneValueArgs
VERSION
@@ -282,11 +504,9 @@ function(AddCIPackage)
REPO
PACKAGE
EXTENSION
- FORCE_DOWNLOAD
MIN_VERSION
DISABLED_PLATFORMS
CMAKE_FILENAME
- TARGET
)
cmake_parse_arguments(PKG_ARGS "" "${oneValueArgs}" "" ${ARGN})
@@ -316,12 +536,6 @@ function(AddCIPackage)
set(ARTIFACT_EXT ${PKG_ARGS_EXTENSION})
endif()
- if(NOT DEFINED PKG_ARGS_FORCE_DOWNLOAD)
- set(ARTIFACT_FORCE_DOWNLOAD OFF)
- else()
- set(ARTIFACT_FORCE_DOWNLOAD ${PKG_ARGS_FORCE_DOWNLOAD})
- endif()
-
if (DEFINED PKG_ARGS_MIN_VERSION)
set(ARTIFACT_MIN_VERSION ${PKG_ARGS_MIN_VERSION})
endif()
@@ -336,86 +550,42 @@ function(AddCIPackage)
set(ARTIFACT_REPO ${PKG_ARGS_REPO})
set(ARTIFACT_PACKAGE ${PKG_ARGS_PACKAGE})
- if ((MSVC AND ARCHITECTURE_x86_64) OR ARTIFACT_FORCE_DOWNLOAD AND NOT "windows-amd64" IN_LIST DISABLED_PLATFORMS)
- # kinda hacky
- if(MSVC AND ARCHITECTURE_x86_64)
- set(ARTIFACT_OVERRIDE ON)
- endif()
-
+ if ((MSVC AND ARCHITECTURE_x86_64) AND NOT "windows-amd64" IN_LIST DISABLED_PLATFORMS)
add_ci_package(windows-amd64)
- set(ARTIFACT_OVERRIDE OFF)
endif()
- if ((MSVC AND ARCHITECTURE_arm64) OR ARTIFACT_FORCE_DOWNLOAD AND NOT "windows-arm64" IN_LIST DISABLED_PLATFORMS)
- if(MSVC AND ARCHITECTURE_arm64)
- set(ARTIFACT_OVERRIDE ON)
- endif()
-
+ if ((MSVC AND ARCHITECTURE_arm64) AND NOT "windows-arm64" IN_LIST DISABLED_PLATFORMS)
add_ci_package(windows-arm64)
- set(ARTIFACT_OVERRIDE OFF)
endif()
- if (ANDROID OR ARTIFACT_FORCE_DOWNLOAD AND NOT "android" IN_LIST DISABLED_PLATFORMS)
- if(ANDROID)
- set(ARTIFACT_OVERRIDE ON)
- endif()
-
+ if (ANDROID AND NOT "android" IN_LIST DISABLED_PLATFORMS)
add_ci_package(android)
- set(ARTIFACT_OVERRIDE OFF)
endif()
- if(PLATFORM_SUN OR ARTIFACT_FORCE_DOWNLOAD AND NOT "solaris" IN_LIST DISABLED_PLATFORMS)
- if(PLATFORM_SUN)
- set(ARTIFACT_OVERRIDE ON)
- endif()
-
+ if(PLATFORM_SUN AND NOT "solaris" IN_LIST DISABLED_PLATFORMS)
add_ci_package(solaris)
- set(ARTIFACT_OVERRIDE OFF)
endif()
- if(PLATFORM_FREEBSD OR ARTIFACT_FORCE_DOWNLOAD AND NOT "freebsd" IN_LIST DISABLED_PLATFORMS)
- if(PLATFORM_FREEBSD)
- set(ARTIFACT_OVERRIDE ON)
- endif()
-
+ if(PLATFORM_FREEBSD AND NOT "freebsd" IN_LIST DISABLED_PLATFORMS)
add_ci_package(freebsd)
- set(ARTIFACT_OVERRIDE OFF)
endif()
- if((PLATFORM_LINUX AND ARCHITECTURE_x86_64) OR ARTIFACT_FORCE_DOWNLOAD AND NOT "linux" IN_LIST DISABLED_PLATFORMS)
- if(PLATFORM_LINUX AND ARCHITECTURE_x86_64)
- set(ARTIFACT_OVERRIDE ON)
- endif()
-
+ if((PLATFORM_LINUX AND ARCHITECTURE_x86_64) AND NOT "linux" IN_LIST DISABLED_PLATFORMS)
add_ci_package(linux)
- set(ARTIFACT_OVERRIDE OFF)
endif()
- if((PLATFORM_LINUX AND ARCHITECTURE_arm64) OR ARTIFACT_FORCE_DOWNLOAD AND NOT "linux-aarch64" IN_LIST DISABLED_PLATFORMS)
- if(PLATFORM_LINUX AND ARCHITECTURE_arm64)
- set(ARTIFACT_OVERRIDE ON)
- endif()
-
+ if((PLATFORM_LINUX AND ARCHITECTURE_arm64) AND NOT "linux-aarch64" IN_LIST DISABLED_PLATFORMS)
add_ci_package(linux-aarch64)
- set(ARTIFACT_OVERRIDE OFF)
endif()
if (DEFINED ARTIFACT_DIR)
- if (NOT DEFINED PKG_ARGS_TARGET OR NOT TARGET "${PKG_ARGS_TARGET}")
- include(${ARTIFACT_DIR}/${ARTIFACT_CMAKE}.cmake)
-
- # Overrides find package
- CPMAddPackage(
- NAME ${ARTIFACT_PACKAGE}
- SOURCE_DIR ${ARTIFACT_DIR}
- )
+ include(${ARTIFACT_DIR}/${ARTIFACT_CMAKE}.cmake)
- set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_NAMES ${ARTIFACT_NAME})
- set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_URLS "https://github.com/${ARTIFACT_REPO}") # TODO(crueter) other hosts?
- set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS ${ARTIFACT_VERSION})
+ set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_NAMES ${ARTIFACT_NAME})
+ set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_URLS "https://github.com/${ARTIFACT_REPO}") # TODO(crueter) other hosts?
+ set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS ${ARTIFACT_VERSION})
- set(${ARTIFACT_PACKAGE}_ADDED TRUE PARENT_SCOPE)
- endif()
+ set(${ARTIFACT_PACKAGE}_ADDED TRUE PARENT_SCOPE)
else()
find_package(${ARTIFACT_PACKAGE} ${ARTIFACT_MIN_VERSION} REQUIRED)
endif()
diff --git a/CMakeModules/DownloadExternals.cmake b/CMakeModules/DownloadExternals.cmake
index 642d7d0df1..de45d15d2a 100644
--- a/CMakeModules/DownloadExternals.cmake
+++ b/CMakeModules/DownloadExternals.cmake
@@ -29,6 +29,7 @@ function(download_bundled_external remote_path lib_name cpm_key prefix_var versi
set(package_url "${package_base_url}${package_repo}")
set(full_url ${package_url}${remote_path}${lib_name}${package_extension})
+ # TODO(crueter): DELETE THIS ENTIRELY, GLORY BE TO THE CI!
AddPackage(
NAME ${cpm_key}
VERSION ${version}
diff --git a/CMakeModules/FindSPIRV-Tools.cmake b/CMakeModules/FindSPIRV-Tools.cmake
new file mode 100644
index 0000000000..aef74df5d9
--- /dev/null
+++ b/CMakeModules/FindSPIRV-Tools.cmake
@@ -0,0 +1,19 @@
+# SPDX-FileCopyrightText: 2022 yuzu Emulator Project
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+include(FindPackageHandleStandardArgs)
+
+find_package(PkgConfig QUIET)
+pkg_search_module(SPIRV-Tools QUIET IMPORTED_TARGET SPIRV-Tools)
+find_package_handle_standard_args(SPIRV-Tools
+ REQUIRED_VARS SPIRV-Tools_LINK_LIBRARIES
+ VERSION_VAR SPIRV-Tools_VERSION
+)
+
+if (SPIRV-Tools_FOUND AND NOT TARGET SPIRV-Tools::SPIRV-Tools)
+ if (TARGET SPIRV-Tools)
+ add_library(SPIRV-Tools::SPIRV-Tools ALIAS SPIRV-Tools)
+ else()
+ add_library(SPIRV-Tools::SPIRV-Tools ALIAS PkgConfig::SPIRV-Tools)
+ endif()
+endif()
diff --git a/CMakeModules/Findzstd.cmake b/CMakeModules/Findzstd.cmake
index ae3ea08653..bf38d20fbf 100644
--- a/CMakeModules/Findzstd.cmake
+++ b/CMakeModules/Findzstd.cmake
@@ -3,17 +3,12 @@
include(FindPackageHandleStandardArgs)
-find_package(zstd QUIET CONFIG)
-if (zstd_CONSIDERED_CONFIGS)
- find_package_handle_standard_args(zstd CONFIG_MODE)
-else()
- find_package(PkgConfig QUIET)
- pkg_search_module(ZSTD QUIET IMPORTED_TARGET libzstd)
- find_package_handle_standard_args(zstd
- REQUIRED_VARS ZSTD_LINK_LIBRARIES
- VERSION_VAR ZSTD_VERSION
- )
-endif()
+find_package(PkgConfig QUIET)
+pkg_search_module(ZSTD QUIET IMPORTED_TARGET libzstd)
+find_package_handle_standard_args(zstd
+ REQUIRED_VARS ZSTD_LINK_LIBRARIES
+ VERSION_VAR ZSTD_VERSION
+)
if (zstd_FOUND AND NOT TARGET zstd::zstd)
if (TARGET zstd::libzstd_shared)
diff --git a/cpmfile.json b/cpmfile.json
new file mode 100644
index 0000000000..495382fed0
--- /dev/null
+++ b/cpmfile.json
@@ -0,0 +1,147 @@
+{
+ "openssl": {
+ "ci": true,
+ "package": "OpenSSL",
+ "name": "openssl",
+ "repo": "crueter-ci/OpenSSL",
+ "version": "3.5.2",
+ "min_version": "1.1.1"
+ },
+ "boost": {
+ "package": "Boost",
+ "repo": "boostorg/boost",
+ "tag": "boost-1.88.0",
+ "artifact": "boost-1.88.0-cmake.7z",
+ "hash": "e5b049e5b61964480ca816395f63f95621e66cb9bcf616a8b10e441e0e69f129e22443acb11e77bc1e8170f8e4171b9b7719891efc43699782bfcd4b3a365f01",
+ "git_version": "1.88.0",
+ "version": "1.57"
+ },
+ "fmt": {
+ "repo": "fmtlib/fmt",
+ "sha": "40626af88b",
+ "hash": "d59f06c24339f223de4ec2afeba1c67b5835a0f350a1ffa86242a72fc3e616a6b8b21798355428d4200c75287308b66634619ffa0b52ba5bd74cc01772ea1a8a",
+ "version": "8",
+ "options": [
+ "FMT_INSTALL OFF"
+ ]
+ },
+ "lz4": {
+ "name": "lz4",
+ "repo": "lz4/lz4",
+ "sha": "ebb370ca83",
+ "hash": "43600e87b35256005c0f2498fa56a77de6783937ba4cfce38c099f27c03188d097863e8a50c5779ca0a7c63c29c4f7ed0ae526ec798c1fd2e3736861b62e0a37",
+ "source_subdir": "build/cmake"
+ },
+ "nlohmann": {
+ "package": "nlohmann_json",
+ "repo": "nlohmann/json",
+ "sha": "55f93686c0",
+ "hash": "b739749b066800e21154506ea150d2c5cbce8a45344177f46f884547a1399d26753166fd0df8135269ce28cf223552b1b65cd625b88c844d54753f2434900486",
+ "version": "3.8"
+ },
+ "zlib": {
+ "package": "ZLIB",
+ "repo": "madler/zlib",
+ "sha": "51b7f2abda",
+ "hash": "16eaf1f3752489d12fd9ce30f7b5f7cbd5cb8ff53d617005a9847ae72d937f65e01e68be747f62d7ac19fd0c9aeba9956e60f16d6b465c5fdc2f3d08b4db2e6c",
+ "version": "1.2",
+ "options": [
+ "ZLIB_BUILD_SHARED OFF",
+ "ZLIB_INSTALL OFF"
+ ]
+ },
+ "zstd": {
+ "repo": "facebook/zstd",
+ "sha": "f8745da6ff",
+ "hash": "3037007f990040fe32573b46f9bef8762fd5dbeeb07ffffcbfeba51ec98167edae39bb9c87f9299efcd61c4e467c5e84f7c19f0df7799bc1fc04864a278792ee",
+ "version": "1.5",
+ "source_subdir": "build/cmake",
+ "find_args": "MODULE",
+ "options": [
+ "ZSTD_BUILD_SHARED OFF"
+ ]
+ },
+ "catch2": {
+ "package": "Catch2",
+ "repo": "catchorg/Catch2",
+ "sha": "644821ce28",
+ "hash": "f8795f98acf2c02c0db8e734cc866d5caebab4b4a306e93598b97cb3c0c728dafe8283dce27ffe8d42460e5ae7302f3f32e7e274a7f991b73511ac88eef21b1f",
+ "version": "3.0.1"
+ },
+ "enet": {
+ "repo": "lsalzman/enet",
+ "sha": "2662c0de09",
+ "hash": "3de1beb4fa3d6b1e03eda8dd1e7580694f854af3ed3975dcdabfdcdf76b97f322b9734d35ea7f185855bb490d957842b938b26da4dd2dfded509390f8d2794dd",
+ "version": "1.3",
+ "find_args": "MODULE"
+ },
+ "opus": {
+ "package": "Opus",
+ "repo": "xiph/opus",
+ "sha": "5ded705cf4",
+ "hash": "0dc89e58ddda1f3bc6a7037963994770c5806c10e66f5cc55c59286fc76d0544fe4eca7626772b888fd719f434bc8a92f792bdb350c807968b2ac14cfc04b203",
+ "version": "1.3",
+ "find_args": "MODULE",
+ "options": [
+ "OPUS_BUILD_TESTING OFF",
+ "OPUS_BUILD_PROGRAMS OFF",
+ "OPUS_INSTALL_PKG_CONFIG_MODULE OFF",
+ "OPUS_INSTALL_CMAKE_CONFIG_MODULE OFF"
+ ]
+ },
+ "cubeb": {
+ "repo": "mozilla/cubeb",
+ "sha": "fa02160712",
+ "hash": "82d808356752e4064de48c8fecbe7856715ade1e76b53937116bf07129fc1cc5b3de5e4b408de3cd000187ba8dc32ca4109661cb7e0355a52e54bd81b9be1c61",
+ "find_args": "CONFIG",
+ "options": [
+ "USE_SANITIZERS OFF",
+ "BUILD_TESTS OFF",
+ "BUILD_TOOLS OFF",
+ "BUNDLE_SPEEX ON"
+ ]
+ },
+ "boost_headers": {
+ "repo": "boostorg/headers",
+ "sha": "0456900fad",
+ "hash": "50cd75dcdfc5f082225cdace058f47b4fb114a47585f7aee1d22236a910a80b667186254c214fa2fcebac67ae6d37ba4b6e695e1faea8affd6fd42a03cf996e3",
+ "bundled": true
+ },
+ "discord-rpc": {
+ "repo": "eden-emulator/discord-rpc",
+ "sha": "1cf7772bb6",
+ "hash": "e9b35e6f2c075823257bcd59f06fe7bb2ccce1976f44818d2e28810435ef79c712a3c4f20f40da41f691342a4058cf86b078eb7f9d9e4dae83c0547c21ec4f97"
+ },
+ "simpleini": {
+ "package": "SimpleIni",
+ "repo": "brofield/simpleini",
+ "sha": "09c21bda1d",
+ "hash": "99779ca9b6e040d36558cadf484f9ffdab5b47bcc8fc72e4d33639d1d60c0ceb4410d335ba445d72a4324e455167fd6769d99b459943aa135bec085dff2d4b7c",
+ "find_args": "MODULE"
+ },
+ "sdl2_generic": {
+ "package": "SDL2",
+ "repo": "libsdl-org/SDL",
+ "sha": "54772f345a",
+ "hash": "2a68a0e01c390043aa9d9df63d8a20a52076c88bb460ac4e0f33194ca7d9bc8fadbbcc04e7506872ac4b6354a73fbc267c036f82200da59465789b87c7d9e3a4",
+ "key": "generic",
+ "bundled": true
+ },
+ "sdl2_steamdeck": {
+ "package": "SDL2",
+ "repo": "libsdl-org/SDL",
+ "sha": "cc016b0046",
+ "hash": "34d5ef58da6a4f9efa6689c82f67badcbd741f5a4f562a9c2c30828fa839830fb07681c5dc6a7851520e261c8405a416ac0a2c2513b51984fb3b4fa4dcb3e20b",
+ "key": "steamdeck",
+ "bundled": true
+ },
+ "sdl2": {
+ "ci": true,
+ "package": "SDL2",
+ "name": "SDL2",
+ "repo": "crueter-ci/SDL2",
+ "version": "2.32.8",
+ "min_version": "2.26.4",
+ "cmake_filename": "sdl2"
+ }
+}
diff --git a/docs/CPM.md b/docs/CPM.md
new file mode 100644
index 0000000000..f90002891c
--- /dev/null
+++ b/docs/CPM.md
@@ -0,0 +1,252 @@
+# CPM
+
+CPM (CMake Package Manager) is the preferred method of managing dependencies within Eden.
+
+Global Options:
+
+- `YUZU_USE_CPM` is set by default on MSVC and Android. Other platforms should use this if certain "required" system dependencies (e.g. OpenSSL) are broken or missing
+ * If this is `OFF`, required system dependencies will be searched via `find_package`, although certain externals use CPM regardless.
+- `CPMUTIL_FORCE_SYSTEM` (default `OFF`): Require all CPM dependencies to use system packages. NOT RECOMMENDED!
+ * Many packages, e.g. mcl, sirit, xbyak, discord-rpc, are not generally available as a system package.
+ * You may optionally override these (see CPMUtil section)
+- `CPMUTIL_FORCE_BUNDLED` (default `ON` on MSVC and Android, `OFF` elsewhere): Require all CPM dependencies to use bundled packages.
+
+## CPMUtil
+
+CPMUtil is a wrapper around CPM that aims to reduce boilerplate and add useful utility functions to make dependency management a piece of cake.
+
+### AddPackage
+
+`AddPackage` is the core of the CPMUtil wrapper, and is generally the lowest level you will need to go when dealing with dependencies.
+
+**Identification/Fetching**
+
+- `NAME` (required): The package name (must be the same as the `find_package` name if applicable)
+- `VERSION`: The minimum version of this package that can be used on the system
+- `GIT_VERSION`: The version found within git, only used for identification
+- `URL`: The URL to fetch.
+- `REPO`: The GitHub repo to use (`owner/repo`).
+ * Only GitHub is supported for now, though other platforms will see support at some point
+- `TAG`: The tag to fetch, if applicable.
+- `ARTIFACT`: The name of the artifact, if applicable.
+- `SHA`: Commit sha to fetch, if applicable.
+- `BRANCH`: Branch to fetch, if applicable.
+
+The following configurations are supported, in descending order of precedence:
+
+- `URL`: Bare URL download, useful for custom artifacts
+ * If this is set, `GIT_URL` or `REPO` should be set to allow the dependency viewer to link to the project's Git repository.
+ * If this is NOT set, `REPO` must be defined.
+- `REPO + TAG + ARTIFACT`: GitHub release artifact
+ * The final download URL will be `https://github.com/${REPO}/releases/download/${TAG}/${ARTIFACT}`
+ * Useful for prebuilt libraries and prefetched archives
+- `REPO + TAG`: GitHub tag archive
+ * The final download URL will be `https://github.com/${REPO}/archive/refs/tags/${TAG}.tar.gz`
+ * Useful for pinning to a specific tag, better for build identification
+- `REPO + SHA`: GitHub commit archive
+ * The final download URL will be `https://github.com/${REPO}/archive/${SHA}.zip`
+ * Useful for pinning to a specific commit
+- `REPO + BRANCH`: GitHub branch archive
+ * The final download URL will be `https://github.com/${REPO}/archive/refs/heads/${BRANCH}.zip`
+ * Generally not recommended unless the branch is frozen
+- `REPO`: GitHub master archive
+ * The final download URL will be `https://github.com/${REPO}/archive/refs/heads/master.zip`
+ * Generally not recommended unless the project is dead
+
+**Hashing**
+
+Hashing is used for verifying downloads. It's highly recommended to use these.
+
+- `HASH_ALGO` (default `SHA512`): Hash algorithm to use
+
+Hashing strategies, descending order of precedence:
+
+- `HASH`: Bare hash verification, useful for static downloads e.g. commit archives
+- `HASH_SUFFIX`: Download the hash as `${DOWNLOAD_URL}.${HASH_SUFFIX}`
+ * The downloaded hash *must* match the hash algorithm and contain nothing but the hash; no filenames or extra content.
+- `HASH_URL`: Download the hash from a separate URL
+
+**Additional Options**
+
+- `KEY`: Custom cache key to use (stored as `.cache/cpm/${packagename_lower}/${key}`)
+ * Default is based on, in descending order of precedence:
+ - First 4 characters of the sha
+ - `GIT_VERSION`, or `VERSION` if not specified
+ - Tag
+ - Otherwise, CPM defaults will be used. This is not recommended as it doesn't produce reproducible caches
+- `DOWNLOAD_ONLY`: Whether or not to configure the downloaded package via CMake
+ * Useful to turn `OFF` if the project doesn't use CMake
+- `SOURCE_SUBDIR`: Subdirectory of the project containing a CMakeLists.txt file
+- `FIND_PACKAGE_ARGUMENTS`: Arguments to pass to the `find_package` call
+- `BUNDLED_PACKAGE`: Set to `ON` to force the usage of a bundled package
+- `OPTIONS`: Options to pass to the configuration of the package
+- `PATCHES`: Patches to apply to the package, stored in `.patch/${packagename_lower}/0001-patch-name.patch` and so on
+- Other arguments can be passed to CPM as well
+
+**Extra Variables**
+
+For each added package, users may additionally force usage of the system/bundled package.
+
+- `${package}_FORCE_SYSTEM`: Require the package to be installed on the system
+- `${package}_FORCE_BUNDLED`: Force the package to be fetched and use the bundled version
+
+**Bundled/System Switching**
+
+Descending order of precedence:
+- If `${package}_FORCE_SYSTEM` is true, requires the package to be on the system
+- If `${package}_FORCE_BUNDLED` is true, forcefully uses the bundled package
+- If `CPMUTIL_FORCE_SYSTEM` is true, requires the package to be on the system
+- If `CPMUTIL_FORCE_BUNDLED` is true, forcefully uses the bundled package
+- If the `BUNDLED_PACKAGE` argument is true, forcefully uses the bundled package
+- Otherwise, CPM will search for the package first, and if not found, will use the bundled package
+
+**Identification**
+
+All dependencies must be identifiable in some way for usage in the dependency viewer. Lists are provided in descending order of precedence.
+
+URLs:
+
+- `GIT_URL`
+- `REPO` as a GitHub repository
+- `URL`
+
+Versions (bundled):
+
+- `SHA`
+- `GIT_VERSION`
+- `VERSION`
+- `TAG`
+- "unknown"
+
+If the package is a system package, AddPackage will attempt to determine the package version and append ` (system)` to the identifier. Otherwise, it will be marked as `unknown (system)`
+
+### AddCIPackage
+
+Adds a package that follows crueter's CI repository spec.
+
+- `VERSION` (required): The version to get (the tag will be `v${VERSION}`)
+- `NAME` (required): Name used within the artifacts
+- `REPO` (required): CI repository, e.g. `crueter-ci/OpenSSL`
+- `PACKAGE` (required): `find_package` package name
+- `EXTENSION`: Artifact extension (default `tar.zst`)
+- `MIN_VERSION`: Minimum version for `find_package`. Only used if platform does not support this package as a bundled artifact
+- `DISABLED_PLATFORMS`: List of platforms that lack artifacts for this package. One of:
+ * `windows-amd64`
+ * `windows-arm64`
+ * `android`
+ * `solaris`
+ * `freebsd`
+ * `linux`
+ * `linux-aarch64`
+- `CMAKE_FILENAME`: Custom CMake filename, relative to the package root (default `${PACKAGE_ROOT}/${NAME}.cmake`)
+
+### AddJsonPackage
+
+This is the recommended method of usage for CPMUtil. In each directory that utilizes `CPMUtil`, there must be a `cpmfile.json` that defines dependencies in a similar manner to the individual calls.
+
+The cpmfile is an object of objects, with each sub-object being named according to the package's identifier, e.g. `openssl`, which can then be fetched with `AddJsonPackage(<identifier>)`. Options are designed to map closely to the argument names, and are always strings unless otherwise specified.
+
+- `package` -> `NAME` (`PACKAGE` for CI), defaults to the object key
+- `repo` -> `REPO`
+- `version` -> `VERSION`
+- `ci` (bool)
+
+If `ci` is `false`:
+
+- `hash` -> `HASH`
+- `sha` -> `SHA`
+- `tag` -> `TAG`
+- `artifact` -> `ARTIFACT`
+- `git_version` -> `GIT_VERSION`
+- `source_subdir` -> `SOURCE_SUBDIR`
+- `bundled` -> `BUNDLED_PACKAGE`
+- `find_args` -> `FIND_PACKAGE_ARGUMENTS`
+- `patches` -> `PATCHES` (array)
+- `options` -> `OPTIONS` (array)
+
+Other arguments aren't currently supported. If you wish to add them, see the `AddJsonPackage` function in `CMakeModules/CPMUtil.cmake`.
+
+If `ci` is `true`:
+
+- `name` -> `NAME`, defaults to the object key
+- `extension` -> `EXTENSION`, defaults to `tar.zst`
+- `min_version` -> `MIN_VERSION`
+- `cmake_filename` -> `CMAKE_FILENAME`
+- `extension` -> `EXTENSION`
+
+### Examples
+
+In order: OpenSSL CI, Boost (tag + artifact), discord-rpc (sha + options + patches), Opus (options + find_args)
+
+```json
+{
+ "openssl": {
+ "ci": true,
+ "package": "OpenSSL",
+ "name": "openssl",
+ "repo": "crueter-ci/OpenSSL",
+ "version": "3.5.2",
+ "min_version": "1.1.1"
+ },
+ "boost": {
+ "package": "Boost",
+ "repo": "boostorg/boost",
+ "tag": "boost-1.88.0",
+ "artifact": "boost-1.88.0-cmake.7z",
+ "hash": "e5b049e5b61964480ca816395f63f95621e66cb9bcf616a8b10e441e0e69f129e22443acb11e77bc1e8170f8e4171b9b7719891efc43699782bfcd4b3a365f01",
+ "git_version": "1.88.0",
+ "version": "1.57"
+ },
+ "opus": {
+ "package": "Opus",
+ "repo": "xiph/opus",
+ "sha": "5ded705cf4",
+ "hash": "0dc89e58ddda1f3bc6a7037963994770c5806c10e66f5cc55c59286fc76d0544fe4eca7626772b888fd719f434bc8a92f792bdb350c807968b2ac14cfc04b203",
+ "version": "1.3",
+ "find_args": "MODULE",
+ "options": [
+ "OPUS_BUILD_TESTING OFF",
+ "OPUS_BUILD_PROGRAMS OFF",
+ "OPUS_INSTALL_PKG_CONFIG_MODULE OFF",
+ "OPUS_INSTALL_CMAKE_CONFIG_MODULE OFF"
+ ]
+ },
+ "discord-rpc": {
+ "repo": "discord/discord-rpc",
+ "sha": "963aa9f3e5",
+ "hash": "386e1344e9a666d730f2d335ee3aef1fd05b1039febefd51aa751b705009cc764411397f3ca08dffd46205c72f75b235c870c737b2091a4ed0c3b061f5919bde",
+ "options": [
+ "BUILD_EXAMPLES OFF"
+ ],
+ "patches": [
+ "0001-cmake-version.patch",
+ "0002-no-clang-format.patch",
+ "0003-fix-cpp17.patch"
+ ]
+ },
+}
+```
+
+### Inclusion
+
+To include CPMUtil:
+
+```cmake
+set(CPMUTIL_JSON_FILE ${CMAKE_CURRENT_SOURCE_DIR}/cpmfile.json)
+include(CPMUtil)
+```
+
+You may omit the first line if you are not utilizing cpmfile.
+
+## Prefetching
+
+- To prefetch a CPM dependency (requires cpmfile):
+ * `tools/cpm-fetch.sh <packages>`
+- To prefetch all CPM dependencies:
+ * `tools/cpm-fetch-all.sh`
+
+Currently, `cpm-fetch.sh` defines the following directories for cpmfiles:
+
+`externals src/yuzu/externals externals/ffmpeg src/dynarmic/externals externals/nx_tzdb`
+
+Whenever you add a new cpmfile, update the script accordingly \ No newline at end of file
diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt
index 07e9ae7a8f..b209b48db9 100644
--- a/externals/CMakeLists.txt
+++ b/externals/CMakeLists.txt
@@ -7,7 +7,8 @@
# TODO(crueter): A lot of this should be moved to the root.
# otherwise we have to do weird shenanigans with library linking and stuff
-# cpm
+# Explicitly include CPMUtil here since we have a separate cpmfile for externals
+set(CPMUTIL_JSON_FILE ${CMAKE_CURRENT_SOURCE_DIR}/cpmfile.json)
include(CPMUtil)
# Explicitly declare this option here to propagate to the oaknut CPM call
@@ -33,32 +34,15 @@ endif()
# Xbyak (also used by Dynarmic, so needs to be added first)
if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
if (PLATFORM_SUN)
- # Fix regset.h collisions
- set(XBYAK_HASH 51f507b0b3)
- set(XBYAK_SHA512SUM 4a29a3c2f97f7d5adf667a21a008be03c951fb6696b0d7ba27e7e4afa037bc76eb5e059bb84860e01baf741d4d3ac851b840cd54c99d038812fbe0f1fa6d38a4)
+ AddJsonPackage(xbyak_sun)
else()
- set(XBYAK_HASH 4e44f4614d)
- set(XBYAK_SHA512SUM 5824e92159e07fa36a774aedd3b3ef3541d0241371d522cffa4ab3e1f215fa5097b1b77865b47b2481376c704fa079875557ea463ca63d0a7fd6a8a20a589e70)
+ AddJsonPackage(xbyak)
endif()
-
- AddPackage(
- NAME xbyak
- REPO "Lizzie841/xbyak"
- SHA ${XBYAK_HASH}
- HASH ${XBYAK_SHA512SUM}
- BUNDLED_PACKAGE ON
- )
endif()
# Oaknut (also used by Dynarmic, so needs to be added first)
if (ARCHITECTURE_arm64 OR DYNARMIC_TESTS)
- AddPackage(
- NAME oaknut
- VERSION 2.0.1
- REPO "merryhime/oaknut"
- SHA 94c726ce03
- HASH d8d082242fa1881abce3c82f8dafa002c4e561e66a69e7fc038af67faa5eff2630f082d3d19579c88c4c9f9488e54552accc8cb90e7ce743efe043b6230c08ac
- )
+ AddJsonPackage(oaknut)
endif()
# getopt
@@ -70,14 +54,7 @@ endif()
add_subdirectory(glad)
# mbedtls
-AddPackage(
- NAME mbedtls
- REPO "Mbed-TLS/mbedtls"
- SHA "8c88150ca1"
- HASH 769ad1e94c570671071e1f2a5c0f1027e0bf6bcdd1a80ea8ac970f2c86bc45ce4e31aa88d6d8110fc1bed1de81c48bc624df1b38a26f8b340a44e109d784a966
- PATCHES
- ${CMAKE_SOURCE_DIR}/.patch/mbedtls/0001-cmake-version.patch
-)
+AddJsonPackage(mbedtls)
if (mbedtls_ADDED)
target_include_directories(mbedtls PUBLIC ${mbedtls_SOURCE_DIR}/include)
@@ -97,23 +74,11 @@ endif()
# Sirit
# TODO(crueter): spirv-tools doesn't work w/ system
set(SPIRV_WERROR OFF)
-AddPackage(
- NAME SPIRV-Headers
- REPO "KhronosGroup/SPIRV-Headers"
- SHA 4e209d3d7e
- HASH f48bbe18341ed55ea0fe280dbbbc0a44bf222278de6e716e143ca1e95ca320b06d4d23d6583fbf8d03e1428f3dac8fa00e5b82ddcd6b425e6236d85af09550a4
-)
+AddJsonPackage(spirv-headers)
-AddPackage(
- NAME sirit
- REPO "eden-emulator/sirit"
- SHA db1f1e8ab5
- HASH 73eb3a042848c63a10656545797e85f40d142009dfb7827384548a385e1e28e1ac72f42b25924ce530d58275f8638554281e884d72f9c7aaf4ed08690a414b05
- OPTIONS
- "SIRIT_USE_SYSTEM_SPIRV_HEADERS ON"
-)
+AddJsonPackage(sirit)
-if(MSVC AND USE_CCACHE AND TARGET sirit)
+if(MSVC AND USE_CCACHE AND sirit_ADDED)
get_target_property(_opts sirit COMPILE_OPTIONS)
list(FILTER _opts EXCLUDE REGEX "/Zi")
list(APPEND _opts "/Z7")
@@ -122,33 +87,12 @@ endif()
# httplib
if (ENABLE_WEB_SERVICE OR ENABLE_QT_UPDATE_CHECKER)
- AddPackage(
- NAME httplib
- REPO "yhirose/cpp-httplib"
- SHA a609330e4c
- HASH dd3fd0572f8367d8549e1319fd98368b3e75801a293b0c3ac9b4adb806473a4506a484b3d389dc5bee5acc460cb90af7a20e5df705a1696b56496b30b9ce7ed2
- OPTIONS
- "HTTPLIB_REQUIRE_OPENSSL ${ENABLE_OPENSSL}"
- )
+ AddJsonPackage(httplib)
endif()
# cpp-jwt
if (ENABLE_WEB_SERVICE)
- AddPackage(
- NAME cpp-jwt
- VERSION 1.4
- REPO "arun11299/cpp-jwt"
- SHA a54fa08a3b
- HASH a90f7e594ada0c7e49d5ff9211c71097534e7742a8e44bf0851b0362642a7271d53f5d83d04eeaae2bad17ef3f35e09e6818434d8eaefa038f3d1f7359d0969a
- FIND_PACKAGE_ARGUMENTS "CONFIG"
- OPTIONS
- "CPP_JWT_BUILD_EXAMPLES OFF"
- "CPP_JWT_BUILD_TESTS OFF"
- "CPP_JWT_USE_VENDORED_NLOHMANN_JSON OFF"
- PATCHES
- ${CMAKE_SOURCE_DIR}/.patch/cpp-jwt/0001-no-install.patch
- ${CMAKE_SOURCE_DIR}/.patch/cpp-jwt/0002-missing-decl.patch
- )
+ AddJsonPackage(cpp-jwt)
endif()
# unordered_dense
@@ -175,47 +119,33 @@ endif()
# TODO(crueter): Vk1.4 impl
-AddPackage(
- NAME VulkanHeaders
- VERSION 1.3.274
- REPO "KhronosGroup/Vulkan-Headers"
- SHA 89268a6d17
- HASH 3ab349f74298ba72cafb8561015690c0674d428a09fb91ccd3cd3daca83650d190d46d33fd97b0a8fd4223fe6df2bcabae89136fbbf7c0bfeb8776f9448304c8
+AddJsonPackage(
+ NAME vulkan-headers
BUNDLED_PACKAGE ${YUZU_USE_EXTERNAL_VULKAN_HEADERS}
)
# Vulkan-Utility-Libraries
-AddPackage(
- NAME VulkanUtilityLibraries
- REPO "KhronosGroup/Vulkan-Utility-Libraries"
- SHA df2e358152
- HASH 3e468c3d9ff93f6d418d71e5527abe0a12c8c7ab5b0b52278bbbee4d02bb87e99073906729b727e0147242b7e3fd5dedf68b803f1878cb4c0e4f730bc2238d79
+AddJsonPackage(
+ NAME vulkan-utility-libraries
BUNDLED_PACKAGE ${YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES}
)
-# SPIRV-Tools
-if (YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS)
- AddPackage(
- NAME SPIRV-Tools
- REPO "KhronosGroup/SPIRV-Tools"
- SHA 40eb301f32
- HASH 58d0fb1047d69373cf24c73e6f78c73a72a6cca3b4df1d9f083b9dcc0962745ef154abf3dbe9b3623b835be20c6ec769431cf11733349f45e7568b3525f707aa
- OPTIONS
- "SPIRV_SKIP_EXECUTABLES ON"
- )
+# SPIRV Tools
+AddJsonPackage(
+ NAME spirv-tools
+ BUNDLED_PACKAGE ${YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS}
+)
+
+if (SPIRV-Tools_ADDED)
+ add_library(SPIRV-Tools::SPIRV-Tools ALIAS SPIRV-Tools-static)
+ target_link_libraries(SPIRV-Tools-static PRIVATE SPIRV-Tools-opt SPIRV-Tools-link)
endif()
# TZDB (Time Zone Database)
add_subdirectory(nx_tzdb)
# VMA
-AddPackage(
- NAME VulkanMemoryAllocator
- REPO "GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator"
- SHA 1076b348ab
- HASH a46b44e4286d08cffda058e856c47f44c7fed3da55fe9555976eb3907fdcc20ead0b1860b0c38319cda01dbf9b1aa5d4b4038c7f1f8fbd97283d837fa9af9772
- FIND_PACKAGE_ARGUMENTS "CONFIG"
-)
+AddJsonPackage(vulkan-memory-allocator)
if (NOT TARGET LLVM::Demangle)
add_library(demangle demangle/ItaniumDemangle.cpp)
@@ -245,17 +175,8 @@ if (NOT TARGET RenderDoc::API)
add_library(RenderDoc::API ALIAS renderdoc)
endif()
-if (ANDROID)
- if (ARCHITECTURE_arm64)
- AddPackage(
- NAME libadrenotools
- REPO "bylaws/libadrenotools"
- SHA 8fae8ce254
- HASH c74fa855f0edebbf25c9bce40b00966daa2447bfc5e15f0cf1a95f86cbf70fc6b02590707edbde16328a0a2a4fb9a1fc419d2dfc22a4a4150971be91892d4edb
- PATCHES
- ${CMAKE_SOURCE_DIR}/.patch/libadrenotools/0001-linkerns-cpm.patch
- )
- endif()
+if (ANDROID AND ARCHITECTURE_arm64)
+ AddJsonPackage(libadrenotools)
endif()
if (UNIX AND NOT APPLE AND NOT TARGET gamemode::headers)
@@ -278,6 +199,7 @@ if (YUZU_CRASH_DUMPS AND NOT TARGET libbreakpad_client)
_CRT_NONSTDC_NO_DEPRECATE
)
+ # TODO
AddPackage(
NAME breakpad
URL "google/breakpad"
@@ -378,13 +300,7 @@ endif()
# oboe
if (ANDROID)
- AddPackage(
- NAME oboe
- REPO "google/oboe"
- SHA 2bc873e53c
- HASH 02329058a7f9cf7d5039afaae5ab170d9f42f60f4c01e21eaf4f46073886922b057a9ae30eeac040b3ac182f51b9c1bfe9fe1050a2c9f6ce567a1a9a0ec2c768
- BUNDLED_PACKAGE ON
- )
+ AddJsonPackage(oboe)
add_library(oboe::oboe ALIAS oboe)
endif()
diff --git a/externals/cpmfile.json b/externals/cpmfile.json
new file mode 100644
index 0000000000..effcbcc01f
--- /dev/null
+++ b/externals/cpmfile.json
@@ -0,0 +1,109 @@
+{
+ "mbedtls": {
+ "repo": "Mbed-TLS/mbedtls",
+ "sha": "8c88150ca1",
+ "hash": "769ad1e94c570671071e1f2a5c0f1027e0bf6bcdd1a80ea8ac970f2c86bc45ce4e31aa88d6d8110fc1bed1de81c48bc624df1b38a26f8b340a44e109d784a966",
+ "patches": [
+ "0001-cmake-version.patch"
+ ]
+ },
+ "spirv-headers": {
+ "package": "SPIRV-Headers",
+ "repo": "KhronosGroup/SPIRV-Headers",
+ "sha": "4e209d3d7e",
+ "hash": "f48bbe18341ed55ea0fe280dbbbc0a44bf222278de6e716e143ca1e95ca320b06d4d23d6583fbf8d03e1428f3dac8fa00e5b82ddcd6b425e6236d85af09550a4"
+ },
+ "sirit": {
+ "repo": "eden-emulator/sirit",
+ "sha": "db1f1e8ab5",
+ "hash": "73eb3a042848c63a10656545797e85f40d142009dfb7827384548a385e1e28e1ac72f42b25924ce530d58275f8638554281e884d72f9c7aaf4ed08690a414b05",
+ "options": [
+ "SIRIT_USE_SYSTEM_SPIRV_HEADERS ON"
+ ]
+ },
+ "httplib": {
+ "repo": "yhirose/cpp-httplib",
+ "sha": "a609330e4c",
+ "hash": "dd3fd0572f8367d8549e1319fd98368b3e75801a293b0c3ac9b4adb806473a4506a484b3d389dc5bee5acc460cb90af7a20e5df705a1696b56496b30b9ce7ed2"
+ },
+ "cpp-jwt": {
+ "version": "1.4",
+ "repo": "arun11299/cpp-jwt",
+ "sha": "a54fa08a3b",
+ "hash": "a90f7e594ada0c7e49d5ff9211c71097534e7742a8e44bf0851b0362642a7271d53f5d83d04eeaae2bad17ef3f35e09e6818434d8eaefa038f3d1f7359d0969a",
+ "find_args": "CONFIG",
+ "options": [
+ "CPP_JWT_BUILD_EXAMPLES OFF",
+ "CPP_JWT_BUILD_TESTS OFF",
+ "CPP_JWT_USE_VENDORED_NLOHMANN_JSON OFF"
+ ],
+ "patches": [
+ "0001-no-install.patch",
+ "0002-missing-decl.patch"
+ ]
+ },
+ "vulkan-headers": {
+ "package": "VulkanHeaders",
+ "version": "1.3.274",
+ "repo": "KhronosGroup/Vulkan-Headers",
+ "sha": "89268a6d17",
+ "hash": "3ab349f74298ba72cafb8561015690c0674d428a09fb91ccd3cd3daca83650d190d46d33fd97b0a8fd4223fe6df2bcabae89136fbbf7c0bfeb8776f9448304c8"
+ },
+ "vulkan-utility-libraries": {
+ "package": "VulkanUtilityLibraries",
+ "repo": "KhronosGroup/Vulkan-Utility-Libraries",
+ "sha": "df2e358152",
+ "hash": "3e468c3d9ff93f6d418d71e5527abe0a12c8c7ab5b0b52278bbbee4d02bb87e99073906729b727e0147242b7e3fd5dedf68b803f1878cb4c0e4f730bc2238d79"
+ },
+ "vulkan-memory-allocator": {
+ "package": "VulkanMemoryAllocator",
+ "repo": "GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator",
+ "sha": "1076b348ab",
+ "hash": "a46b44e4286d08cffda058e856c47f44c7fed3da55fe9555976eb3907fdcc20ead0b1860b0c38319cda01dbf9b1aa5d4b4038c7f1f8fbd97283d837fa9af9772",
+ "find_args": "CONFIG"
+ },
+ "spirv-tools": {
+ "package": "SPIRV-Tools",
+ "repo": "KhronosGroup/SPIRV-Tools",
+ "sha": "40eb301f32",
+ "hash": "58d0fb1047d69373cf24c73e6f78c73a72a6cca3b4df1d9f083b9dcc0962745ef154abf3dbe9b3623b835be20c6ec769431cf11733349f45e7568b3525f707aa",
+ "find_args": "MODULE",
+ "options": [
+ "SPIRV_SKIP_EXECUTABLES ON"
+ ]
+ },
+ "xbyak_sun": {
+ "package": "xbyak",
+ "repo": "Lizzie841/xbyak",
+ "sha": "51f507b0b3",
+ "hash": "4a29a3c2f97f7d5adf667a21a008be03c951fb6696b0d7ba27e7e4afa037bc76eb5e059bb84860e01baf741d4d3ac851b840cd54c99d038812fbe0f1fa6d38a4",
+ "bundled": true
+ },
+ "xbyak": {
+ "package": "xbyak",
+ "repo": "Lizzie841/xbyak",
+ "sha": "4e44f4614d",
+ "hash": "5824e92159e07fa36a774aedd3b3ef3541d0241371d522cffa4ab3e1f215fa5097b1b77865b47b2481376c704fa079875557ea463ca63d0a7fd6a8a20a589e70",
+ "bundled": true
+ },
+ "oaknut": {
+ "version": "2.0.1",
+ "repo": "merryhime/oaknut",
+ "sha": "94c726ce03",
+ "hash": "d8d082242fa1881abce3c82f8dafa002c4e561e66a69e7fc038af67faa5eff2630f082d3d19579c88c4c9f9488e54552accc8cb90e7ce743efe043b6230c08ac"
+ },
+ "libadrenotools": {
+ "repo": "bylaws/libadrenotools",
+ "sha": "8fae8ce254",
+ "hash": "c74fa855f0edebbf25c9bce40b00966daa2447bfc5e15f0cf1a95f86cbf70fc6b02590707edbde16328a0a2a4fb9a1fc419d2dfc22a4a4150971be91892d4edb",
+ "patches": [
+ "0001-linkerns-cpm.patch"
+ ]
+ },
+ "oboe": {
+ "repo": "google/oboe",
+ "sha": "2bc873e53c",
+ "hash": "02329058a7f9cf7d5039afaae5ab170d9f42f60f4c01e21eaf4f46073886922b057a9ae30eeac040b3ac182f51b9c1bfe9fe1050a2c9f6ce567a1a9a0ec2c768",
+ "bundled": true
+ }
+}
diff --git a/externals/ffmpeg/CMakeLists.txt b/externals/ffmpeg/CMakeLists.txt
index 048ab36c17..b514ede3be 100644
--- a/externals/ffmpeg/CMakeLists.txt
+++ b/externals/ffmpeg/CMakeLists.txt
@@ -1,6 +1,10 @@
# SPDX-FileCopyrightText: 2021 yuzu Emulator Project
# SPDX-License-Identifier: GPL-2.0-or-later
+# Explicitly include CPMUtil here since we have a separate cpmfile for ffmpeg
+set(CPMUTIL_JSON_FILE ${CMAKE_CURRENT_SOURCE_DIR}/cpmfile.json)
+include(CPMUtil)
+
if (NOT WIN32 AND NOT ANDROID)
# Build FFmpeg from externals
message(STATUS "Using FFmpeg from externals")
@@ -19,13 +23,7 @@ if (NOT WIN32 AND NOT ANDROID)
message(FATAL_ERROR "Required program `autoconf` not found.")
endif()
- AddPackage(
- NAME ffmpeg
- REPO "FFmpeg/FFmpeg"
- SHA c2184b65d2
- HASH 2a89d664119debbb3c006ab1c48d5d7f26e889f4a65ad2e25c8b0503308295123d5a9c5c78bf683aef5ff09acef8c3fc2837f22d3e8c611528b933bf03bcdd97
- SYSTEM_PACKAGE OFF
- )
+ AddJsonPackage(ffmpeg)
set(FFmpeg_PREFIX ${ffmpeg_SOURCE_DIR})
set(FFmpeg_BUILD_DIR ${ffmpeg_BINARY_DIR})
diff --git a/externals/ffmpeg/cpmfile.json b/externals/ffmpeg/cpmfile.json
new file mode 100644
index 0000000000..dd9179703e
--- /dev/null
+++ b/externals/ffmpeg/cpmfile.json
@@ -0,0 +1,8 @@
+{
+ "ffmpeg": {
+ "repo": "FFmpeg/FFmpeg",
+ "sha": "c2184b65d2",
+ "hash": "2a89d664119debbb3c006ab1c48d5d7f26e889f4a65ad2e25c8b0503308295123d5a9c5c78bf683aef5ff09acef8c3fc2837f22d3e8c611528b933bf03bcdd97",
+ "bundled": true
+ }
+}
diff --git a/externals/nx_tzdb/CMakeLists.txt b/externals/nx_tzdb/CMakeLists.txt
index a86a97b4da..5812a62f98 100644
--- a/externals/nx_tzdb/CMakeLists.txt
+++ b/externals/nx_tzdb/CMakeLists.txt
@@ -1,6 +1,10 @@
# SPDX-FileCopyrightText: 2023 yuzu Emulator Project
# SPDX-License-Identifier: GPL-2.0-or-later
+# Explicitly include CPMUtil here since we have a separate cpmfile for nx_tzdb
+set(CPMUTIL_JSON_FILE ${CMAKE_CURRENT_SOURCE_DIR}/cpmfile.json)
+include(CPMUtil)
+
set(NX_TZDB_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/include")
add_library(nx_tzdb INTERFACE)
@@ -28,28 +32,15 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows" OR ANDROID)
endif()
set(NX_TZDB_VERSION "250725")
-set(NX_TZDB_ARCHIVE "${CPM_SOURCE_CACHE}/nx_tzdb/${NX_TZDB_VERSION}.zip")
-set(NX_TZDB_ROMFS_DIR "${CPM_SOURCE_CACHE}/nx_tzdb/tz")
+set(NX_TZDB_ROMFS_DIR "${CPM_SOURCE_CACHE}/nx_tzdb/")
if ((NOT CAN_BUILD_NX_TZDB OR YUZU_DOWNLOAD_TIME_ZONE_DATA) AND NOT EXISTS ${NX_TZDB_ROMFS_DIR})
- set(NX_TZDB_DOWNLOAD_URL "https://github.com/crueter/tzdb_to_nx/releases/download/${NX_TZDB_VERSION}/${NX_TZDB_VERSION}.zip")
-
- message(STATUS "Downloading time zone data from ${NX_TZDB_DOWNLOAD_URL}...")
- file(DOWNLOAD ${NX_TZDB_DOWNLOAD_URL} ${NX_TZDB_ARCHIVE}
- STATUS NX_TZDB_DOWNLOAD_STATUS)
- list(GET NX_TZDB_DOWNLOAD_STATUS 0 NX_TZDB_DOWNLOAD_STATUS_CODE)
- if (NOT NX_TZDB_DOWNLOAD_STATUS_CODE EQUAL 0)
- message(FATAL_ERROR "Time zone data download failed (status code ${NX_TZDB_DOWNLOAD_STATUS_CODE})")
- endif()
-
- file(ARCHIVE_EXTRACT
- INPUT
- ${NX_TZDB_ARCHIVE}
- DESTINATION
- ${NX_TZDB_ROMFS_DIR})
+ message(STATUS "Downloading time zone data...")
+ AddJsonPackage(tzdb)
elseif (CAN_BUILD_NX_TZDB AND NOT YUZU_DOWNLOAD_TIME_ZONE_DATA)
# TODO(crueter): this sucked to do with cpm, see if i can get it to work again
+ message(FATAL_ERROR "Building tzdb is currently unsupported. Check back later.")
add_subdirectory(tzdb_to_nx)
add_dependencies(nx_tzdb x80e)
@@ -79,24 +70,24 @@ function(CreateHeader ZONE_PATH HEADER_NAME)
endfunction()
CreateHeader(${NX_TZDB_ROMFS_DIR} base)
-CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo zoneinfo)
-CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Africa africa)
-CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/America america)
-CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/America/Argentina america_argentina)
-CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/America/Indiana america_indiana)
-CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/America/Kentucky america_kentucky)
-CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/America/North_Dakota america_north_dakota)
-CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Antarctica antarctica)
-CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Arctic arctic)
-CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Asia asia)
-CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Atlantic atlantic)
-CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Australia australia)
-CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Brazil brazil)
-CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Canada canada)
-CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Chile chile)
-CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Etc etc)
-CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Europe europe)
-CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Indian indian)
-CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Mexico mexico)
-CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Pacific pacific)
-CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/US us)
+CreateHeader(${NX_TZDB_ROMFS_DIR}/${NX_TZDB_VERSION} zoneinfo)
+CreateHeader(${NX_TZDB_ROMFS_DIR}/${NX_TZDB_VERSION}/Africa africa)
+CreateHeader(${NX_TZDB_ROMFS_DIR}/${NX_TZDB_VERSION}/America america)
+CreateHeader(${NX_TZDB_ROMFS_DIR}/${NX_TZDB_VERSION}/America/Argentina america_argentina)
+CreateHeader(${NX_TZDB_ROMFS_DIR}/${NX_TZDB_VERSION}/America/Indiana america_indiana)
+CreateHeader(${NX_TZDB_ROMFS_DIR}/${NX_TZDB_VERSION}/America/Kentucky america_kentucky)
+CreateHeader(${NX_TZDB_ROMFS_DIR}/${NX_TZDB_VERSION}/America/North_Dakota america_north_dakota)
+CreateHeader(${NX_TZDB_ROMFS_DIR}/${NX_TZDB_VERSION}/Antarctica antarctica)
+CreateHeader(${NX_TZDB_ROMFS_DIR}/${NX_TZDB_VERSION}/Arctic arctic)
+CreateHeader(${NX_TZDB_ROMFS_DIR}/${NX_TZDB_VERSION}/Asia asia)
+CreateHeader(${NX_TZDB_ROMFS_DIR}/${NX_TZDB_VERSION}/Atlantic atlantic)
+CreateHeader(${NX_TZDB_ROMFS_DIR}/${NX_TZDB_VERSION}/Australia australia)
+CreateHeader(${NX_TZDB_ROMFS_DIR}/${NX_TZDB_VERSION}/Brazil brazil)
+CreateHeader(${NX_TZDB_ROMFS_DIR}/${NX_TZDB_VERSION}/Canada canada)
+CreateHeader(${NX_TZDB_ROMFS_DIR}/${NX_TZDB_VERSION}/Chile chile)
+CreateHeader(${NX_TZDB_ROMFS_DIR}/${NX_TZDB_VERSION}/Etc etc)
+CreateHeader(${NX_TZDB_ROMFS_DIR}/${NX_TZDB_VERSION}/Europe europe)
+CreateHeader(${NX_TZDB_ROMFS_DIR}/${NX_TZDB_VERSION}/Indian indian)
+CreateHeader(${NX_TZDB_ROMFS_DIR}/${NX_TZDB_VERSION}/Mexico mexico)
+CreateHeader(${NX_TZDB_ROMFS_DIR}/${NX_TZDB_VERSION}/Pacific pacific)
+CreateHeader(${NX_TZDB_ROMFS_DIR}/${NX_TZDB_VERSION}/US us)
diff --git a/externals/nx_tzdb/cpmfile.json b/externals/nx_tzdb/cpmfile.json
new file mode 100644
index 0000000000..fc7dd77628
--- /dev/null
+++ b/externals/nx_tzdb/cpmfile.json
@@ -0,0 +1,8 @@
+{
+ "tzdb": {
+ "package": "nx_tzdb",
+ "url": "https://github.com/crueter/tzdb_to_nx/releases/download/250725/250725.zip",
+ "hash": "8f60b4b29f285e39c0443f3d5572a73780f3dbfcfd5b35004451fadad77f3a215b2e2aa8d0fffe7e348e2a7b0660882b35228b6178dda8804a14ce44509fd2ca",
+ "version": "250725"
+ }
+}
diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts
index 0cbb29b01b..d907284bb7 100644
--- a/src/android/app/build.gradle.kts
+++ b/src/android/app/build.gradle.kts
@@ -175,7 +175,10 @@ android {
"-DYUZU_USE_CPM=ON",
"-DYUZU_USE_BUNDLED_FFMPEG=ON",
"-DYUZU_ENABLE_LTO=ON",
- "-DCMAKE_EXPORT_COMPILE_COMMANDS=ON"
+ "-DCMAKE_EXPORT_COMPILE_COMMANDS=ON",
+ "-DBUILD_TESTING=OFF",
+ "-DYUZU_TESTS=OFF",
+ "-DDYNARMIC_TESTS=OFF"
)
abiFilters("arm64-v8a")
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index cbe1d35fc5..6173e29f45 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -272,13 +272,7 @@ if (lz4_ADDED)
endif()
target_link_libraries(common PUBLIC fmt::fmt stb::headers Threads::Threads)
-target_link_libraries(common PRIVATE lz4::lz4 LLVM::Demangle)
-
-if (TARGET libzstd_static)
- target_link_libraries(common PRIVATE libzstd_static)
-else()
- target_link_libraries(common PRIVATE zstd)
-endif()
+target_link_libraries(common PRIVATE lz4::lz4 LLVM::Demangle zstd::zstd)
if (TARGET unordered_dense::unordered_dense)
# weird quirk of system installs
diff --git a/src/dynarmic/externals/CMakeLists.txt b/src/dynarmic/externals/CMakeLists.txt
index 072558a618..23cfd42236 100644
--- a/src/dynarmic/externals/CMakeLists.txt
+++ b/src/dynarmic/externals/CMakeLists.txt
@@ -1,11 +1,11 @@
+# Explicitly include CPMUtil here since we have a separate cpmfile for dynarmic
+set(CPMUTIL_JSON_FILE ${CMAKE_CURRENT_SOURCE_DIR}/cpmfile.json)
include(CPMUtil)
# Always build externals as static libraries, even when dynarmic is built as shared
-if (BUILD_SHARED_LIBS)
- set(BUILD_SHARED_LIBS OFF)
- set(CMAKE_POSITION_INDEPENDENT_CODE ON)
- set_property(DIRECTORY PROPERTY EXCLUDE_FROM_ALL ON)
-endif()
+set(BUILD_SHARED_LIBS OFF)
+set(CMAKE_POSITION_INDEPENDENT_CODE ON)
+set_property(DIRECTORY PROPERTY EXCLUDE_FROM_ALL ON)
# Allow options shadowing with normal variables when subproject use old cmake policy
set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
@@ -22,42 +22,32 @@ set(BUILD_TESTING OFF)
if ("riscv" IN_LIST ARCHITECTURE)
add_subdirectory(biscuit)
- AddPackage(
+ AddJsonPackage(
NAME biscuit
- VERSION 0.9.1
- REPO "lioncash/biscuit"
- SHA 76b0be8dae
- HASH 47d55ed02d032d6cf3dc107c6c0a9aea686d5f25aefb81d1af91db027b6815bd5add1755505e19d76625feeb17aa2db6cd1668fe0dad2e6a411519bde6ca4489
BUNDLED_PACKAGE ${DYNARMIC_USE_BUNDLED_EXTERNALS}
)
endif()
# catch
-# TODO(crueter): dedup
-if (NOT TARGET Catch2::Catch2WithMain)
- if (DYNARMIC_TESTS)
- find_package(Catch2 3.0.1 REQUIRED)
- endif()
-endif()
+# if (NOT TARGET Catch2::Catch2WithMain)
+# if (DYNARMIC_TESTS)
+# find_package(Catch2 3.0.1 REQUIRED)
+# endif()
+# endif()
# fmt
-if (NOT TARGET fmt::fmt)
- # fmtlib formatting library
- set(FMT_INSTALL ON)
- add_subdirectory(fmt)
-endif()
+# if (NOT TARGET fmt::fmt)
+# # fmtlib formatting library
+# set(FMT_INSTALL ON)
+# add_subdirectory(fmt)
+# endif()
# mcl
-AddPackage(
+AddJsonPackage(
NAME mcl
- VERSION 0.1.12
- REPO "azahar-emu/mcl"
- SHA 7b08d83418
- HASH f943bac39c1879986decad7a442ff4288eaeca4a2907684c7914e115a55ecc43c2782ded85c0835763fe04e40d5c82220ce864423e489e648e408a84f54dc4f3
- OPTIONS
- "MCL_INSTALL OFF"
+ BUNDLED_PACKAGE ${DYNARMIC_USE_BUNDLED_EXTERNALS}
)
# oaknut
@@ -72,14 +62,9 @@ AddPackage(
# unordered_dense
-AddPackage(
- NAME unordered_dense
- REPO "Lizzie841/unordered_dense"
- SHA e59d30b7b1
- HASH 71eff7bd9ba4b9226967bacd56a8ff000946f8813167cb5664bb01e96fb79e4e220684d824fe9c59c4d1cc98c606f13aff05b7940a1ed8ab3c95d6974ee34fa0
- FIND_PACKAGE_ARGUMENTS "CONFIG"
- OPTIONS
- "UNORDERED_DENSE_INSTALL OFF"
+AddJsonPackage(
+ NAME unordered-dense
+ BUNDLED_PACKAGE ${DYNARMIC_USE_BUNDLED_EXTERNALS}
)
# xbyak
@@ -95,31 +80,12 @@ AddPackage(
# TODO(crueter): maybe it's just Gentoo but zydis system package really sucks
if ("x86_64" IN_LIST ARCHITECTURE)
+ set(CMAKE_DISABLE_FIND_PACKAGE_Doxygen ON)
# TODO(crueter): system zycore doesn't work with zydis
- AddPackage(
- NAME Zycore
- REPO "zyantific/zycore-c"
- SHA 75a36c45ae
- HASH 15aa399f39713e042c4345bc3175c82f14dca849fde2a21d4f591f62c43e227b70d868d8bb86beb5f4eb68b1d6bd3792cdd638acf89009e787e3d10ee7401924
- OPTIONS
- "CMAKE_DISABLE_FIND_PACKAGE_Doxygen ON"
- EXCLUDE_FROM_ALL ON
- SYSTEM_PACKAGE OFF
- )
+ AddJsonPackage(zycore)
- AddPackage(
- NAME Zydis
- VERSION 4
- REPO "zyantific/zydis"
- SHA c2d2bab025
- HASH 7b48f213ff7aab2926f8c9c65195959143bebbfb2b9a25051ffd8b8b0f1baf1670d9739781de674577d955925f91ac89376e16b476a03828c84e2fd765d45020
- FIND_PACKAGE_ARGUMENTS "CONFIG"
- OPTIONS
- "ZYDIS_BUILD_TOOLS OFF"
- "ZYDIS_BUILD_EXAMPLES OFF"
- "ZYDIS_BUILD_DOXYGEN OFF"
- "ZYAN_SYSTEM_ZYCORE ON"
- "CMAKE_DISABLE_FIND_PACKAGE_Doxygen ON"
- EXCLUDE_FROM_ALL ON
+ AddJsonPackage(
+ NAME zydis
+ BUNDLED_PACKAGE ${DYNARMIC_USE_BUNDLED_EXTERNALS}
)
endif()
diff --git a/src/dynarmic/externals/cpmfile.json b/src/dynarmic/externals/cpmfile.json
new file mode 100644
index 0000000000..b934856af2
--- /dev/null
+++ b/src/dynarmic/externals/cpmfile.json
@@ -0,0 +1,47 @@
+{
+ "biscuit": {
+ "version": "0.9.1",
+ "repo": "lioncash/biscuit",
+ "sha": "76b0be8dae",
+ "hash": "47d55ed02d032d6cf3dc107c6c0a9aea686d5f25aefb81d1af91db027b6815bd5add1755505e19d76625feeb17aa2db6cd1668fe0dad2e6a411519bde6ca4489"
+ },
+ "mcl": {
+ "version": "0.1.12",
+ "repo": "azahar-emu/mcl",
+ "sha": "7b08d83418",
+ "hash": "f943bac39c1879986decad7a442ff4288eaeca4a2907684c7914e115a55ecc43c2782ded85c0835763fe04e40d5c82220ce864423e489e648e408a84f54dc4f3",
+ "options": [
+ "MCL_INSTALL OFF"
+ ]
+ },
+ "unordered-dense": {
+ "package": "unordered_dense",
+ "repo": "Lizzie841/unordered_dense",
+ "sha": "e59d30b7b1",
+ "hash": "71eff7bd9ba4b9226967bacd56a8ff000946f8813167cb5664bb01e96fb79e4e220684d824fe9c59c4d1cc98c606f13aff05b7940a1ed8ab3c95d6974ee34fa0",
+ "find_args": "CONFIG",
+ "options": [
+ "UNORDERED_DENSE_INSTALL OFF"
+ ]
+ },
+ "zycore": {
+ "package": "Zycore",
+ "repo": "zyantific/zycore-c",
+ "sha": "75a36c45ae",
+ "hash": "15aa399f39713e042c4345bc3175c82f14dca849fde2a21d4f591f62c43e227b70d868d8bb86beb5f4eb68b1d6bd3792cdd638acf89009e787e3d10ee7401924",
+ "bundled": true
+ },
+ "zydis": {
+ "package": "Zydis",
+ "version": "4",
+ "repo": "zyantific/zydis",
+ "sha": "c2d2bab025",
+ "hash": "7b48f213ff7aab2926f8c9c65195959143bebbfb2b9a25051ffd8b8b0f1baf1670d9739781de674577d955925f91ac89376e16b476a03828c84e2fd765d45020",
+ "options": [
+ "ZYDIS_BUILD_TOOLS OFF",
+ "ZYDIS_BUILD_EXAMPLES OFF",
+ "ZYDIS_BUILD_DOXYGEN OFF",
+ "ZYAN_SYSTEM_ZYCORE ON"
+ ]
+ }
+}
diff --git a/src/shader_recompiler/CMakeLists.txt b/src/shader_recompiler/CMakeLists.txt
index 5d896db93d..55cdc17c1f 100644
--- a/src/shader_recompiler/CMakeLists.txt
+++ b/src/shader_recompiler/CMakeLists.txt
@@ -246,7 +246,7 @@ add_library(shader_recompiler STATIC
)
-target_link_libraries(shader_recompiler PUBLIC common fmt::fmt sirit SPIRV-Tools-opt SPIRV-Tools SPIRV-Tools-link)
+target_link_libraries(shader_recompiler PUBLIC common fmt::fmt sirit SPIRV-Tools::SPIRV-Tools)
if (MSVC)
target_compile_options(shader_recompiler PRIVATE
diff --git a/src/yuzu/externals/CMakeLists.txt b/src/yuzu/externals/CMakeLists.txt
index d7f3f1457a..7de41f6dfd 100644
--- a/src/yuzu/externals/CMakeLists.txt
+++ b/src/yuzu/externals/CMakeLists.txt
@@ -1,7 +1,8 @@
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
-# cpm
+# Explicitly include CPMUtil here since we have a separate cpmfile for Qt externals
+set(CPMUTIL_JSON_FILE ${CMAKE_CURRENT_SOURCE_DIR}/cpmfile.json)
include(CPMUtil)
# Disable tests/tools in all externals supporting the standard option name
@@ -14,12 +15,4 @@ set(BUILD_SHARED_LIBS OFF)
set_directory_properties(PROPERTIES EXCLUDE_FROM_ALL ON)
# QuaZip
-AddPackage(
- NAME QuaZip-Qt6
- VERSION 1.3
- REPO "crueter/quazip-qt6"
- SHA f838774d63
- HASH 9f629a438699801244a106c8df6d5f8f8d19e80df54f530a89403a10c8c4e37a6e95606bbdd307f23636961e8ce34eb37a2186d589a1f227ac9c8e2c678e326e
- OPTIONS
- "QUAZIP_INSTALL OFF"
-)
+AddJsonPackage(quazip)
diff --git a/src/yuzu/externals/cpmfile.json b/src/yuzu/externals/cpmfile.json
new file mode 100644
index 0000000000..e3590d0f7f
--- /dev/null
+++ b/src/yuzu/externals/cpmfile.json
@@ -0,0 +1,12 @@
+{
+ "quazip": {
+ "package": "QuaZip-Qt6",
+ "repo": "crueter/quazip-qt6",
+ "sha": "f838774d63",
+ "hash": "9f629a438699801244a106c8df6d5f8f8d19e80df54f530a89403a10c8c4e37a6e95606bbdd307f23636961e8ce34eb37a2186d589a1f227ac9c8e2c678e326e",
+ "version": "1.3",
+ "options": [
+ "QUAZIP_INSTALL OFF"
+ ]
+ }
+}
diff --git a/tools/cpm-fetch-all.sh b/tools/cpm-fetch-all.sh
new file mode 100755
index 0000000000..38f7b1f941
--- /dev/null
+++ b/tools/cpm-fetch-all.sh
@@ -0,0 +1,10 @@
+#!/bin/bash -e
+
+# SPDX-FileCopyrightText: 2025 Eden Emulator Project
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# SPDX-FileCopyrightText: 2025 crueter
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+LIBS=$(find . externals externals/nx_tzdb src/yuzu/externals externals/ffmpeg src/dynarmic/externals -maxdepth 1 -name cpmfile.json -exec jq -j 'keys_unsorted | join(" ")' {} \; -printf " ")
+tools/cpm-fetch.sh $LIBS \ No newline at end of file
diff --git a/tools/cpm-fetch.sh b/tools/cpm-fetch.sh
new file mode 100755
index 0000000000..1c2ce007d2
--- /dev/null
+++ b/tools/cpm-fetch.sh
@@ -0,0 +1,198 @@
+#!/bin/bash -e
+
+# SPDX-FileCopyrightText: 2025 Eden Emulator Project
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# SPDX-FileCopyrightText: 2025 crueter
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+[ -z "$CPM_SOURCE_CACHE" ] && CPM_SOURCE_CACHE=$PWD/.cache/cpm
+
+mkdir -p $CPM_SOURCE_CACHE
+
+ROOTDIR="$PWD"
+
+TMP=$(mktemp -d)
+
+download_package() {
+ FILENAME=$(basename "$DOWNLOAD")
+
+ OUTFILE="$TMP/$FILENAME"
+
+ LOWER_PACKAGE=$(tr '[:upper:]' '[:lower:]' <<< "$PACKAGE_NAME")
+ OUTDIR="${CPM_SOURCE_CACHE}/${LOWER_PACKAGE}/${KEY}"
+ [ -d "$OUTDIR" ] && return
+
+ curl "$DOWNLOAD" -sS -L -o "$OUTFILE"
+
+ ACTUAL_HASH=$(${HASH_ALGO}sum "$OUTFILE" | cut -d" " -f1)
+ [ "$ACTUAL_HASH" != "$HASH" ] && echo "$FILENAME did not match expected hash; expected $HASH but got $ACTUAL_HASH" && exit 1
+
+ mkdir -p "$OUTDIR"
+
+ pushd "$OUTDIR" > /dev/null
+
+ case "$FILENAME" in
+ (*.7z)
+ 7z x "$OUTFILE" > /dev/null
+ ;;
+ (*.tar*)
+ tar xf "$OUTFILE" > /dev/null
+ ;;
+ (*.zip)
+ unzip "$OUTFILE" > /dev/null
+ ;;
+ esac
+
+ # basically if only one real item exists at the top we just move everything from there
+ # since github and some vendors hate me
+ DIRS=$(find -maxdepth 1 -type d -o -type f)
+
+ # thanks gnu
+ if [ $(wc -l <<< "$DIRS") -eq 2 ]; then
+ SUBDIR=$(find . -maxdepth 1 -type d -not -name ".")
+ mv "$SUBDIR"/* .
+ mv "$SUBDIR"/.* . 2>/dev/null || true
+ rmdir "$SUBDIR"
+ fi
+
+ if grep -e "patches" <<< "$JSON" > /dev/null; then
+ PATCHES=$(jq -r '.patches | join(" ")' <<< "$JSON")
+ for patch in $PATCHES; do
+ patch -p1 < "$ROOTDIR"/.patch/$package/$patch
+ done
+ fi
+
+ popd > /dev/null
+}
+
+ci_package() {
+ REPO=$(jq -r ".repo" <<< "$JSON")
+ EXT=$(jq -r '.extension' <<< "$JSON")
+ [ "$EXT" == null ] && EXT="tar.zst"
+
+ VERSION=$(jq -r ".version" <<< "$JSON")
+ NAME=$(jq -r ".name | \"$package\"" <<< "$JSON")
+ PACKAGE=$(jq -r ".package | \"$package\"" <<< "$JSON")
+
+ # TODO(crueter)
+ # DISABLED=$(jq -j '.disabled_platforms | join(" ")' <<< "$JSON")
+
+ [ "$REPO" == null ] && echo "No repo defined for CI package $package" && return
+
+ echo "CI package $PACKAGE"
+
+ for platform in windows-amd64 windows-arm64 android solaris freebsd linux linux-aarch64; do
+ FILENAME="${NAME}-${platform}-${VERSION}.${EXT}"
+ DOWNLOAD="https://github.com/${REPO}/releases/download/v${VERSION}/${FILENAME}"
+ PACKAGE_NAME="$PACKAGE"
+ KEY=$platform
+
+ echo "- platform $KEY"
+
+ HASH_ALGO=$(jq -r ".hash_algo" <<< "$JSON")
+ [ "$HASH_ALGO" == null ] && HASH_ALGO=sha512
+
+ HASH_SUFFIX="${HASH_ALGO}sum"
+ HASH_URL="${DOWNLOAD}.${HASH_SUFFIX}"
+
+ HASH=$(curl "$HASH_URL" -sS -q -L -o -)
+
+ download_package
+ done
+}
+
+for package in $@
+do
+ # prepare for cancer
+ JSON=$(find . externals src/yuzu/externals externals/ffmpeg src/dynarmic/externals externals/nx_tzdb -maxdepth 1 -name cpmfile.json -exec jq -r ".\"$package\" | select( . != null )" {} \;)
+
+ [ -z "$JSON" ] && echo "No cpmfile definition for $package" && continue
+
+ PACKAGE_NAME=$(jq -r ".package" <<< "$JSON")
+ [ "$PACKAGE_NAME" == null ] && PACKAGE_NAME="$package"
+
+ CI=$(jq -r ".ci" <<< "$JSON")
+ if [ "$CI" != null ]; then
+ ci_package
+ continue
+ fi
+
+ # url parsing WOOOHOOHOHOOHOHOH
+ URL=$(jq -r ".url" <<< "$JSON")
+ REPO=$(jq -r ".repo" <<< "$JSON")
+ SHA=$(jq -r ".sha" <<< "$JSON")
+
+ if [ "$URL" != "null" ]; then
+ DOWNLOAD="$URL"
+ elif [ "$REPO" != "null" ]; then
+ GIT_URL="https://github.com/$REPO"
+
+ TAG=$(jq -r ".tag" <<< "$JSON")
+ ARTIFACT=$(jq -r ".artifact" <<< "$JSON")
+ BRANCH=$(jq -r ".branch" <<< "$JSON")
+
+ if [ "$TAG" != "null" ]; then
+ if [ "$ARTIFACT" != "null" ]; then
+ DOWNLOAD="${GIT_URL}/releases/download/${TAG}/${ARTIFACT}"
+ else
+ DOWNLOAD="${GIT_URL}/archive/refs/tags/${TAG}.tar.gz"
+ fi
+ elif [ "$SHA" != "null" ]; then
+ DOWNLOAD="${GIT_URL}/archive/${SHA}.zip"
+ else
+ if [ "$BRANCH" == null ]; then
+ BRANCH=master
+ fi
+
+ DOWNLOAD="${GIT_URL}/archive/refs/heads/${BRANCH}.zip"
+ fi
+ else
+ echo "No repo or URL defined for $package"
+ continue
+ fi
+
+ # key parsing
+ KEY=$(jq -r ".key" <<< "$JSON")
+
+ if [ "$KEY" == null ]; then
+ VERSION=$(jq -r ".version" <<< "$JSON")
+ GIT_VERSION=$(jq -r ".git_version" <<< "$JSON")
+
+ if [ "$SHA" != null ]; then
+ KEY=$(cut -c1-4 - <<< "$SHA")
+ elif [ "$GIT_VERSION" != null ]; then
+ KEY="$GIT_VERSION"
+ elif [ "$VERSION" != null ]; then
+ KEY="$VERSION"
+ else
+ echo "No valid key could be determined for $package. Must define one of: key, sha, version, git_version"
+ continue
+ fi
+ fi
+
+ echo $KEY
+
+ echo "Downloading regular package $package, with key $KEY, from $DOWNLOAD"
+
+ # hash parsing
+ HASH_ALGO=$(jq -r ".hash_algo" <<< "$JSON")
+ [ "$HASH_ALGO" == null ] && HASH_ALGO=sha512
+
+ HASH=$(jq -r ".hash" <<< "$JSON")
+
+ if [ "$HASH" == null ]; then
+ HASH_SUFFIX="${HASH_ALGO}sum"
+ HASH_URL=$(jq -r ".hash_url" <<< "$JSON")
+
+ if [ "$HASH_URL" == null ]; then
+ HASH_URL="${DOWNLOAD}.${HASH_SUFFIX}"
+ fi
+
+ HASH=$(curl "$HASH_URL" -L -o -)
+ fi
+
+ download_package
+done
+
+rm -rf $TMP \ No newline at end of file