[cmake] CPMUtil: formatting, git_host, new repos, more system deps, libusb (#392)

I promise I'm a UI developer

- mbedtls can now be used as a system package
- zycore can now be used as a system package
- cleaned up dynarmic externals
- fixed libusb incorrectly showing as bundled
- add version/tag formatting to JSON
- add custom GIT_HOST option for packages
- moved some of my repos to my new git
- slightly better version identification
- combined VUL/VH since they are codependent (using my combo vendor)
- fix cpmfile inclusion
- remove libusb submodule

This PR succeeds #383 since it includes it

Co-authored-by: SDK Chan <sdkchan@eden-emu.dev>
Reviewed-on: #392
Co-authored-by: crueter <crueter@crueter.xyz>
Co-committed-by: crueter <crueter@crueter.xyz>
This commit is contained in:
crueter 2025-09-08 19:21:38 +02:00 committed by crueter
parent ecc99ce9ab
commit 428f136a75
Signed by: crueter
GPG key ID: 425ACD2D4830EBC6
39 changed files with 921 additions and 904 deletions

View file

@ -1,6 +1,7 @@
#!/bin/sh -e #!/bin/sh -e
HEADER="$(cat "$PWD/.ci/license/header.txt")" HEADER="$(cat "$PWD/.ci/license/header.txt")"
HEADER_HASH="$(cat "$PWD/.ci/license/header-hash.txt")"
echo "Getting branch changes" echo "Getting branch changes"
@ -13,41 +14,86 @@ FILES=`git diff-tree --no-commit-id --name-only ${RANGE} -r`
echo "Done" echo "Done"
check_header() {
CONTENT="`head -n3 < $1`"
case "$CONTENT" in
"$HEADER"*) ;;
*) BAD_FILES="$BAD_FILES $1" ;;
esac
}
check_cmake_header() {
CONTENT="`head -n3 < $1`"
case "$CONTENT" in
"$HEADER_HASH"*) ;;
*)
BAD_CMAKE="$BAD_CMAKE $1" ;;
esac
}
for file in $FILES; do for file in $FILES; do
[ -f "$file" ] || continue [ -f "$file" ] || continue
if [ `basename -- "$file"` = "CMakeLists.txt" ]; then
check_cmake_header "$file"
continue
fi
EXTENSION="${file##*.}" EXTENSION="${file##*.}"
case "$EXTENSION" in case "$EXTENSION" in
kts|kt|cpp|h) kts|kt|cpp|h)
CONTENT="`cat $file`" check_header "$file"
case "$CONTENT" in ;;
"$HEADER"*) ;; cmake)
*) BAD_FILES="$BAD_FILES $file" ;; check_cmake_header "$file"
esac
;; ;;
esac esac
done done
if [ "$BAD_FILES" = "" ]; then if [ "$BAD_FILES" = "" ] && [ "$BAD_CMAKE" = "" ]; then
echo echo
echo "All good." echo "All good."
exit exit
fi fi
echo "The following files have incorrect license headers:" if [ "$BAD_FILES" != "" ]; then
echo echo "The following source files have incorrect license headers:"
echo
for file in $BAD_FILES; do echo $file; done for file in $BAD_FILES; do echo $file; done
cat << EOF cat << EOF
The following license header should be added to the start of all offending files: The following license header should be added to the start of all offending SOURCE files:
=== BEGIN === === BEGIN ===
$HEADER $HEADER
=== END === === END ===
EOF
fi
if [ "$BAD_CMAKE" != "" ]; then
echo "The following CMake files have incorrect license headers:"
echo
for file in $BAD_CMAKE; do echo $file; done
cat << EOF
The following license header should be added to the start of all offending CMake files:
=== BEGIN ===
$HEADER_HASH
=== END ===
EOF
fi
cat << EOF
If some of the code in this PR is not being contributed by the original author, If some of the code in this PR is not being contributed by the original author,
the files which have been exclusively changed by that code can be ignored. the files which have been exclusively changed by that code can be ignored.
If this happens, this PR requirement can be bypassed once all other files are addressed. If this happens, this PR requirement can be bypassed once all other files are addressed.
@ -70,6 +116,17 @@ if [ "$FIX" = "true" ]; then
git add $file git add $file
done done
for file in $BAD_CMAKE; do
cat $file > $file.bak
cat .ci/license/header-hash.txt > $file
echo >> $file
cat $file.bak >> $file
rm $file.bak
git add $file
done
echo "License headers fixed." echo "License headers fixed."
if [ "$COMMIT" = "true" ]; then if [ "$COMMIT" = "true" ]; then

View file

@ -0,0 +1,2 @@
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later

6
.gitmodules vendored
View file

@ -1,6 +0,0 @@
# SPDX-FileCopyrightText: 2014 Citra Emulator Project
# SPDX-License-Identifier: GPL-2.0-or-later
[submodule "libusb"]
path = externals/libusb/libusb
url = https://github.com/libusb/libusb.git

View file

@ -48,12 +48,10 @@ endif()
# On Linux system SDL2 is likely to be lacking HIDAPI support which have drawbacks but is needed for SDL motion # On Linux system SDL2 is likely to be lacking HIDAPI support which have drawbacks but is needed for SDL motion
CMAKE_DEPENDENT_OPTION(ENABLE_SDL2 "Enable the SDL2 frontend" ON "NOT ANDROID" OFF) CMAKE_DEPENDENT_OPTION(ENABLE_SDL2 "Enable the SDL2 frontend" ON "NOT ANDROID" OFF)
set(EXT_DEFAULT ON) set(EXT_DEFAULT OFF)
# See https://github.com/llvm/llvm-project/issues/123946 if (MSVC OR ANDROID)
# OpenBSD va_list doesn't play nice with precompiled headers set(EXT_DEFAULT ON)
if (PLATFORM_FREEBSD OR PLATFORM_OPENBSD)
set(EXT_DEFAULT OFF)
endif() endif()
CMAKE_DEPENDENT_OPTION(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" ${EXT_DEFAULT} "ENABLE_SDL2;NOT MSVC" OFF) CMAKE_DEPENDENT_OPTION(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" ${EXT_DEFAULT} "ENABLE_SDL2;NOT MSVC" OFF)
@ -69,14 +67,13 @@ option(ENABLE_QT_UPDATE_CHECKER "Enable update checker for the Qt frontend" OFF)
CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" "${MSVC}" "ENABLE_QT" OFF) CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" "${MSVC}" "ENABLE_QT" OFF)
option(YUZU_USE_CPM "Use CPM to fetch Eden dependencies if needed" ON) option(YUZU_USE_CPM "Use CPM to fetch system dependencies (fmt, boost, etc) if needed. Externals will still be fetched." ${EXT_DEFAULT})
option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON) option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON)
option(ENABLE_WIFI_SCAN "Enable WiFi scanning" OFF) option(ENABLE_WIFI_SCAN "Enable WiFi scanning" OFF)
option(YUZU_USE_BUNDLED_FFMPEG "Download/Build bundled FFmpeg" ${EXT_DEFAULT}) option(YUZU_USE_BUNDLED_FFMPEG "Download/Build bundled FFmpeg" ${EXT_DEFAULT})
option(YUZU_USE_EXTERNAL_VULKAN_HEADERS "Use Vulkan-Headers from externals" ${EXT_DEFAULT}) option(YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES "Use Vulkan Utility Headers from externals" ${EXT_DEFAULT})
option(YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES "Use Vulkan-Utility-Libraries from externals" ${EXT_DEFAULT})
option(YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS "Use SPIRV-Tools from externals" ${EXT_DEFAULT}) option(YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS "Use SPIRV-Tools from externals" ${EXT_DEFAULT})
option(YUZU_USE_QT_MULTIMEDIA "Use QtMultimedia for Camera" OFF) option(YUZU_USE_QT_MULTIMEDIA "Use QtMultimedia for Camera" OFF)
@ -95,10 +92,12 @@ option(YUZU_TESTS "Compile tests" "${BUILD_TESTING}")
option(YUZU_USE_PRECOMPILED_HEADERS "Use precompiled headers" ${EXT_DEFAULT}) option(YUZU_USE_PRECOMPILED_HEADERS "Use precompiled headers" ${EXT_DEFAULT})
# TODO(crueter): CI this?
option(YUZU_DOWNLOAD_ANDROID_VVL "Download validation layer binary for android" ON) option(YUZU_DOWNLOAD_ANDROID_VVL "Download validation layer binary for android" ON)
option(FORCE_DOWNLOAD_WIN_BUNDLES "Forcefully download bundled Windows dependencies (useful for CI)" OFF) option(FORCE_DOWNLOAD_WIN_BUNDLES "Forcefully download bundled Windows dependencies (useful for CI)" OFF)
# TODO(crueter): Cleanup, each dep that has a bundled option should allow to choose between bundled, external, system
if (YUZU_USE_CPM AND ENABLE_SDL2) if (YUZU_USE_CPM AND ENABLE_SDL2)
option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 build" "${MSVC}") option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 build" "${MSVC}")
endif() endif()
@ -107,12 +106,10 @@ CMAKE_DEPENDENT_OPTION(YUZU_ROOM "Enable dedicated room functionality" ON "NOT A
CMAKE_DEPENDENT_OPTION(YUZU_ROOM_STANDALONE "Enable standalone room executable" ON "YUZU_ROOM" OFF) CMAKE_DEPENDENT_OPTION(YUZU_ROOM_STANDALONE "Enable standalone room executable" ON "YUZU_ROOM" OFF)
CMAKE_DEPENDENT_OPTION(YUZU_CMD "Compile the eden-cli executable" ON "NOT ANDROID" OFF) CMAKE_DEPENDENT_OPTION(YUZU_CMD "Compile the eden-cli executable" ON "ENABLE_SDL2;NOT ANDROID" OFF)
CMAKE_DEPENDENT_OPTION(YUZU_CRASH_DUMPS "Compile crash dump (Minidump) support" OFF "WIN32 OR LINUX" OFF) CMAKE_DEPENDENT_OPTION(YUZU_CRASH_DUMPS "Compile crash dump (Minidump) support" OFF "WIN32 OR LINUX" OFF)
option(YUZU_CHECK_SUBMODULES "Check if submodules are present" ${EXT_DEFAULT})
option(YUZU_ENABLE_LTO "Enable link-time optimization" OFF) option(YUZU_ENABLE_LTO "Enable link-time optimization" OFF)
option(YUZU_DOWNLOAD_TIME_ZONE_DATA "Always download time zone binaries" ON) option(YUZU_DOWNLOAD_TIME_ZONE_DATA "Always download time zone binaries" ON)
@ -194,53 +191,6 @@ if(EXISTS ${PROJECT_SOURCE_DIR}/hooks/pre-commit AND NOT EXISTS ${PROJECT_SOURCE
endif() endif()
endif() endif()
# Sanity check : Check that all submodules are present
# =======================================================================
function(check_submodules_present)
file(READ "${PROJECT_SOURCE_DIR}/.gitmodules" gitmodules)
string(REGEX MATCHALL "path *= *[^ \t\r\n]*" gitmodules ${gitmodules})
foreach(module ${gitmodules})
string(REGEX REPLACE "path *= *" "" module ${module})
file(GLOB RESULT "${PROJECT_SOURCE_DIR}/${module}/*")
list(LENGTH RESULT RES_LEN)
if(RES_LEN EQUAL 0)
message(FATAL_ERROR "Git submodule ${module} not found. "
"Please run: \ngit submodule update --init --recursive")
endif()
if (EXISTS "${PROJECT_SOURCE_DIR}/${module}/.git")
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})
endif()
endforeach()
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 configure_file(${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.qrc
${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.qrc ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.qrc
COPYONLY) COPYONLY)
@ -277,7 +227,7 @@ function(detect_architecture symbol arch)
if (ARCHITECTURE_${arch}) if (ARCHITECTURE_${arch})
set(ARCHITECTURE "${arch}" PARENT_SCOPE) set(ARCHITECTURE "${arch}" PARENT_SCOPE)
set(ARCHITECTURE_${arch} 1 PARENT_SCOPE) set(ARCHITECTURE_${arch} 1 PARENT_SCOPE)
add_definitions(-DARCHITECTURE_${arch}=1) add_compile_definitions(ARCHITECTURE_${arch}=1)
endif() endif()
endif() endif()
endfunction() endfunction()
@ -299,7 +249,7 @@ endif()
if (NOT DEFINED ARCHITECTURE) if (NOT DEFINED ARCHITECTURE)
set(ARCHITECTURE "GENERIC") set(ARCHITECTURE "GENERIC")
set(ARCHITECTURE_GENERIC 1) set(ARCHITECTURE_GENERIC 1)
add_definitions(-DARCHITECTURE_GENERIC=1) add_compile_definitions(ARCHITECTURE_GENERIC=1)
endif() endif()
message(STATUS "Target architecture: ${ARCHITECTURE}") message(STATUS "Target architecture: ${ARCHITECTURE}")
@ -311,16 +261,16 @@ if (MSVC AND ARCHITECTURE_x86)
endif() endif()
if (UNIX) if (UNIX)
add_definitions(-DYUZU_UNIX=1) add_compile_definitions(YUZU_UNIX=1)
endif() endif()
if (ARCHITECTURE_arm64 AND (ANDROID OR PLATFORM_LINUX)) if (ARCHITECTURE_arm64 AND (ANDROID OR PLATFORM_LINUX))
set(HAS_NCE 1) set(HAS_NCE 1)
add_definitions(-DHAS_NCE=1) add_compile_definitions(HAS_NCE=1)
endif() endif()
if (YUZU_ROOM) if (YUZU_ROOM)
add_definitions(-DYUZU_ROOM) add_compile_definitions(YUZU_ROOM)
endif() endif()
# Build/optimization presets # Build/optimization presets
@ -489,14 +439,6 @@ if(NOT TARGET Boost::headers)
AddJsonPackage(boost_headers) AddJsonPackage(boost_headers)
endif() endif()
if (ENABLE_LIBUSB)
if (PLATFORM_FREEBSD)
find_package(libusb MODULE)
else()
find_package(libusb 1.0.24 MODULE)
endif()
endif()
# DiscordRPC # DiscordRPC
if (USE_DISCORD_PRESENCE) if (USE_DISCORD_PRESENCE)
AddJsonPackage(discord-rpc) AddJsonPackage(discord-rpc)
@ -601,8 +543,8 @@ endfunction()
add_subdirectory(externals) add_subdirectory(externals)
# pass targets from externals # pass targets from externals
find_package(VulkanHeaders)
find_package(VulkanUtilityLibraries) find_package(VulkanUtilityLibraries)
find_package(libusb)
find_package(VulkanMemoryAllocator) find_package(VulkanMemoryAllocator)
find_package(SPIRV-Tools) find_package(SPIRV-Tools)
@ -736,7 +678,7 @@ if (APPLE)
list(APPEND PLATFORM_LIBRARIES ${ICONV_LIBRARY}) list(APPEND PLATFORM_LIBRARIES ${ICONV_LIBRARY})
elseif (WIN32) elseif (WIN32)
# Target Windows 10 # Target Windows 10
add_definitions(-D_WIN32_WINNT=0x0A00 -DWINVER=0x0A00) add_compile_definitions(_WIN32_WINNT=0x0A00 WINVER=0x0A00)
set(PLATFORM_LIBRARIES winmm ws2_32 iphlpapi) set(PLATFORM_LIBRARIES winmm ws2_32 iphlpapi)
if (MINGW) if (MINGW)
# PSAPI is the Process Status API # PSAPI is the Process Status API

View file

@ -11,10 +11,11 @@
# Future crueter: Wow this was a lie and a half, at this point I might as well make my own CPN # 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? # haha just kidding... unless?
# TODO(crueter): Remember to get more than 6 hours of sleep whenever making giant cmake changes
if (MSVC OR ANDROID) if (MSVC OR ANDROID)
set(BUNDLED_DEFAULT OFF)
else()
set(BUNDLED_DEFAULT ON) set(BUNDLED_DEFAULT ON)
else()
set(BUNDLED_DEFAULT OFF)
endif() endif()
option(CPMUTIL_FORCE_BUNDLED option(CPMUTIL_FORCE_BUNDLED
@ -26,8 +27,7 @@ option(CPMUTIL_FORCE_SYSTEM
cmake_minimum_required(VERSION 3.22) cmake_minimum_required(VERSION 3.22)
include(CPM) include(CPM)
# TODO(crueter): Better solution for separate cpmfiles e.g. per-directory set(CPMUTIL_JSON_FILE "${CMAKE_CURRENT_SOURCE_DIR}/cpmfile.json")
set(CPMUTIL_JSON_FILE "${CMAKE_CURRENT_SOURCE_DIR}/cpmfile.json" CACHE STRING "Location of cpmfile.json")
if (EXISTS ${CPMUTIL_JSON_FILE}) if (EXISTS ${CPMUTIL_JSON_FILE})
file(READ ${CPMUTIL_JSON_FILE} CPMFILE_CONTENT) file(READ ${CPMUTIL_JSON_FILE} CPMFILE_CONTENT)
@ -148,11 +148,32 @@ function(AddJsonPackage)
get_json_element("${object}" tag tag "") get_json_element("${object}" tag tag "")
get_json_element("${object}" artifact artifact "") get_json_element("${object}" artifact artifact "")
get_json_element("${object}" git_version git_version "") get_json_element("${object}" git_version git_version "")
get_json_element("${object}" git_host git_host "")
get_json_element("${object}" source_subdir source_subdir "") get_json_element("${object}" source_subdir source_subdir "")
get_json_element("${object}" bundled bundled "unset") get_json_element("${object}" bundled bundled "unset")
get_json_element("${object}" find_args find_args "") get_json_element("${object}" find_args find_args "")
get_json_element("${object}" raw_patches patches "") get_json_element("${object}" raw_patches patches "")
# okay here comes the fun part: REPLACEMENTS!
# first: tag gets %VERSION% replaced if applicable, with either git_version (preferred) or version
# second: artifact gets %VERSION% and %TAG% replaced accordingly (same rules for VERSION)
if (git_version)
set(version_replace ${git_version})
else()
set(version_replace ${version})
endif()
# TODO(crueter): fmt module for cmake
if (tag)
string(REPLACE "%VERSION%" "${version_replace}" tag ${tag})
endif()
if (artifact)
string(REPLACE "%VERSION%" "${version_replace}" artifact ${artifact})
string(REPLACE "%TAG%" "${tag}" artifact ${artifact})
endif()
# format patchdir # format patchdir
if (raw_patches) if (raw_patches)
math(EXPR range "${raw_patches_LENGTH} - 1") math(EXPR range "${raw_patches_LENGTH} - 1")
@ -201,6 +222,8 @@ function(AddJsonPackage)
SOURCE_SUBDIR "${source_subdir}" SOURCE_SUBDIR "${source_subdir}"
GIT_VERSION ${git_version} GIT_VERSION ${git_version}
GIT_HOST ${git_host}
ARTIFACT ${artifact} ARTIFACT ${artifact}
TAG ${tag} TAG ${tag}
) )
@ -240,6 +263,7 @@ function(AddPackage)
NAME NAME
VERSION VERSION
GIT_VERSION GIT_VERSION
GIT_HOST
REPO REPO
TAG TAG
@ -272,11 +296,17 @@ function(AddPackage)
option(${PKG_ARGS_NAME}_FORCE_SYSTEM "Force the system package for ${PKG_ARGS_NAME}") 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}") option(${PKG_ARGS_NAME}_FORCE_BUNDLED "Force the bundled package for ${PKG_ARGS_NAME}")
if (NOT DEFINED PKG_ARGS_GIT_HOST)
set(git_host github.com)
else()
set(git_host ${PKG_ARGS_GIT_HOST})
endif()
if (DEFINED PKG_ARGS_URL) if (DEFINED PKG_ARGS_URL)
set(pkg_url ${PKG_ARGS_URL}) set(pkg_url ${PKG_ARGS_URL})
if (DEFINED PKG_ARGS_REPO) if (DEFINED PKG_ARGS_REPO)
set(pkg_git_url https://github.com/${PKG_ARGS_REPO}) set(pkg_git_url https://${git_host}/${PKG_ARGS_REPO})
else() else()
if (DEFINED PKG_ARGS_GIT_URL) if (DEFINED PKG_ARGS_GIT_URL)
set(pkg_git_url ${PKG_ARGS_GIT_URL}) set(pkg_git_url ${PKG_ARGS_GIT_URL})
@ -285,7 +315,7 @@ function(AddPackage)
endif() endif()
endif() endif()
elseif (DEFINED PKG_ARGS_REPO) elseif (DEFINED PKG_ARGS_REPO)
set(pkg_git_url https://github.com/${PKG_ARGS_REPO}) set(pkg_git_url https://${git_host}/${PKG_ARGS_REPO})
if (DEFINED PKG_ARGS_TAG) if (DEFINED PKG_ARGS_TAG)
set(pkg_key ${PKG_ARGS_TAG}) set(pkg_key ${PKG_ARGS_TAG})
@ -316,25 +346,23 @@ function(AddPackage)
cpm_utils_message(STATUS ${PKG_ARGS_NAME} "Download URL is ${pkg_url}") cpm_utils_message(STATUS ${PKG_ARGS_NAME} "Download URL is ${pkg_url}")
if (DEFINED PKG_ARGS_GIT_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) if (NOT DEFINED PKG_ARGS_KEY)
if (DEFINED PKG_ARGS_SHA) if (DEFINED PKG_ARGS_SHA)
string(SUBSTRING ${PKG_ARGS_SHA} 0 4 pkg_key) string(SUBSTRING ${PKG_ARGS_SHA} 0 4 pkg_key)
cpm_utils_message(DEBUG ${PKG_ARGS_NAME} cpm_utils_message(DEBUG ${PKG_ARGS_NAME}
"No custom key defined, using ${pkg_key} from sha") "No custom key defined, using ${pkg_key} from sha")
elseif (DEFINED git_version) elseif(DEFINED PKG_ARGS_GIT_VERSION)
set(pkg_key ${git_version}) set(pkg_key ${PKG_ARGS_GIT_VERSION})
cpm_utils_message(DEBUG ${PKG_ARGS_NAME} cpm_utils_message(DEBUG ${PKG_ARGS_NAME}
"No custom key defined, using ${pkg_key}") "No custom key defined, using ${pkg_key}")
elseif (DEFINED PKG_ARGS_TAG) elseif (DEFINED PKG_ARGS_TAG)
set(pkg_key ${PKG_ARGS_TAG}) set(pkg_key ${PKG_ARGS_TAG})
cpm_utils_message(DEBUG ${PKG_ARGS_NAME} cpm_utils_message(DEBUG ${PKG_ARGS_NAME}
"No custom key defined, using ${pkg_key}") "No custom key defined, using ${pkg_key}")
elseif (DEFINED PKG_ARGS_VERSION)
set(pkg_key ${PKG_ARGS_VERSION})
cpm_utils_message(DEBUG ${PKG_ARGS_NAME}
"No custom key defined, using ${pkg_key}")
else() else()
cpm_utils_message(WARNING ${PKG_ARGS_NAME} cpm_utils_message(WARNING ${PKG_ARGS_NAME}
"Could not determine cache key, using CPM defaults") "Could not determine cache key, using CPM defaults")
@ -445,12 +473,15 @@ function(AddPackage)
if (DEFINED PKG_ARGS_SHA) if (DEFINED PKG_ARGS_SHA)
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS
${PKG_ARGS_SHA}) ${PKG_ARGS_SHA})
elseif(DEFINED git_version) elseif (DEFINED PKG_ARGS_GIT_VERSION)
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS
${git_version}) ${PKG_ARGS_GIT_VERSION})
elseif (DEFINED PKG_ARGS_TAG) elseif (DEFINED PKG_ARGS_TAG)
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS
${PKG_ARGS_TAG}) ${PKG_ARGS_TAG})
elseif(DEFINED PKG_ARGS_VERSION)
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS
${PKG_ARGS_VERSION})
else() else()
cpm_utils_message(WARNING ${PKG_ARGS_NAME} cpm_utils_message(WARNING ${PKG_ARGS_NAME}
"Package has no specified sha, tag, or version") "Package has no specified sha, tag, or version")
@ -495,6 +526,7 @@ function(add_ci_package key)
set(ARTIFACT_DIR ${${ARTIFACT_PACKAGE}_SOURCE_DIR} PARENT_SCOPE) set(ARTIFACT_DIR ${${ARTIFACT_PACKAGE}_SOURCE_DIR} PARENT_SCOPE)
endfunction() endfunction()
# TODO(crueter): we could do an AddMultiArchPackage, multiplatformpackage?
# name is the artifact name, package is for find_package override # name is the artifact name, package is for find_package override
function(AddCIPackage) function(AddCIPackage)
set(oneValueArgs set(oneValueArgs

View file

@ -0,0 +1,17 @@
# SPDX-FileCopyrightText: 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
include(FindPackageHandleStandardArgs)
find_package(PkgConfig QUIET)
pkg_search_module(mbedtls QUIET IMPORTED_TARGET mbedtls)
find_package_handle_standard_args(mbedtls
REQUIRED_VARS mbedtls_LINK_LIBRARIES
VERSION_VAR mbedtls_VERSION
)
pkg_search_module(mbedcrypto QUIET IMPORTED_TARGET mbedcrypto)
find_package_handle_standard_args(mbedcrypto
REQUIRED_VARS mbedcrypto_LINK_LIBRARIES
VERSION_VAR mbedcrypto_VERSION
)

View file

@ -10,8 +10,8 @@
"boost": { "boost": {
"package": "Boost", "package": "Boost",
"repo": "boostorg/boost", "repo": "boostorg/boost",
"tag": "boost-1.88.0", "tag": "boost-%VERSION%",
"artifact": "boost-1.88.0-cmake.7z", "artifact": "%TAG%-cmake.7z",
"hash": "e5b049e5b61964480ca816395f63f95621e66cb9bcf616a8b10e441e0e69f129e22443acb11e77bc1e8170f8e4171b9b7719891efc43699782bfcd4b3a365f01", "hash": "e5b049e5b61964480ca816395f63f95621e66cb9bcf616a8b10e441e0e69f129e22443acb11e77bc1e8170f8e4171b9b7719891efc43699782bfcd4b3a365f01",
"git_version": "1.88.0", "git_version": "1.88.0",
"version": "1.57" "version": "1.57"

View file

@ -23,7 +23,7 @@ CPMUtil is a wrapper around CPM that aims to reduce boilerplate and add useful u
- `NAME` (required): The package name (must be the same as the `find_package` name if applicable) - `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 - `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 - `GIT_VERSION`: The "version" found within git
- `URL`: The URL to fetch. - `URL`: The URL to fetch.
- `REPO`: The GitHub repo to use (`owner/repo`). - `REPO`: The GitHub repo to use (`owner/repo`).
* Only GitHub is supported for now, though other platforms will see support at some point * Only GitHub is supported for now, though other platforms will see support at some point
@ -71,8 +71,9 @@ Hashing strategies, descending order of precedence:
- `KEY`: Custom cache key to use (stored as `.cache/cpm/${packagename_lower}/${key}`) - `KEY`: Custom cache key to use (stored as `.cache/cpm/${packagename_lower}/${key}`)
* Default is based on, in descending order of precedence: * Default is based on, in descending order of precedence:
- First 4 characters of the sha - First 4 characters of the sha
- `GIT_VERSION`, or `VERSION` if not specified - `GIT_VERSION`
- Tag - Tag
- `VERSION`
- Otherwise, CPM defaults will be used. This is not recommended as it doesn't produce reproducible caches - 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 - `DOWNLOAD_ONLY`: Whether or not to configure the downloaded package via CMake
* Useful to turn `OFF` if the project doesn't use CMake * Useful to turn `OFF` if the project doesn't use CMake
@ -232,12 +233,9 @@ In order: OpenSSL CI, Boost (tag + artifact), discord-rpc (sha + options + patch
To include CPMUtil: To include CPMUtil:
```cmake ```cmake
set(CPMUTIL_JSON_FILE ${CMAKE_CURRENT_SOURCE_DIR}/cpmfile.json)
include(CPMUtil) include(CPMUtil)
``` ```
You may omit the first line if you are not utilizing cpmfile.
## Prefetching ## Prefetching
- To prefetch a CPM dependency (requires cpmfile): - To prefetch a CPM dependency (requires cpmfile):
@ -245,8 +243,8 @@ You may omit the first line if you are not utilizing cpmfile.
- To prefetch all CPM dependencies: - To prefetch all CPM dependencies:
* `tools/cpm-fetch-all.sh` * `tools/cpm-fetch-all.sh`
Currently, `cpm-fetch.sh` defines the following directories for cpmfiles: Currently, `cpm-fetch.sh` defines the following directories for cpmfiles (max depth of 2, so subdirs are caught as well):
`externals src/yuzu/externals externals/ffmpeg src/dynarmic/externals externals/nx_tzdb` `externals src/yuzu src/dynarmic .`
Whenever you add a new cpmfile, update the script accordingly Whenever you add a new cpmfile, update the script accordingly

12
docs/build/FreeBSD.md vendored
View file

@ -1,13 +1,7 @@
## One word of caution before proceeding. Eden is not currently available as a port on FreeBSD, though it is in the works. For now, the recommended method of usage is to compile it yourself. Check back often, as the build process frequently changes.
This is not the usual or preferred way to build programs on FreeBSD.
As of writing there is no official fresh port available for Eden, but it is in the works.
After it is available you can find a link to the eden-emu fresh port here and on Escary's github repo.
See this build as an AppImage alternative for FreeBSD.
## Dependencies. ## Dependencies.
Before we start we need some dependencies. Eden needs the following dependencies:
These dependencies are generally needed to build Eden on FreeBSD.
``` ```
devel/cmake devel/cmake
@ -22,6 +16,8 @@ devel/autoconf
devel/pkgconf devel/pkgconf
devel/qt6-base devel/qt6-base
net/enet
multimedia/ffnvcodec-headers multimedia/ffnvcodec-headers
multimedia/ffmpeg multimedia/ffmpeg

65
docs/build/macOS.md vendored
View file

@ -1,43 +1,36 @@
Please note this article is intended for development, and eden on macOS is not currently ready for regular use. Please note this article is intended for development, and Eden on macOS is not currently ready for regular use.
This article was written for developers. eden support for macOS is not ready for casual use. This article was written for developers. Eden support for macOS is not ready for casual use.
## Method I: ninja
---
If you are compiling on Intel Mac or are using a Rosetta Homebrew installation, you must replace all references of `/opt/homebrew` to `/usr/local`.
## Dependencies
Install dependencies from Homebrew: Install dependencies from Homebrew:
```sh ```sh
brew install autoconf automake boost ccache ffmpeg fmt glslang hidapi libtool libusb lz4 ninja nlohmann-json openssl pkg-config qt@6 sdl2 speexdsp zlib zlib zstd cmake Catch2 molten-vk vulkan-loader brew install autoconf automake boost ffmpeg fmt glslang hidapi libtool libusb lz4 ninja nlohmann-json openssl pkg-config qt@6 sdl2 speexdsp zlib zstd cmake Catch2 molten-vk vulkan-loader spirv-tools
``` ```
Clone the repo If you are compiling on Intel Mac, or are using a Rosetta Homebrew installation, you must replace all references of `/opt/homebrew` with `/usr/local`.
Now, clone the repo:
```sh ```sh
git clone --recursive https://git.eden-emu.dev/eden-emu/eden git clone --recursive https://git.eden-emu.dev/eden-emu/eden
cd eden cd eden
``` ```
## Method I: ninja
---
Build for release Build for release
```sh ```sh
mkdir build && cd build
export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake" export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake"
export LIBVULKAN_PATH=/opt/homebrew/lib/libvulkan.dylib export LIBVULKAN_PATH=/opt/homebrew/lib/libvulkan.dylib
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=ON -DENABLE_LIBUSB=OFF -DCLANG_FORMAT=ON -DSDL2_DISABLE_INSTALL=ON -DSDL_ALTIVEC=ON
cmake .. -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_USE_BUNDLED_VCPKG=OFF -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=ON -DENABLE_LIBUSB=OFF -DCLANG_FORMAT=ON -DSDL2_DISABLE_INSTALL=ON -DSDL_ALTIVEC=ON
ninja ninja
``` ```
You may also want to include support for Discord Rich Presence by adding `-DUSE_DISCORD_PRESENCE=ON` after `cmake ..` You may also want to include support for Discord Rich Presence by adding `-DUSE_DISCORD_PRESENCE=ON`
Build with debug symbols (vcpkg is not currently used due to broken boost-context library):
```sh ```sh
mkdir build && cd build
export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake" export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake"
cmake .. -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_USE_BUNDLED_VCPKG=OFF -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=OFF -DENABLE_LIBUSB=OFF cmake -B build -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=OFF -DENABLE_LIBUSB=OFF
ninja ninja
``` ```
@ -49,40 +42,20 @@ bin/eden.app/Contents/MacOS/eden
## Method II: Xcode ## Method II: Xcode
--- ---
If you are compiling on Intel Mac or are using a Rosetta Homebrew installation, you must replace all references of `/opt/homebrew` to `/usr/local`.
Install dependencies from Homebrew:
```sh
brew install autoconf automake boost ccache ffmpeg fmt glslang hidapi libtool libusb lz4 ninja nlohmann-json openssl pkg-config qt@6 sdl2 speexdsp zlib zlib zstd cmake Catch2 molten-vk vulkan-loader
```
Clone the repo
```sh
git clone --recursive https://git.eden-emu.dev/eden-emu/eden
cd eden
```
Build for release Build for release
```sh ```sh
mkdir build && cd build
export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake" export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake"
export LIBVULKAN_PATH=/opt/homebrew/lib/libvulkan.dylib export LIBVULKAN_PATH=/opt/homebrew/lib/libvulkan.dylib
# Only if having errors about Xcode 15.0
cmake .. -GXcode -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_USE_BUNDLED_VCPKG=OFF -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=ON -DENABLE_LIBUSB=OFF -DCLANG_FORMAT=ON -DSDL2_DISABLE_INSTALL=ON -DSDL_ALTIVEC=ON sudo /usr/bin/xcode-select --switch /Users/admin/Downloads/Xcode.ap
cmake -B build -GXcode -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=ON -DENABLE_LIBUSB=OFF -DCLANG_FORMAT=ON -DSDL2_DISABLE_INSTALL=ON -DSDL_ALTIVEC=ON
xcodebuild build -project eden.xcodeproj -scheme "eden" -configuration "RelWithDebInfo" xcodebuild build -project yuzu.xcodeproj -scheme "yuzu" -configuration "RelWithDebInfo"
``` ```
You may also want to include support for Discord Rich Presence by adding `-DUSE_DISCORD_PRESENCE=ON` after `cmake ..` Build with debug symbols:
Build with debug symbols (vcpkg is not currently used due to broken boost-context library):
```sh ```sh
mkdir build && cd build
export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake" export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake"
cmake .. -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_USE_BUNDLED_VCPKG=OFF -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=OFF -DENABLE_LIBUSB=OFF cmake -B build -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=OFF -DENABLE_LIBUSB=OFF
ninja ninja
``` ```

View file

@ -1,3 +1,6 @@
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2025 Eden Emulator Project # SPDX-FileCopyrightText: 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
@ -7,8 +10,6 @@
# TODO(crueter): A lot of this should be moved to the root. # TODO(crueter): A lot of this should be moved to the root.
# otherwise we have to do weird shenanigans with library linking and stuff # otherwise we have to do weird shenanigans with library linking and stuff
# Explicitly include CPMUtil here since we have a separate cpmfile for externals
set(CPMUTIL_JSON_FILE ${CMAKE_CURRENT_SOURCE_DIR}/cpmfile.json)
include(CPMUtil) include(CPMUtil)
# Explicitly declare this option here to propagate to the oaknut CPM call # Explicitly declare this option here to propagate to the oaknut CPM call
@ -67,7 +68,7 @@ if (mbedtls_ADDED)
endif() endif()
# libusb # libusb
if (ENABLE_LIBUSB AND NOT TARGET libusb::usb) if (ENABLE_LIBUSB)
add_subdirectory(libusb) add_subdirectory(libusb)
endif() endif()
@ -107,21 +108,17 @@ if (YUZU_USE_BUNDLED_FFMPEG)
set(FFmpeg_INCLUDE_DIR "${FFmpeg_INCLUDE_DIR}" PARENT_SCOPE) set(FFmpeg_INCLUDE_DIR "${FFmpeg_INCLUDE_DIR}" PARENT_SCOPE)
endif() endif()
# Vulkan-Headers # VulkanUtilityHeaders - pulls in headers and utility libs
# TODO(crueter): Vk1.4 impl
AddJsonPackage( AddJsonPackage(
NAME vulkan-headers NAME vulkan-utility-headers
BUNDLED_PACKAGE ${YUZU_USE_EXTERNAL_VULKAN_HEADERS}
)
# Vulkan-Utility-Libraries
AddJsonPackage(
NAME vulkan-utility-libraries
BUNDLED_PACKAGE ${YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES} BUNDLED_PACKAGE ${YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES}
) )
# small hack
if (NOT VulkanUtilityLibraries_ADDED)
find_package(VulkanHeaders 1.3.274 REQUIRED)
endif()
# SPIRV Tools # SPIRV Tools
AddJsonPackage( AddJsonPackage(
NAME spirv-tools NAME spirv-tools
@ -239,7 +236,7 @@ if (YUZU_CRASH_DUMPS AND NOT TARGET libbreakpad_client)
file(GLOB_RECURSE LIBBREAKPAD_CLIENT_SOURCES ${breakpad_SOURCE_DIR}/src/client/mac/*.cc ${breakpad_SOURCE_DIR}/src/common/mac/*.cc) file(GLOB_RECURSE LIBBREAKPAD_CLIENT_SOURCES ${breakpad_SOURCE_DIR}/src/client/mac/*.cc ${breakpad_SOURCE_DIR}/src/common/mac/*.cc)
list(APPEND LIBBREAKPAD_CLIENT_SOURCES ${breakpad_SOURCE_DIR}/src/common/mac/MachIPC.mm) list(APPEND LIBBREAKPAD_CLIENT_SOURCES ${breakpad_SOURCE_DIR}/src/common/mac/MachIPC.mm)
else() else()
target_compile_definitions(libbreakpad_client PUBLIC -DHAVE_A_OUT_H) target_compile_definitions(libbreakpad_client PUBLIC HAVE_A_OUT_H)
file(GLOB_RECURSE LIBBREAKPAD_CLIENT_SOURCES ${breakpad_SOURCE_DIR}/src/client/linux/*.cc ${breakpad_SOURCE_DIR}/src/common/linux/*.cc) file(GLOB_RECURSE LIBBREAKPAD_CLIENT_SOURCES ${breakpad_SOURCE_DIR}/src/client/linux/*.cc ${breakpad_SOURCE_DIR}/src/common/linux/*.cc)
endif() endif()
list(APPEND LIBBREAKPAD_CLIENT_SOURCES ${LIBBREAKPAD_COMMON_SOURCES}) list(APPEND LIBBREAKPAD_CLIENT_SOURCES ${LIBBREAKPAD_COMMON_SOURCES})

View file

@ -3,6 +3,7 @@
"repo": "Mbed-TLS/mbedtls", "repo": "Mbed-TLS/mbedtls",
"sha": "8c88150ca1", "sha": "8c88150ca1",
"hash": "769ad1e94c570671071e1f2a5c0f1027e0bf6bcdd1a80ea8ac970f2c86bc45ce4e31aa88d6d8110fc1bed1de81c48bc624df1b38a26f8b340a44e109d784a966", "hash": "769ad1e94c570671071e1f2a5c0f1027e0bf6bcdd1a80ea8ac970f2c86bc45ce4e31aa88d6d8110fc1bed1de81c48bc624df1b38a26f8b340a44e109d784a966",
"find_args": "MODULE",
"patches": [ "patches": [
"0001-cmake-version.patch" "0001-cmake-version.patch"
] ]
@ -42,18 +43,13 @@
"0002-missing-decl.patch" "0002-missing-decl.patch"
] ]
}, },
"vulkan-headers": { "vulkan-utility-headers": {
"package": "VulkanHeaders",
"version": "1.3.274",
"repo": "KhronosGroup/Vulkan-Headers",
"sha": "89268a6d17",
"hash": "3ab349f74298ba72cafb8561015690c0674d428a09fb91ccd3cd3daca83650d190d46d33fd97b0a8fd4223fe6df2bcabae89136fbbf7c0bfeb8776f9448304c8"
},
"vulkan-utility-libraries": {
"package": "VulkanUtilityLibraries", "package": "VulkanUtilityLibraries",
"repo": "KhronosGroup/Vulkan-Utility-Libraries", "repo": "scripts/VulkanUtilityHeaders",
"sha": "df2e358152", "tag": "1.4.326",
"hash": "3e468c3d9ff93f6d418d71e5527abe0a12c8c7ab5b0b52278bbbee4d02bb87e99073906729b727e0147242b7e3fd5dedf68b803f1878cb4c0e4f730bc2238d79" "artifact": "VulkanUtilityHeaders.tar.zst",
"git_host": "git.crueter.xyz",
"hash": "5924629755cb1605c4aa4eee20ef7957a9dd8d61e4df548be656d98054f2730c4109693c1bd35811f401f4705d2ccff9fc849be32b0d8480bc3f73541a5e0964"
}, },
"vulkan-memory-allocator": { "vulkan-memory-allocator": {
"package": "VulkanMemoryAllocator", "package": "VulkanMemoryAllocator",

View file

@ -1,8 +1,6 @@
# SPDX-FileCopyrightText: 2021 yuzu Emulator Project # SPDX-FileCopyrightText: 2021 yuzu Emulator Project
# SPDX-License-Identifier: GPL-2.0-or-later # 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) include(CPMUtil)
if (NOT WIN32 AND NOT ANDROID) if (NOT WIN32 AND NOT ANDROID)

View file

@ -1,7 +1,15 @@
# SPDX-FileCopyrightText: 2020 yuzu Emulator Project # SPDX-FileCopyrightText: 2020 yuzu Emulator Project
# SPDX-License-Identifier: GPL-2.0-or-later # SPDX-License-Identifier: GPL-2.0-or-later
if (MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux") OR APPLE) include(CPMUtil)
AddJsonPackage(libusb)
if (NOT libusb_ADDED)
return()
endif()
if (MINGW OR PLATFORM_LINUX OR APPLE)
set(LIBUSB_FOUND ON CACHE BOOL "libusb is present" FORCE) set(LIBUSB_FOUND ON CACHE BOOL "libusb is present" FORCE)
set(LIBUSB_VERSION "1.0.24" CACHE STRING "libusb version string" FORCE) set(LIBUSB_VERSION "1.0.24" CACHE STRING "libusb version string" FORCE)
@ -19,8 +27,8 @@ if (MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux") OR APPLE)
message(FATAL_ERROR "Required program `libtoolize` not found.") message(FATAL_ERROR "Required program `libtoolize` not found.")
endif() endif()
set(LIBUSB_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/libusb") set(LIBUSB_PREFIX "${libusb_BINARY_DIR}")
set(LIBUSB_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libusb") set(LIBUSB_SRC_DIR "${libusb_SOURCE_DIR}")
# Workarounds for MSYS/MinGW # Workarounds for MSYS/MinGW
if (MSYS) if (MSYS)
@ -118,27 +126,27 @@ else() # MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
endif() endif()
add_library(usb add_library(usb
libusb/libusb/core.c ${libusb_SOURCE_DIR}/libusb/core.c
libusb/libusb/core.c ${libusb_SOURCE_DIR}/libusb/core.c
libusb/libusb/descriptor.c ${libusb_SOURCE_DIR}/libusb/descriptor.c
libusb/libusb/hotplug.c ${libusb_SOURCE_DIR}/libusb/hotplug.c
libusb/libusb/io.c ${libusb_SOURCE_DIR}/libusb/io.c
libusb/libusb/strerror.c ${libusb_SOURCE_DIR}/libusb/strerror.c
libusb/libusb/sync.c ${libusb_SOURCE_DIR}/libusb/sync.c
) )
set_target_properties(usb PROPERTIES VERSION 1.0.24) set_target_properties(usb PROPERTIES VERSION 1.0.24)
if(WIN32) if(WIN32)
target_include_directories(usb target_include_directories(usb
BEFORE BEFORE
PUBLIC PUBLIC
libusb/libusb ${libusb_SOURCE_DIR}/libusb
PRIVATE PRIVATE
"${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}"
) )
if (NOT MINGW) if (NOT MINGW)
target_include_directories(usb BEFORE PRIVATE libusb/msvc) target_include_directories(usb BEFORE PRIVATE ${libusb_SOURCE_DIR}/msvc)
endif() endif()
else() else()
@ -148,7 +156,7 @@ else() # MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
BEFORE BEFORE
PUBLIC PUBLIC
libusb/libusb ${libusb_SOURCE_DIR}/libusb
PRIVATE PRIVATE
"${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}"
@ -157,15 +165,15 @@ else() # MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
if(WIN32 OR CYGWIN) if(WIN32 OR CYGWIN)
target_sources(usb PRIVATE target_sources(usb PRIVATE
libusb/libusb/os/threads_windows.c ${libusb_SOURCE_DIR}/libusb/os/threads_windows.c
libusb/libusb/os/windows_winusb.c ${libusb_SOURCE_DIR}/libusb/os/windows_winusb.c
libusb/libusb/os/windows_usbdk.c ${libusb_SOURCE_DIR}/libusb/os/windows_usbdk.c
libusb/libusb/os/windows_common.c ${libusb_SOURCE_DIR}/libusb/os/windows_common.c
) )
set(OS_WINDOWS TRUE) set(OS_WINDOWS TRUE)
elseif(APPLE) elseif(APPLE)
target_sources(usb PRIVATE target_sources(usb PRIVATE
libusb/libusb/os/darwin_usb.c ${libusb_SOURCE_DIR}/libusb/os/darwin_usb.c
) )
find_library(COREFOUNDATION_LIBRARY CoreFoundation) find_library(COREFOUNDATION_LIBRARY CoreFoundation)
find_library(IOKIT_LIBRARY IOKit) find_library(IOKIT_LIBRARY IOKit)
@ -178,20 +186,20 @@ else() # MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
set(OS_DARWIN TRUE) set(OS_DARWIN TRUE)
elseif(ANDROID) elseif(ANDROID)
target_sources(usb PRIVATE target_sources(usb PRIVATE
libusb/libusb/os/linux_usbfs.c ${libusb_SOURCE_DIR}/libusb/os/linux_usbfs.c
libusb/libusb/os/linux_netlink.c ${libusb_SOURCE_DIR}/libusb/os/linux_netlink.c
) )
find_library(LOG_LIBRARY log) find_library(LOG_LIBRARY log)
target_link_libraries(usb PRIVATE ${LOG_LIBRARY}) target_link_libraries(usb PRIVATE ${LOG_LIBRARY})
set(OS_LINUX TRUE) set(OS_LINUX TRUE)
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux") elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
target_sources(usb PRIVATE target_sources(usb PRIVATE
libusb/libusb/os/linux_usbfs.c ${libusb_SOURCE_DIR}/libusb/os/linux_usbfs.c
) )
find_package(Libudev) find_package(Libudev)
if(LIBUDEV_FOUND) if(LIBUDEV_FOUND)
target_sources(usb PRIVATE target_sources(usb PRIVATE
libusb/libusb/os/linux_udev.c ${libusb_SOURCE_DIR}/libusb/os/linux_udev.c
) )
target_link_libraries(usb PRIVATE "${LIBUDEV_LIBRARIES}") target_link_libraries(usb PRIVATE "${LIBUDEV_LIBRARIES}")
target_include_directories(usb PRIVATE "${LIBUDEV_INCLUDE_DIR}") target_include_directories(usb PRIVATE "${LIBUDEV_INCLUDE_DIR}")
@ -199,26 +207,26 @@ else() # MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
set(USE_UDEV TRUE) set(USE_UDEV TRUE)
else() else()
target_sources(usb PRIVATE target_sources(usb PRIVATE
libusb/libusb/os/linux_netlink.c ${libusb_SOURCE_DIR}/libusb/os/linux_netlink.c
) )
endif() endif()
set(OS_LINUX TRUE) set(OS_LINUX TRUE)
elseif(${CMAKE_SYSTEM_NAME} MATCHES "NetBSD") elseif(${CMAKE_SYSTEM_NAME} MATCHES "NetBSD")
target_sources(usb PRIVATE target_sources(usb PRIVATE
libusb/libusb/os/netbsd_usb.c ${libusb_SOURCE_DIR}/libusb/os/netbsd_usb.c
) )
set(OS_NETBSD TRUE) set(OS_NETBSD TRUE)
elseif(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") elseif(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
target_sources(usb PRIVATE target_sources(usb PRIVATE
libusb/libusb/os/openbsd_usb.c ${libusb_SOURCE_DIR}/libusb/os/openbsd_usb.c
) )
set(OS_OPENBSD TRUE) set(OS_OPENBSD TRUE)
endif() endif()
if(UNIX) if(UNIX)
target_sources(usb PRIVATE target_sources(usb PRIVATE
libusb/libusb/os/events_posix.c ${libusb_SOURCE_DIR}/libusb/os/events_posix.c
libusb/libusb/os/threads_posix.c ${libusb_SOURCE_DIR}/libusb/os/threads_posix.c
) )
find_package(Threads REQUIRED) find_package(Threads REQUIRED)
if(THREADS_HAVE_PTHREAD_ARG) if(THREADS_HAVE_PTHREAD_ARG)
@ -230,8 +238,8 @@ else() # MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
set(THREADS_POSIX TRUE) set(THREADS_POSIX TRUE)
elseif(WIN32) elseif(WIN32)
target_sources(usb PRIVATE target_sources(usb PRIVATE
libusb/libusb/os/events_windows.c ${libusb_SOURCE_DIR}/libusb/os/events_windows.c
libusb/libusb/os/threads_windows.c ${libusb_SOURCE_DIR}/libusb/os/threads_windows.c
) )
endif() endif()

8
externals/libusb/cpmfile.json vendored Normal file
View file

@ -0,0 +1,8 @@
{
"libusb": {
"repo": "libusb/libusb",
"sha": "c060e9ce30",
"hash": "44647357ba1179020cfa6674d809fc35cf6f89bff1c57252fe3a610110f5013ad678fc6eb5918e751d4384c30e2fe678868dbffc5f85736157e546cb9d10accc",
"find_args": "MODULE"
}
}

@ -1 +0,0 @@
Subproject commit c060e9ce30ac2e3ffb49d94209c4dae77b6642f7

View file

@ -4,8 +4,6 @@
# SPDX-FileCopyrightText: 2023 yuzu Emulator Project # SPDX-FileCopyrightText: 2023 yuzu Emulator Project
# SPDX-License-Identifier: GPL-2.0-or-later # 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) include(CPMUtil)
set(NX_TZDB_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/include") set(NX_TZDB_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/include")

View file

@ -1,7 +1,10 @@
{ {
"tzdb": { "tzdb": {
"package": "nx_tzdb", "package": "nx_tzdb",
"url": "https://github.com/crueter/tzdb_to_nx/releases/download/250725/250725.zip", "repo": "misc/tzdb_to_nx",
"git_host": "git.crueter.xyz",
"artifact": "%VERSION%.zip",
"tag": "%VERSION%",
"hash": "8f60b4b29f285e39c0443f3d5572a73780f3dbfcfd5b35004451fadad77f3a215b2e2aa8d0fffe7e348e2a7b0660882b35228b6178dda8804a14ce44509fd2ca", "hash": "8f60b4b29f285e39c0443f3d5572a73780f3dbfcfd5b35004451fadad77f3a215b2e2aa8d0fffe7e348e2a7b0660882b35228b6178dda8804a14ce44509fd2ca",
"version": "250725" "version": "250725"
} }

View file

@ -22,16 +22,16 @@ if (MSVC)
set(CMAKE_CONFIGURATION_TYPES Debug Release CACHE STRING "" FORCE) set(CMAKE_CONFIGURATION_TYPES Debug Release CACHE STRING "" FORCE)
# Silence "deprecation" warnings # Silence "deprecation" warnings
add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE -D_SCL_SECURE_NO_WARNINGS) add_compile_definitions(_CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_DEPRECATE _SCL_SECURE_NO_WARNINGS)
# Avoid windows.h junk # Avoid windows.h junk
add_definitions(-DNOMINMAX) add_compile_definitions(NOMINMAX)
# Avoid windows.h from including some usually unused libs like winsocks.h, since this might cause some redefinition errors. # Avoid windows.h from including some usually unused libs like winsocks.h, since this might cause some redefinition errors.
add_definitions(-DWIN32_LEAN_AND_MEAN) add_compile_definitions(WIN32_LEAN_AND_MEAN)
# Ensure that projects are built with Unicode support. # Ensure that projects are built with Unicode support.
add_definitions(-DUNICODE -D_UNICODE) add_compile_definitions(UNICODE _UNICODE)
# /W4 - Level 4 warnings # /W4 - Level 4 warnings
# /MP - Multi-threaded compilation # /MP - Multi-threaded compilation
@ -169,15 +169,15 @@ else()
# glibc, which may default to 32 bits. glibc allows this to be configured # glibc, which may default to 32 bits. glibc allows this to be configured
# by setting _FILE_OFFSET_BITS. # by setting _FILE_OFFSET_BITS.
if(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR MINGW) if(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR MINGW)
add_definitions(-D_FILE_OFFSET_BITS=64) add_compile_definitions(_FILE_OFFSET_BITS=64)
endif() endif()
if (MINGW) if (MINGW)
add_definitions(-DMINGW_HAS_SECURE_API) add_compile_definitions(MINGW_HAS_SECURE_API)
add_compile_options("-msse4.1") add_compile_options("-msse4.1")
if (MINGW_STATIC_BUILD) if (MINGW_STATIC_BUILD)
add_definitions(-DQT_STATICPLUGIN) add_compile_definitions(QT_STATICPLUGIN)
add_compile_options("-static") add_compile_options("-static")
endif() endif()
endif() endif()

View file

@ -17,7 +17,7 @@ add_library(yuzu-android SHARED
set_property(TARGET yuzu-android PROPERTY IMPORTED_LOCATION ${FFmpeg_LIBRARY_DIR}) set_property(TARGET yuzu-android PROPERTY IMPORTED_LOCATION ${FFmpeg_LIBRARY_DIR})
target_link_libraries(yuzu-android PRIVATE audio_core common core input_common frontend_common Vulkan::Headers GPUOpen::VulkanMemoryAllocator) target_link_libraries(yuzu-android PRIVATE audio_core common core input_common frontend_common video_core)
target_link_libraries(yuzu-android PRIVATE android camera2ndk EGL glad jnigraphics log) target_link_libraries(yuzu-android PRIVATE android camera2ndk EGL glad jnigraphics log)
if (ARCHITECTURE_arm64) if (ARCHITECTURE_arm64)
target_link_libraries(yuzu-android PRIVATE adrenotools) target_link_libraries(yuzu-android PRIVATE adrenotools)

View file

@ -1,3 +1,6 @@
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2018 yuzu Emulator Project # SPDX-FileCopyrightText: 2018 yuzu Emulator Project
# SPDX-License-Identifier: GPL-2.0-or-later # SPDX-License-Identifier: GPL-2.0-or-later
@ -229,9 +232,10 @@ endif()
target_include_directories(audio_core PRIVATE ${OPUS_INCLUDE_DIRS}) target_include_directories(audio_core PRIVATE ${OPUS_INCLUDE_DIRS})
target_link_libraries(audio_core PUBLIC common core opus) target_link_libraries(audio_core PUBLIC common core opus)
if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) # what?
target_link_libraries(audio_core PRIVATE dynarmic::dynarmic) # if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64)
endif() # target_link_libraries(audio_core PRIVATE dynarmic::dynarmic)
# endif()
if (ENABLE_CUBEB) if (ENABLE_CUBEB)
target_sources(audio_core PRIVATE target_sources(audio_core PRIVATE
@ -240,7 +244,7 @@ if (ENABLE_CUBEB)
) )
target_link_libraries(audio_core PRIVATE cubeb) target_link_libraries(audio_core PRIVATE cubeb)
target_compile_definitions(audio_core PRIVATE -DHAVE_CUBEB=1) target_compile_definitions(audio_core PRIVATE HAVE_CUBEB=1)
endif() endif()
if (ENABLE_SDL2) if (ENABLE_SDL2)

View file

@ -1,3 +1,6 @@
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2018 yuzu Emulator Project # SPDX-FileCopyrightText: 2018 yuzu Emulator Project
# SPDX-License-Identifier: GPL-2.0-or-later # SPDX-License-Identifier: GPL-2.0-or-later
@ -1155,7 +1158,7 @@ add_library(core STATIC
if (ENABLE_WIFI_SCAN) if (ENABLE_WIFI_SCAN)
# find_package(libiw REQUIRED) # find_package(libiw REQUIRED)
target_compile_definitions(core PRIVATE -DENABLE_WIFI_SCAN) target_compile_definitions(core PRIVATE ENABLE_WIFI_SCAN)
target_link_libraries(core PRIVATE iw) target_link_libraries(core PRIVATE iw)
endif() endif()
@ -1196,13 +1199,13 @@ else()
target_link_libraries(core PUBLIC Boost::headers) target_link_libraries(core PUBLIC Boost::headers)
endif() endif()
target_link_libraries(core PRIVATE fmt::fmt nlohmann_json::nlohmann_json mbedtls RenderDoc::API) target_link_libraries(core PRIVATE fmt::fmt nlohmann_json::nlohmann_json RenderDoc::API mbedtls)
if (MINGW) if (MINGW)
target_link_libraries(core PRIVATE ${MSWSOCK_LIBRARY}) target_link_libraries(core PRIVATE ${MSWSOCK_LIBRARY})
endif() endif()
if (ENABLE_WEB_SERVICE) if (ENABLE_WEB_SERVICE)
target_compile_definitions(core PUBLIC -DENABLE_WEB_SERVICE) target_compile_definitions(core PUBLIC ENABLE_WEB_SERVICE)
target_link_libraries(core PUBLIC web_service) target_link_libraries(core PUBLIC web_service)
endif() endif()

View file

@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
@ -31,6 +34,10 @@
#include "core/hle/service/filesystem/filesystem.h" #include "core/hle/service/filesystem/filesystem.h"
#include "core/loader/loader.h" #include "core/loader/loader.h"
#ifndef MBEDTLS_CMAC_C
#error mbedtls was compiled without CMAC support. Check your USE flags (Gentoo) or contact your package maintainer.
#endif
namespace Core::Crypto { namespace Core::Crypto {
namespace { namespace {

View file

@ -1,3 +1,6 @@
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2017 Citra Emulator Project # SPDX-FileCopyrightText: 2017 Citra Emulator Project
# SPDX-License-Identifier: GPL-2.0-or-later # SPDX-License-Identifier: GPL-2.0-or-later
@ -13,7 +16,7 @@ add_library(yuzu-room STATIC EXCLUDE_FROM_ALL
target_link_libraries(yuzu-room PRIVATE common network) target_link_libraries(yuzu-room PRIVATE common network)
if (ENABLE_WEB_SERVICE) if (ENABLE_WEB_SERVICE)
target_compile_definitions(yuzu-room PRIVATE -DENABLE_WEB_SERVICE) target_compile_definitions(yuzu-room PRIVATE ENABLE_WEB_SERVICE)
target_link_libraries(yuzu-room PRIVATE web_service) target_link_libraries(yuzu-room PRIVATE web_service)
endif() endif()

View file

@ -1,3 +1,6 @@
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
cmake_minimum_required(VERSION 3.12) cmake_minimum_required(VERSION 3.12)
project(dynarmic LANGUAGES C CXX ASM VERSION 6.7.0) project(dynarmic LANGUAGES C CXX ASM VERSION 6.7.0)
@ -147,28 +150,26 @@ else()
endif() endif()
endif() endif()
# Forced use of individual bundled libraries for non-REQUIRED library is possible with e.g. cmake -DCMAKE_DISABLE_FIND_PACKAGE_fmt=ON ...
if (DYNARMIC_USE_BUNDLED_EXTERNALS)
set(CMAKE_DISABLE_FIND_PACKAGE_biscuit ON)
set(CMAKE_DISABLE_FIND_PACKAGE_fmt ON)
set(CMAKE_DISABLE_FIND_PACKAGE_mcl ON)
set(CMAKE_DISABLE_FIND_PACKAGE_oaknut ON)
set(CMAKE_DISABLE_FIND_PACKAGE_unordered_dense ON)
set(CMAKE_DISABLE_FIND_PACKAGE_xbyak ON)
set(CMAKE_DISABLE_FIND_PACKAGE_Zydis ON)
set(CMAKE_DISABLE_FIND_PACKAGE_Zycore ON)
endif()
find_package(Boost 1.57 REQUIRED) find_package(Boost 1.57 REQUIRED)
find_package(fmt 9 CONFIG) find_package(fmt 9 CONFIG)
# Pull in externals CMakeLists for libs where available
add_subdirectory(externals)
find_package(mcl 0.1.12 REQUIRED)
if ("arm64" IN_LIST ARCHITECTURE OR DYNARMIC_TESTS) if ("arm64" IN_LIST ARCHITECTURE OR DYNARMIC_TESTS)
find_package(oaknut 2.0.1 CONFIG) find_package(oaknut 2.0.1 CONFIG)
endif() endif()
if ("riscv" IN_LIST ARCHITECTURE)
find_package(biscuit 0.9.1 REQUIRED)
endif()
if ("x86_64" IN_LIST ARCHITECTURE) if ("x86_64" IN_LIST ARCHITECTURE)
find_package(xbyak 7 CONFIG) find_package(xbyak 7 CONFIG)
find_package(zycore REQUIRED)
find_package(zydis 4 REQUIRED)
endif() endif()
if (DYNARMIC_USE_LLVM) if (DYNARMIC_USE_LLVM)
@ -183,9 +184,6 @@ if (DYNARMIC_TESTS)
endif() endif()
endif() endif()
# Pull in externals CMakeLists for libs where available
add_subdirectory(externals)
# Dynarmic project files # Dynarmic project files
add_subdirectory(src/dynarmic) add_subdirectory(src/dynarmic)
if (DYNARMIC_TESTS) if (DYNARMIC_TESTS)

View file

@ -1,5 +1,6 @@
# Explicitly include CPMUtil here since we have a separate cpmfile for dynarmic # SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
set(CPMUTIL_JSON_FILE ${CMAKE_CURRENT_SOURCE_DIR}/cpmfile.json) # SPDX-License-Identifier: GPL-3.0-or-later
include(CPMUtil) include(CPMUtil)
# Always build externals as static libraries, even when dynarmic is built as shared # Always build externals as static libraries, even when dynarmic is built as shared
@ -20,62 +21,25 @@ set(BUILD_TESTING OFF)
# biscuit # biscuit
if ("riscv" IN_LIST ARCHITECTURE) if ("riscv" IN_LIST ARCHITECTURE)
add_subdirectory(biscuit)
AddJsonPackage( AddJsonPackage(
NAME biscuit NAME biscuit
BUNDLED_PACKAGE ${DYNARMIC_USE_BUNDLED_EXTERNALS} BUNDLED_PACKAGE ${DYNARMIC_USE_BUNDLED_EXTERNALS}
) )
endif() endif()
# catch
# 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()
# mcl # mcl
AddJsonPackage( AddJsonPackage(
NAME mcl NAME mcl
BUNDLED_PACKAGE ${DYNARMIC_USE_BUNDLED_EXTERNALS} BUNDLED_PACKAGE ${DYNARMIC_USE_BUNDLED_EXTERNALS}
) )
# oaknut
# if (NOT TARGET merry::oaknut)
# if ("arm64" IN_LIST ARCHITECTURE)
# add_subdirectory(oaknut)
# elseif (DYNARMIC_TESTS)
# add_subdirectory(oaknut EXCLUDE_FROM_ALL)
# endif()
# endif()
# xbyak
# uncomment if in an independent repo
# if (NOT TARGET xbyak::xbyak)
# if ("x86_64" IN_LIST ARCHITECTURE)
# add_subdirectory(xbyak)
# endif()
# endif()
# zydis
# TODO(crueter): maybe it's just Gentoo but zydis system package really sucks # TODO(crueter): maybe it's just Gentoo but zydis system package really sucks
if ("x86_64" IN_LIST ARCHITECTURE) if ("x86_64" IN_LIST ARCHITECTURE)
set(CMAKE_DISABLE_FIND_PACKAGE_Doxygen ON) set(CMAKE_DISABLE_FIND_PACKAGE_Doxygen ON)
# TODO(crueter): system zycore doesn't work with zydis AddJsonPackage(
AddJsonPackage(zycore) NAME zycore
BUNDLED_PACKAGE ${DYNARMIC_USE_BUNDLED_EXTERNALS}
)
AddJsonPackage( AddJsonPackage(
NAME zydis NAME zydis

View file

@ -15,14 +15,13 @@
] ]
}, },
"zycore": { "zycore": {
"package": "Zycore", "package": "zycore",
"repo": "zyantific/zycore-c", "repo": "zyantific/zycore-c",
"sha": "75a36c45ae", "sha": "75a36c45ae",
"hash": "15aa399f39713e042c4345bc3175c82f14dca849fde2a21d4f591f62c43e227b70d868d8bb86beb5f4eb68b1d6bd3792cdd638acf89009e787e3d10ee7401924", "hash": "15aa399f39713e042c4345bc3175c82f14dca849fde2a21d4f591f62c43e227b70d868d8bb86beb5f4eb68b1d6bd3792cdd638acf89009e787e3d10ee7401924"
"bundled": true
}, },
"zydis": { "zydis": {
"package": "Zydis", "package": "zydis",
"version": "4", "version": "4",
"repo": "zyantific/zydis", "repo": "zyantific/zydis",
"sha": "c2d2bab025", "sha": "c2d2bab025",

View file

@ -164,7 +164,7 @@ if ("x86_64" IN_LIST ARCHITECTURE)
target_link_libraries(dynarmic target_link_libraries(dynarmic
PRIVATE PRIVATE
xbyak::xbyak xbyak::xbyak
Zydis Zydis::Zydis
) )
target_architecture_specific_sources(dynarmic "x86_64" target_architecture_specific_sources(dynarmic "x86_64"

View file

@ -1,3 +1,6 @@
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2022 yuzu Emulator Project # SPDX-FileCopyrightText: 2022 yuzu Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
@ -21,7 +24,7 @@ create_target_directory_groups(network)
target_link_libraries(network PRIVATE common enet Boost::headers) target_link_libraries(network PRIVATE common enet Boost::headers)
if (ENABLE_WEB_SERVICE) if (ENABLE_WEB_SERVICE)
target_compile_definitions(network PRIVATE -DENABLE_WEB_SERVICE) target_compile_definitions(network PRIVATE ENABLE_WEB_SERVICE)
target_link_libraries(network PRIVATE web_service) target_link_libraries(network PRIVATE web_service)
endif() endif()

View file

@ -332,8 +332,10 @@ target_link_options(video_core PRIVATE ${FFmpeg_LDFLAGS})
add_dependencies(video_core host_shaders) add_dependencies(video_core host_shaders)
target_include_directories(video_core PRIVATE ${HOST_SHADERS_INCLUDE}) target_include_directories(video_core PRIVATE ${HOST_SHADERS_INCLUDE})
target_link_libraries(video_core PRIVATE sirit Vulkan::Headers Vulkan::UtilityHeaders) target_link_libraries(video_core PRIVATE sirit)
target_link_libraries(video_core PUBLIC GPUOpen::VulkanMemoryAllocator)
# Header-only stuff needed by all dependent targets
target_link_libraries(video_core PUBLIC Vulkan::UtilityHeaders GPUOpen::VulkanMemoryAllocator)
if (ENABLE_NSIGHT_AFTERMATH) if (ENABLE_NSIGHT_AFTERMATH)
if (NOT DEFINED ENV{NSIGHT_AFTERMATH_SDK}) if (NOT DEFINED ENV{NSIGHT_AFTERMATH_SDK})

View file

@ -401,7 +401,6 @@ target_link_libraries(yuzu PRIVATE nlohmann_json::nlohmann_json)
target_link_libraries(yuzu PRIVATE Boost::headers glad Qt6::Widgets) target_link_libraries(yuzu PRIVATE Boost::headers glad Qt6::Widgets)
target_link_libraries(yuzu PRIVATE ${PLATFORM_LIBRARIES} Threads::Threads) target_link_libraries(yuzu PRIVATE ${PLATFORM_LIBRARIES} Threads::Threads)
target_link_libraries(yuzu PRIVATE Vulkan::Headers)
if (NOT WIN32) if (NOT WIN32)
target_include_directories(yuzu PRIVATE ${Qt6Gui_PRIVATE_INCLUDE_DIRS}) target_include_directories(yuzu PRIVATE ${Qt6Gui_PRIVATE_INCLUDE_DIRS})
endif() endif()
@ -416,24 +415,24 @@ endif()
target_compile_definitions(yuzu PRIVATE target_compile_definitions(yuzu PRIVATE
# Use QStringBuilder for string concatenation to reduce # Use QStringBuilder for string concatenation to reduce
# the overall number of temporary strings created. # the overall number of temporary strings created.
-DQT_USE_QSTRINGBUILDER QT_USE_QSTRINGBUILDER
# Disable implicit conversions from/to C strings # Disable implicit conversions from/to C strings
-DQT_NO_CAST_FROM_ASCII QT_NO_CAST_FROM_ASCII
-DQT_NO_CAST_TO_ASCII QT_NO_CAST_TO_ASCII
# Disable implicit type narrowing in signal/slot connect() calls. # Disable implicit type narrowing in signal/slot connect() calls.
-DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT QT_NO_NARROWING_CONVERSIONS_IN_CONNECT
# Disable unsafe overloads of QProcess' start() function. # Disable unsafe overloads of QProcess' start() function.
-DQT_NO_PROCESS_COMBINED_ARGUMENT_START QT_NO_PROCESS_COMBINED_ARGUMENT_START
# Disable implicit QString->QUrl conversions to enforce use of proper resolving functions. # Disable implicit QString->QUrl conversions to enforce use of proper resolving functions.
-DQT_NO_URL_CAST_FROM_STRING QT_NO_URL_CAST_FROM_STRING
) )
if (YUZU_ENABLE_COMPATIBILITY_REPORTING) if (YUZU_ENABLE_COMPATIBILITY_REPORTING)
target_compile_definitions(yuzu PRIVATE -DYUZU_ENABLE_COMPATIBILITY_REPORTING) target_compile_definitions(yuzu PRIVATE YUZU_ENABLE_COMPATIBILITY_REPORTING)
endif() endif()
if (USE_DISCORD_PRESENCE) if (USE_DISCORD_PRESENCE)
@ -441,22 +440,22 @@ if (USE_DISCORD_PRESENCE)
discord_impl.cpp discord_impl.cpp
discord_impl.h discord_impl.h
) )
target_link_libraries(yuzu PRIVATE DiscordRPC::discord-rpc httplib::httplib Qt${QT_MAJOR_VERSION}::Network) target_link_libraries(yuzu PRIVATE DiscordRPC::discord-rpc httplib::httplib Qt6::Network)
target_compile_definitions(yuzu PRIVATE -DUSE_DISCORD_PRESENCE) target_compile_definitions(yuzu PRIVATE USE_DISCORD_PRESENCE)
endif() endif()
if (ENABLE_WEB_SERVICE) if (ENABLE_WEB_SERVICE)
target_compile_definitions(yuzu PRIVATE -DENABLE_WEB_SERVICE) target_compile_definitions(yuzu PRIVATE ENABLE_WEB_SERVICE)
endif() endif()
if (YUZU_USE_QT_MULTIMEDIA) if (YUZU_USE_QT_MULTIMEDIA)
target_link_libraries(yuzu PRIVATE Qt${QT_MAJOR_VERSION}::Multimedia) target_link_libraries(yuzu PRIVATE Qt6::Multimedia)
target_compile_definitions(yuzu PRIVATE -DYUZU_USE_QT_MULTIMEDIA) target_compile_definitions(yuzu PRIVATE YUZU_USE_QT_MULTIMEDIA)
endif () endif ()
if (YUZU_USE_QT_WEB_ENGINE) if (YUZU_USE_QT_WEB_ENGINE)
target_link_libraries(yuzu PRIVATE Qt${QT_MAJOR_VERSION}::WebEngineCore Qt${QT_MAJOR_VERSION}::WebEngineWidgets) target_link_libraries(yuzu PRIVATE Qt6::WebEngineCore Qt6::WebEngineWidgets)
target_compile_definitions(yuzu PRIVATE -DYUZU_USE_QT_WEB_ENGINE) target_compile_definitions(yuzu PRIVATE YUZU_USE_QT_WEB_ENGINE)
endif () endif ()
if(UNIX AND NOT APPLE) if(UNIX AND NOT APPLE)
@ -468,6 +467,7 @@ if (WIN32 AND NOT YUZU_USE_BUNDLED_QT AND QT_VERSION VERSION_GREATER_EQUAL 6)
add_custom_command(TARGET yuzu POST_BUILD COMMAND ${WINDEPLOYQT_EXECUTABLE} "${YUZU_EXE_DIR}/eden.exe" --dir "${YUZU_EXE_DIR}" --libdir "${YUZU_EXE_DIR}" --plugindir "${YUZU_EXE_DIR}/plugins" --no-compiler-runtime --no-opengl-sw --no-system-d3d-compiler --no-translations --verbose 0) add_custom_command(TARGET yuzu POST_BUILD COMMAND ${WINDEPLOYQT_EXECUTABLE} "${YUZU_EXE_DIR}/eden.exe" --dir "${YUZU_EXE_DIR}" --libdir "${YUZU_EXE_DIR}" --plugindir "${YUZU_EXE_DIR}/plugins" --no-compiler-runtime --no-opengl-sw --no-system-d3d-compiler --no-translations --verbose 0)
endif() endif()
# TODO(crueter): this can be done with system qt in a better way
if (YUZU_USE_BUNDLED_QT) if (YUZU_USE_BUNDLED_QT)
include(CopyYuzuQt6Deps) include(CopyYuzuQt6Deps)
copy_yuzu_Qt6_deps(yuzu) copy_yuzu_Qt6_deps(yuzu)

View file

@ -1,8 +1,6 @@
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project # SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
# 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) include(CPMUtil)
# Disable tests/tools in all externals supporting the standard option name # Disable tests/tools in all externals supporting the standard option name

View file

@ -1,3 +1,6 @@
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2018 yuzu Emulator Project # SPDX-FileCopyrightText: 2018 yuzu Emulator Project
# SPDX-License-Identifier: GPL-2.0-or-later # SPDX-License-Identifier: GPL-2.0-or-later
@ -28,7 +31,7 @@ add_executable(yuzu-cmd
yuzu.rc yuzu.rc
) )
target_link_libraries(yuzu-cmd PRIVATE common core input_common frontend_common) target_link_libraries(yuzu-cmd PRIVATE common core input_common frontend_common video_core)
target_link_libraries(yuzu-cmd PRIVATE glad) target_link_libraries(yuzu-cmd PRIVATE glad)
if (MSVC) if (MSVC)
target_link_libraries(yuzu-cmd PRIVATE getopt) target_link_libraries(yuzu-cmd PRIVATE getopt)
@ -38,8 +41,7 @@ target_link_libraries(yuzu-cmd PRIVATE ${PLATFORM_LIBRARIES} Threads::Threads)
create_resource("../../dist/yuzu.bmp" "yuzu_cmd/yuzu_icon.h" "yuzu_icon") create_resource("../../dist/yuzu.bmp" "yuzu_cmd/yuzu_icon.h" "yuzu_icon")
target_include_directories(yuzu-cmd PRIVATE ${RESOURCES_DIR}) target_include_directories(yuzu-cmd PRIVATE ${RESOURCES_DIR})
target_link_libraries(yuzu-cmd PRIVATE SDL2::SDL2 Vulkan::Headers) target_link_libraries(yuzu-cmd PRIVATE SDL2::SDL2)
target_link_libraries(yuzu-cmd PRIVATE GPUOpen::VulkanMemoryAllocator)
if(UNIX AND NOT APPLE) if(UNIX AND NOT APPLE)
install(TARGETS yuzu-cmd) install(TARGETS yuzu-cmd)

View file

@ -6,5 +6,6 @@
# SPDX-FileCopyrightText: 2025 crueter # SPDX-FileCopyrightText: 2025 crueter
# SPDX-License-Identifier: GPL-3.0-or-later # 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 " ") LIBS=$(find . externals src/yuzu/externals src/dynarmic -maxdepth 2 -name cpmfile.json -exec jq -j 'keys_unsorted | join(" ")' {} \; -printf " ")
tools/cpm-fetch.sh $LIBS tools/cpm-fetch.sh $LIBS

View file

@ -84,7 +84,7 @@ ci_package() {
for platform in windows-amd64 windows-arm64 android solaris freebsd linux linux-aarch64; do for platform in windows-amd64 windows-arm64 android solaris freebsd linux linux-aarch64; do
FILENAME="${NAME}-${platform}-${VERSION}.${EXT}" FILENAME="${NAME}-${platform}-${VERSION}.${EXT}"
DOWNLOAD="https://github.com/${REPO}/releases/download/v${VERSION}/${FILENAME}" DOWNLOAD="https://$GIT_HOST/${REPO}/releases/download/v${VERSION}/${FILENAME}"
PACKAGE_NAME="$PACKAGE" PACKAGE_NAME="$PACKAGE"
KEY=$platform KEY=$platform
@ -122,14 +122,32 @@ do
URL=$(jq -r ".url" <<< "$JSON") URL=$(jq -r ".url" <<< "$JSON")
REPO=$(jq -r ".repo" <<< "$JSON") REPO=$(jq -r ".repo" <<< "$JSON")
SHA=$(jq -r ".sha" <<< "$JSON") SHA=$(jq -r ".sha" <<< "$JSON")
GIT_HOST=$(jq -r ".git_host" <<< "$JSON")
[ "$GIT_HOST" == null ] && GIT_HOST=github.com
VERSION=$(jq -r ".version" <<< "$JSON")
GIT_VERSION=$(jq -r ".git_version" <<< "$JSON")
if [ "$GIT_VERSION" != null ]; then
VERSION_REPLACE="$GIT_VERSION"
else
VERSION_REPLACE="$VERSION"
fi
TAG=$(jq -r ".tag" <<< "$JSON")
TAG=$(sed "s/%VERSION%/$VERSION_REPLACE/" <<< $TAG)
ARTIFACT=$(jq -r ".artifact" <<< "$JSON")
ARTIFACT=$(sed "s/%VERSION%/$VERSION_REPLACE/" <<< $ARTIFACT)
ARTIFACT=$(sed "s/%TAG%/$TAG/" <<< $ARTIFACT)
if [ "$URL" != "null" ]; then if [ "$URL" != "null" ]; then
DOWNLOAD="$URL" DOWNLOAD="$URL"
elif [ "$REPO" != "null" ]; then elif [ "$REPO" != "null" ]; then
GIT_URL="https://github.com/$REPO" GIT_URL="https://$GIT_HOST/$REPO"
TAG=$(jq -r ".tag" <<< "$JSON")
ARTIFACT=$(jq -r ".artifact" <<< "$JSON")
BRANCH=$(jq -r ".branch" <<< "$JSON") BRANCH=$(jq -r ".branch" <<< "$JSON")
if [ "$TAG" != "null" ]; then if [ "$TAG" != "null" ]; then
@ -156,23 +174,20 @@ do
KEY=$(jq -r ".key" <<< "$JSON") KEY=$(jq -r ".key" <<< "$JSON")
if [ "$KEY" == null ]; then if [ "$KEY" == null ]; then
VERSION=$(jq -r ".version" <<< "$JSON")
GIT_VERSION=$(jq -r ".git_version" <<< "$JSON")
if [ "$SHA" != null ]; then if [ "$SHA" != null ]; then
KEY=$(cut -c1-4 - <<< "$SHA") KEY=$(cut -c1-4 - <<< "$SHA")
elif [ "$GIT_VERSION" != null ]; then elif [ "$GIT_VERSION" != null ]; then
KEY="$GIT_VERSION" KEY="$GIT_VERSION"
elif [ "$TAG" != null ]; then
KEY="$TAG"
elif [ "$VERSION" != null ]; then elif [ "$VERSION" != null ]; then
KEY="$VERSION" KEY="$VERSION"
else else
echo "No valid key could be determined for $package. Must define one of: key, sha, version, git_version" echo "No valid key could be determined for $package. Must define one of: key, sha, tag, version, git_version"
continue continue
fi fi
fi fi
echo $KEY
echo "Downloading regular package $package, with key $KEY, from $DOWNLOAD" echo "Downloading regular package $package, with key $KEY, from $DOWNLOAD"
# hash parsing # hash parsing