2025-06-09 01:40:21 +00:00
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
2025-03-31 18:33:05 +02:00
# SPDX-License-Identifier: GPL-3.0-or-later
2022-05-15 02:06:02 +02:00
2022-11-28 22:48:49 -05:00
cmake_minimum_required ( VERSION 3.22 )
2018-08-11 19:36:19 -04:00
2023-01-05 05:00:44 +01:00
project ( yuzu )
2017-05-27 23:45:55 -07:00
list ( APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules" )
list ( APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modules" )
2025-08-15 04:12:45 +02:00
if ( ${ CMAKE_SYSTEM_NAME } STREQUAL "SunOS" )
# Terrific Solaris pkg shenanigans
list ( APPEND CMAKE_PREFIX_PATH "/usr/lib/qt/6.6/lib/amd64/cmake" )
list ( APPEND CMAKE_MODULE_PATH "/usr/lib/qt/6.6/lib/amd64/cmake" )
endif ( )
2023-01-05 05:00:44 +01:00
2025-08-04 04:50:14 +02:00
set ( CPM_SOURCE_CACHE ${ CMAKE_SOURCE_DIR } /.cache/cpm )
2017-09-09 11:24:13 -06:00
include ( DownloadExternals )
2018-01-20 00:46:04 -07:00
include ( CMakeDependentOption )
2023-01-05 05:00:44 +01:00
include ( CTest )
2017-05-27 23:45:55 -07:00
2025-03-31 18:33:05 +02:00
# Disable Warnings as Errors for MSVC
if ( MSVC )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX-" )
endif ( )
2025-07-11 10:05:17 +02:00
if ( ${ CMAKE_SYSTEM_NAME } STREQUAL "FreeBSD" )
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib" )
endif ( )
2025-03-31 18:33:05 +02:00
# Check if SDL2::SDL2 target exists; if not, create an alias
if ( TARGET SDL2::SDL2-static )
add_library ( SDL2::SDL2 ALIAS SDL2::SDL2-static )
elseif ( TARGET SDL2::SDL2-shared )
add_library ( SDL2::SDL2 ALIAS SDL2::SDL2-shared )
endif ( )
2018-01-20 00:46:04 -07:00
# Set bundled sdl2/qt as dependent options.
2025-07-13 20:58:04 +02:00
# On Linux system SDL2 is likely to be lacking HIDAPI support which have drawbacks but is needed for SDL motion
2017-05-27 23:45:55 -07:00
option ( ENABLE_SDL2 "Enable the SDL2 frontend" ON )
2021-04-15 23:12:23 -07:00
CMAKE_DEPENDENT_OPTION ( YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 binaries" ON "ENABLE_SDL2;MSVC" OFF )
2025-08-14 20:30:30 +02:00
2025-07-11 10:05:17 +02:00
if ( ${ CMAKE_SYSTEM_NAME } STREQUAL "FreeBSD" )
2025-07-27 06:36:33 +02:00
CMAKE_DEPENDENT_OPTION ( YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" OFF "ENABLE_SDL2;NOT MSVC" OFF )
2025-07-11 10:05:17 +02:00
else ( )
2025-07-27 06:36:33 +02:00
CMAKE_DEPENDENT_OPTION ( YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" ON "ENABLE_SDL2;NOT MSVC" OFF )
2025-07-11 10:05:17 +02:00
endif ( )
2017-05-27 23:45:55 -07:00
2023-06-03 00:14:33 -07:00
cmake_dependent_option ( ENABLE_LIBUSB "Enable the use of LibUSB" ON "NOT ANDROID" OFF )
2022-12-28 17:26:46 -05:00
2022-12-10 15:12:27 -05:00
option ( ENABLE_OPENGL "Enable OpenGL" ON )
mark_as_advanced ( FORCE ENABLE_OPENGL )
2022-10-17 16:55:40 -07:00
2025-05-28 02:23:51 +00:00
option ( ENABLE_QT "Enable the Qt frontend" ON )
2020-01-26 00:26:07 +01:00
option ( ENABLE_QT_TRANSLATION "Enable translations for the Qt frontend" OFF )
2025-05-28 02:23:51 +00:00
option ( ENABLE_QT_UPDATE_CHECKER "Enable update checker for the Qt frontend" OFF )
2021-05-27 12:51:52 -04:00
CMAKE_DEPENDENT_OPTION ( YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" "${MSVC}" "ENABLE_QT" OFF )
2017-05-27 23:45:55 -07:00
2025-08-16 03:19:02 +02:00
option ( YUZU_USE_CPM "Use CPM to fetch Eden dependencies if needed" ON )
2025-08-14 20:30:30 +02:00
2018-09-16 20:05:51 +02:00
option ( ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON )
2025-07-23 09:54:00 +02:00
option ( ENABLE_WIFI_SCAN "Enable WiFi scanning" OFF )
2018-09-16 20:05:51 +02:00
2025-07-11 10:05:17 +02:00
if ( ${ CMAKE_SYSTEM_NAME } STREQUAL "FreeBSD" )
2025-08-04 04:50:14 +02:00
option ( YUZU_USE_BUNDLED_FFMPEG "Download/Build bundled FFmpeg" OFF )
2025-07-11 10:05:17 +02:00
else ( )
2025-08-04 04:50:14 +02:00
option ( YUZU_USE_BUNDLED_FFMPEG "Download/Build bundled FFmpeg" ON )
2025-07-11 10:05:17 +02:00
endif ( )
2021-02-05 13:45:10 -05:00
2025-07-11 10:05:17 +02:00
if ( ${ CMAKE_SYSTEM_NAME } STREQUAL "FreeBSD" )
2025-08-04 04:50:14 +02:00
option ( YUZU_USE_EXTERNAL_VULKAN_HEADERS "Use Vulkan-Headers from externals" OFF )
2025-07-11 10:05:17 +02:00
else ( )
2025-07-23 10:00:29 +02:00
option ( YUZU_USE_EXTERNAL_VULKAN_HEADERS "Use Vulkan-Headers from externals" ON )
2025-07-11 10:05:17 +02:00
endif ( )
2022-12-28 20:55:32 -05:00
2025-07-11 10:05:17 +02:00
if ( ${ CMAKE_SYSTEM_NAME } STREQUAL "FreeBSD" )
2025-08-04 04:50:14 +02:00
option ( YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES "Use Vulkan-Utility-Libraries from externals" OFF )
2025-07-11 10:05:17 +02:00
else ( )
2025-08-04 04:50:14 +02:00
option ( YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES "Use Vulkan-Utility-Libraries from externals" ON )
2025-07-11 10:05:17 +02:00
endif ( )
2023-12-28 11:35:28 +00:00
2025-07-11 10:05:17 +02:00
if ( ${ CMAKE_SYSTEM_NAME } STREQUAL "FreeBSD" )
option ( YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS "Use SPIRV-Tools from externals" OFF )
else ( )
option ( YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS "Use SPIRV-Tools from externals" ON )
endif ( )
2025-07-03 01:13:33 +00:00
2022-10-17 16:55:40 -07:00
option ( YUZU_USE_QT_MULTIMEDIA "Use QtMultimedia for Camera" OFF )
2018-12-24 16:24:01 -05:00
option ( YUZU_USE_QT_WEB_ENGINE "Use QtWebEngine for web applet implementation" OFF )
2025-07-16 23:17:34 +02:00
set ( YUZU_QT_MIRROR "" CACHE STRING "What mirror to use for downloading the bundled Qt libraries" )
2018-07-28 13:44:50 -04:00
option ( ENABLE_CUBEB "Enables the cubeb audio backend" ON )
2025-08-16 03:19:02 +02:00
CMAKE_DEPENDENT_OPTION ( USE_DISCORD_PRESENCE "Enables Discord Rich Presence" OFF "ENABLE_QT" OFF )
2018-09-16 20:05:51 +02:00
2025-08-02 17:22:38 +02:00
option ( ENABLE_MICROPROFILE "Enables microprofile capabilities" OFF )
2023-01-05 05:00:44 +01:00
option ( YUZU_TESTS "Compile tests" "${BUILD_TESTING}" )
2022-01-12 00:36:20 +01:00
2025-07-11 10:05:17 +02:00
if ( ${ CMAKE_SYSTEM_NAME } STREQUAL "FreeBSD" )
2025-08-04 04:50:14 +02:00
option ( YUZU_USE_PRECOMPILED_HEADERS "Use precompiled headers" OFF )
2025-07-11 10:05:17 +02:00
else ( )
2025-08-04 04:50:14 +02:00
option ( YUZU_USE_PRECOMPILED_HEADERS "Use precompiled headers" ON )
2025-07-11 10:05:17 +02:00
endif ( )
2022-11-22 18:38:23 -05:00
2023-09-08 22:43:54 +03:00
option ( YUZU_DOWNLOAD_ANDROID_VVL "Download validation layer binary for android" ON )
2025-08-04 04:50:14 +02:00
option ( FORCE_DOWNLOAD_WIN_BUNDLES "Forcefully download bundled Windows dependencies (useful for CI)" OFF )
2025-05-19 21:30:10 +00:00
CMAKE_DEPENDENT_OPTION ( YUZU_ROOM "Enable dedicated room functionality" ON "NOT ANDROID" 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 )
2022-12-28 17:18:27 -05:00
2023-10-04 13:11:05 -04:00
CMAKE_DEPENDENT_OPTION ( YUZU_CRASH_DUMPS "Compile crash dump (Minidump) support" OFF "WIN32 OR LINUX" OFF )
2022-07-25 16:45:38 -04:00
2025-07-11 10:05:17 +02:00
if ( ${ CMAKE_SYSTEM_NAME } STREQUAL "FreeBSD" )
2025-08-04 04:50:14 +02:00
option ( YUZU_CHECK_SUBMODULES "Check if submodules are present" OFF )
2025-07-11 10:05:17 +02:00
else ( )
2025-08-04 04:50:14 +02:00
option ( YUZU_CHECK_SUBMODULES "Check if submodules are present" ON )
2025-07-11 10:05:17 +02:00
endif ( )
2022-07-30 05:01:09 +02:00
2023-02-27 01:01:44 -03:00
option ( YUZU_ENABLE_LTO "Enable link-time optimization" OFF )
2025-08-04 04:50:14 +02:00
option ( YUZU_DOWNLOAD_TIME_ZONE_DATA "Always download time zone binaries" ON )
2023-06-16 04:32:31 -04:00
2023-09-06 18:53:39 -04:00
option ( YUZU_ENABLE_PORTABLE "Allow yuzu to enable portable mode if a user folder is found in the CWD" ON )
2022-12-10 12:50:00 -05:00
CMAKE_DEPENDENT_OPTION ( YUZU_USE_FASTER_LD "Check if a faster linker is available" ON "NOT WIN32" OFF )
2023-08-17 09:17:56 +08:00
CMAKE_DEPENDENT_OPTION ( USE_SYSTEM_MOLTENVK "Use the system MoltenVK lib (instead of the bundled one)" OFF "APPLE" OFF )
2023-06-25 17:36:51 -07:00
set ( DEFAULT_ENABLE_OPENSSL ON )
2025-07-23 10:00:29 +02:00
if ( ANDROID OR WIN32 OR APPLE OR ${ CMAKE_SYSTEM_NAME } STREQUAL "SunOS" )
2023-06-25 17:36:51 -07:00
# - Windows defaults to the Schannel backend.
2023-07-01 15:02:25 -07:00
# - macOS defaults to the SecureTransport backend.
2023-06-25 17:36:51 -07:00
# - Android currently has no SSL backend as the NDK doesn't include any SSL
# library; a proper 'native' backend would have to go through Java.
# But you can force builds for those platforms to use OpenSSL if you have
# your own copy of it.
set ( DEFAULT_ENABLE_OPENSSL OFF )
endif ( )
2025-08-14 20:30:30 +02:00
if ( ENABLE_WEB_SERVICE )
set ( DEFAULT_ENABLE_OPENSSL ON )
endif ( )
2023-06-25 17:36:51 -07:00
option ( ENABLE_OPENSSL "Enable OpenSSL backend for ISslConnection" ${ DEFAULT_ENABLE_OPENSSL } )
2023-06-19 18:17:43 -07:00
2023-09-08 22:43:54 +03:00
if ( ANDROID AND YUZU_DOWNLOAD_ANDROID_VVL )
set ( vvl_version "sdk-1.3.261.1" )
set ( vvl_zip_file "${CMAKE_BINARY_DIR}/externals/vvl-android.zip" )
if ( NOT EXISTS "${vvl_zip_file}" )
# Download and extract validation layer release to externals directory
set ( vvl_base_url "https://github.com/KhronosGroup/Vulkan-ValidationLayers/releases/download" )
file ( DOWNLOAD "${vvl_base_url}/${vvl_version}/android-binaries-${vvl_version}-android.zip"
"${vvl_zip_file}" SHOW_PROGRESS )
execute_process ( COMMAND ${ CMAKE_COMMAND } -E tar xf "${vvl_zip_file}"
2025-05-11 23:58:25 +00:00
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals" )
2023-09-08 22:43:54 +03:00
endif ( )
# Copy the arm64 binary to src/android/app/main/jniLibs
set ( vvl_lib_path "${CMAKE_CURRENT_SOURCE_DIR}/src/android/app/src/main/jniLibs/arm64-v8a/" )
file ( COPY "${CMAKE_BINARY_DIR}/externals/android-binaries-${vvl_version}/arm64-v8a/libVkLayer_khronos_validation.so"
2025-05-11 23:58:25 +00:00
DESTINATION "${vvl_lib_path}" )
2023-09-08 22:43:54 +03:00
endif ( )
2022-12-29 23:25:03 -08:00
if ( ANDROID )
set ( CMAKE_SKIP_INSTALL_RULES ON )
2025-04-02 03:06:18 +02:00
set ( CMAKE_POLICY_VERSION_MINIMUM 3.5 ) # Workaround for Oboe
2022-12-29 23:25:03 -08:00
endif ( )
2022-11-29 23:01:32 -05:00
if ( YUZU_USE_PRECOMPILED_HEADERS )
if ( MSVC AND CCACHE )
# buildcache does not properly cache PCH files, leading to compilation errors.
# See https://github.com/mbitsnbites/buildcache/discussions/230
message ( WARNING "buildcache does not properly support Precompiled Headers. Disabling PCH" )
2022-12-03 13:32:24 -05:00
set ( DYNARMIC_USE_PRECOMPILED_HEADERS OFF CACHE BOOL "" FORCE )
set ( YUZU_USE_PRECOMPILED_HEADERS OFF CACHE BOOL "" FORCE )
2022-11-29 23:01:32 -05:00
endif ( )
endif ( )
if ( YUZU_USE_PRECOMPILED_HEADERS )
message ( STATUS "Using Precompiled Headers." )
set ( CMAKE_PCH_INSTANTIATE_TEMPLATES ON )
endif ( )
2020-05-08 15:09:29 -06:00
# 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 )
set ( CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE )
message ( STATUS "Defaulting to a Release build" )
endif ( )
2019-12-05 22:48:20 -05:00
if ( EXISTS ${ PROJECT_SOURCE_DIR } /hooks/pre-commit AND NOT EXISTS ${ PROJECT_SOURCE_DIR } /.git/hooks/pre-commit )
2021-07-08 22:27:12 -03:00
if ( EXISTS ${ PROJECT_SOURCE_DIR } /.git/ )
message ( STATUS "Copying pre-commit hook" )
file ( COPY hooks/pre-commit DESTINATION ${ PROJECT_SOURCE_DIR } /.git/hooks )
endif ( )
2017-05-27 23:45:55 -07:00
endif ( )
2019-06-29 22:19:47 +02:00
# 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 } )
2025-08-03 04:10:34 +02:00
file ( GLOB RESULT "${PROJECT_SOURCE_DIR}/${module}/*" )
list ( LENGTH RESULT RES_LEN )
if ( RES_LEN EQUAL 0 )
2019-06-29 22:19:47 +02:00
message ( FATAL_ERROR "Git submodule ${module} not found. "
2025-05-11 23:58:25 +00:00
"Please run: \ngit submodule update --init --recursive" )
2019-06-29 22:19:47 +02:00
endif ( )
2025-08-14 20:30:30 +02:00
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 ( )
2019-06-29 22:19:47 +02:00
endforeach ( )
endfunction ( )
2019-12-05 22:48:20 -05:00
2022-07-30 05:01:09 +02:00
if ( EXISTS ${ PROJECT_SOURCE_DIR } /.gitmodules AND YUZU_CHECK_SUBMODULES )
2019-12-05 22:48:20 -05:00
check_submodules_present ( )
endif ( )
2018-10-20 17:08:26 -04:00
configure_file ( ${ PROJECT_SOURCE_DIR } /dist/compatibility_list/compatibility_list.qrc
2025-05-11 23:58:25 +00:00
${ PROJECT_BINARY_DIR } /dist/compatibility_list/compatibility_list.qrc
COPYONLY )
2022-07-04 00:41:31 +09:00
if ( EXISTS ${ PROJECT_SOURCE_DIR } /dist/compatibility_list/compatibility_list.json )
configure_file ( "${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.json"
2025-05-11 23:58:25 +00:00
"${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json"
COPYONLY )
2022-07-04 00:41:31 +09:00
endif ( )
2018-10-20 17:08:26 -04:00
if ( ENABLE_COMPATIBILITY_LIST_DOWNLOAD AND NOT EXISTS ${ PROJECT_BINARY_DIR } /dist/compatibility_list/compatibility_list.json )
2018-08-29 15:42:53 +02:00
message ( STATUS "Downloading compatibility list for yuzu..." )
file ( DOWNLOAD
https://api.yuzu-emu.org/gamedb/
2018-10-20 17:08:26 -04:00
"${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json" SHOW_PROGRESS )
2018-08-29 15:42:53 +02:00
endif ( )
2018-10-20 17:08:26 -04:00
if ( NOT EXISTS ${ PROJECT_BINARY_DIR } /dist/compatibility_list/compatibility_list.json )
file ( WRITE ${ PROJECT_BINARY_DIR } /dist/compatibility_list/compatibility_list.json "" )
2018-08-29 15:42:53 +02:00
endif ( )
2017-05-27 23:45:55 -07:00
# Detect current compilation architecture and create standard definitions
# =======================================================================
2015-08-28 16:57:08 -03:00
2015-08-28 16:55:22 -03:00
include ( CheckSymbolExists )
function ( detect_architecture symbol arch )
if ( NOT DEFINED ARCHITECTURE )
set ( CMAKE_REQUIRED_QUIET 1 )
check_symbol_exists ( "${symbol}" "" ARCHITECTURE_ ${ arch } )
unset ( CMAKE_REQUIRED_QUIET )
# The output variable needs to be unique across invocations otherwise
# CMake's crazy scope rules will keep it defined
if ( ARCHITECTURE_ ${ arch } )
set ( ARCHITECTURE "${arch}" PARENT_SCOPE )
set ( ARCHITECTURE_ ${ arch } 1 PARENT_SCOPE )
add_definitions ( -DARCHITECTURE_ ${ arch } =1 )
endif ( )
endif ( )
endfunction ( )
2018-01-19 19:36:09 -05:00
if ( NOT ENABLE_GENERIC )
if ( MSVC )
detect_architecture ( "_M_AMD64" x86_64 )
detect_architecture ( "_M_IX86" x86 )
2022-11-06 16:45:36 -05:00
detect_architecture ( "_M_ARM" arm )
detect_architecture ( "_M_ARM64" arm64 )
2018-01-19 19:36:09 -05:00
else ( )
detect_architecture ( "__x86_64__" x86_64 )
detect_architecture ( "__i386__" x86 )
2022-11-06 16:45:36 -05:00
detect_architecture ( "__arm__" arm )
detect_architecture ( "__aarch64__" arm64 )
2018-01-19 19:36:09 -05:00
endif ( )
2015-08-28 16:55:22 -03:00
endif ( )
2018-01-19 19:36:09 -05:00
2015-08-28 16:55:22 -03:00
if ( NOT DEFINED ARCHITECTURE )
set ( ARCHITECTURE "GENERIC" )
set ( ARCHITECTURE_GENERIC 1 )
add_definitions ( -DARCHITECTURE_GENERIC=1 )
2015-08-14 22:29:08 -04:00
endif ( )
2015-08-28 16:55:22 -03:00
message ( STATUS "Target architecture: ${ARCHITECTURE}" )
2015-08-14 22:29:08 -04:00
2020-08-31 10:09:06 -04:00
if ( UNIX )
add_definitions ( -DYUZU_UNIX=1 )
endif ( )
2017-05-27 23:45:55 -07:00
2025-08-04 04:50:14 +02:00
if ( ARCHITECTURE_arm64 AND ( ANDROID OR APPLE OR ${ CMAKE_SYSTEM_NAME } STREQUAL "Linux" ) )
2023-11-26 20:25:18 -05:00
set ( HAS_NCE 1 )
add_definitions ( -DHAS_NCE=1 )
endif ( )
2025-05-19 21:30:10 +00:00
if ( YUZU_ROOM )
add_definitions ( -DYUZU_ROOM )
endif ( )
2025-07-27 06:36:33 +02:00
# Build/optimization presets
if ( ${ CMAKE_SYSTEM_NAME } STREQUAL "Linux" )
if ( ARCHITECTURE_x86_64 )
2025-08-07 22:09:02 +02:00
set ( YUZU_BUILD_PRESET "custom" CACHE STRING "Build preset to use. One of: custom, generic, v3, zen2, zen4, native" )
2025-07-27 06:36:33 +02:00
if ( ${ YUZU_BUILD_PRESET } STREQUAL "generic" )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=x86-64 -mtune=generic" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=x86-64 -mtune=generic" )
elseif ( ${ YUZU_BUILD_PRESET } STREQUAL "v3" )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=x86-64-v3 -mtune=generic" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=x86-64-v3 -mtune=generic" )
elseif ( ${ YUZU_BUILD_PRESET } STREQUAL "zen2" )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=znver2 -mtune=znver2" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=znver2 -mtune=znver2" )
elseif ( ${ YUZU_BUILD_PRESET } STREQUAL "zen4" )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=znver4 -mtune=znver4" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=znver4 -mtune=znver4" )
elseif ( ${ YUZU_BUILD_PRESET } STREQUAL "native" )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native -mtune=native" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=native -mtune=native" )
endif ( )
elseif ( ARCHITECTURE_arm64 )
2025-08-07 22:09:02 +02:00
set ( YUZU_BUILD_PRESET "custom" CACHE STRING "Build preset to use. One of: custom, generic, armv9" )
2025-07-27 06:36:33 +02:00
if ( ${ YUZU_BUILD_PRESET } STREQUAL "generic" )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8-a -mtune=generic" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8-a -mtune=generic" )
elseif ( ${ YUZU_BUILD_PRESET } STREQUAL "armv9" )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv9-a -mtune=generic" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv9-a -mtune=generic" )
endif ( )
endif ( )
endif ( )
# Other presets, e.g. steamdeck
set ( YUZU_SYSTEM_PROFILE "generic" CACHE STRING "CMake and Externals profile to use. One of: generic, steamdeck" )
2019-03-16 01:45:08 -04:00
# Configure C++ standard
2017-05-27 23:45:55 -07:00
# ===========================
2024-04-05 01:58:30 +02:00
set ( CMAKE_CXX_STANDARD 20 )
set ( CMAKE_CXX_STANDARD_REQUIRED ON )
2016-06-30 11:59:32 -06:00
2018-01-15 10:42:40 +01:00
# Output binaries to bin/
2018-10-20 17:08:26 -04:00
set ( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${ PROJECT_BINARY_DIR } /bin )
2018-01-15 10:42:40 +01:00
2020-05-08 15:09:29 -06:00
# System imported libraries
# =======================================================================
2016-03-27 11:59:50 +08:00
2025-08-16 03:19:02 +02:00
include ( CPMUtil )
2025-08-14 20:30:30 +02:00
if ( YUZU_USE_CPM )
message ( STATUS "Fetching needed dependencies with CPM" )
set ( BUILD_SHARED_LIBS OFF )
set ( BUILD_TESTING OFF )
# TODO(crueter): renderdoc?
# openssl funniness
if ( ENABLE_OPENSSL )
if ( MSVC )
set ( BUILD_SHARED_LIBS OFF )
AddPackage (
NAME OpenSSL
REPO crueter/OpenSSL-CI
TAG v3.5.2
VERSION 3.5.2
ARTIFACT openssl-windows-3.5.2.tar.zst
KEY windows
HASH_SUFFIX sha512sum
BUNDLED_PACKAGE ON
)
include ( ${ OpenSSL_SOURCE_DIR } /openssl.cmake )
endif ( )
2022-11-25 19:35:46 +01:00
2025-08-14 20:30:30 +02:00
if ( ANDROID )
set ( BUILD_SHARED_LIBS OFF )
AddPackage (
NAME OpenSSL
REPO crueter/OpenSSL-CI
TAG v3.5.2
VERSION 3.5.2
ARTIFACT openssl-android-3.5.2.tar.zst
KEY android
HASH_SUFFIX sha512sum
BUNDLED_PACKAGE ON
)
include ( ${ OpenSSL_SOURCE_DIR } /openssl.cmake )
endif ( )
endif ( )
2025-08-16 03:19:02 +02:00
# boost
set ( BOOST_INCLUDE_LIBRARIES algorithm icl pool container heap asio headers process filesystem crc variant )
2025-08-14 20:30:30 +02:00
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
)
2025-08-16 03:19:02 +02:00
# really annoying thing where boost::headers doesn't work with cpm
# TODO(crueter) investigate
2025-08-14 20:30:30 +02:00
set ( BOOST_NO_HEADERS ${ Boost_ADDED } )
if ( Boost_ADDED )
if ( MSVC OR ANDROID )
add_compile_definitions ( YUZU_BOOST_v1 )
else ( )
message ( WARNING "Using bundled Boost on a non-MSVC or Android system is not recommended. You are strongly encouraged to install Boost through your system's package manager." )
endif ( )
if ( NOT MSVC )
# boost sucks
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 )
endif ( )
endif ( )
2025-08-16 03:19:02 +02:00
# fmt
2025-08-14 20:30:30 +02:00
AddPackage (
NAME fmt
REPO fmtlib/fmt
SHA 40626af88b
HASH d59f06c24339f223de4ec2afeba1c67b5835a0f350a1ffa86242a72fc3e616a6b8b21798355428d4200c75287308b66634619ffa0b52ba5bd74cc01772ea1a8a
VERSION 8
OPTIONS
"FMT_INSTALL OFF"
)
2025-08-16 03:19:02 +02:00
# lz4
2025-08-14 20:30:30 +02:00
AddPackage (
NAME lz4
REPO lz4/lz4
SHA ebb370ca83
HASH 43600e87b35256005c0f2498fa56a77de6783937ba4cfce38c099f27c03188d097863e8a50c5779ca0a7c63c29c4f7ed0ae526ec798c1fd2e3736861b62e0a37
SOURCE_SUBDIR build/cmake
)
if ( lz4_ADDED )
add_library ( lz4::lz4 ALIAS lz4_static )
endif ( )
2025-08-16 03:19:02 +02:00
# nlohmann
2025-08-14 20:30:30 +02:00
AddPackage (
NAME nlohmann_json
REPO nlohmann/json
SHA 55f93686c0
HASH b739749b066800e21154506ea150d2c5cbce8a45344177f46f884547a1399d26753166fd0df8135269ce28cf223552b1b65cd625b88c844d54753f2434900486
VERSION 3.8
)
2025-08-16 03:19:02 +02:00
# zlib
2025-08-14 20:30:30 +02:00
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
)
if ( ZLIB_ADDED )
add_library ( ZLIB::ZLIB ALIAS zlibstatic )
endif ( )
2025-08-16 03:19:02 +02:00
# zstd
2025-08-14 20:30:30 +02:00
AddPackage (
NAME zstd
REPO facebook/zstd
SHA f8745da6ff
HASH 3037007f990040fe32573b46f9bef8762fd5dbeeb07ffffcbfeba51ec98167edae39bb9c87f9299efcd61c4e467c5e84f7c19f0df7799bc1fc04864a278792ee
VERSION 1.5
SOURCE_SUBDIR build/cmake
2025-08-16 03:19:02 +02:00
OPTIONS
"ZSTD_BUILD_SHARED OFF"
2025-08-14 20:30:30 +02:00
EXCLUDE_FROM_ALL ON
)
2025-08-16 03:19:02 +02:00
# Catch2
2025-08-14 20:30:30 +02:00
if ( YUZU_TESTS OR DYNARMIC_TESTS )
AddPackage (
NAME Catch2
REPO catchorg/Catch2
SHA 644821ce28
HASH f8795f98acf2c02c0db8e734cc866d5caebab4b4a306e93598b97cb3c0c728dafe8283dce27ffe8d42460e5ae7302f3f32e7e274a7f991b73511ac88eef21b1f
VERSION 3.0.1
)
endif ( )
2025-08-16 03:19:02 +02:00
# ENet
AddPackage (
NAME enet
REPO lsalzman/enet
SHA 2662c0de09
VERSION 1.3
HASH 3de1beb4fa3d6b1e03eda8dd1e7580694f854af3ed3975dcdabfdcdf76b97f322b9734d35ea7f185855bb490d957842b938b26da4dd2dfded509390f8d2794dd
FIND_PACKAGE_ARGUMENTS "MODULE"
)
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"
)
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"
)
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 ( )
2025-08-14 20:30:30 +02:00
else ( )
# Enforce the search mode of non-required packages for better and shorter failure messages
find_package ( fmt 8 REQUIRED )
find_package ( LLVM MODULE COMPONENTS Demangle )
find_package ( nlohmann_json 3.8 REQUIRED )
find_package ( lz4 REQUIRED )
find_package ( RenderDoc MODULE )
find_package ( stb MODULE )
2025-08-16 03:19:02 +02:00
find_package ( enet 1.3 MODULE )
find_package ( Opus 1.3 MODULE )
2025-08-14 20:30:30 +02:00
find_package ( ZLIB 1.2 REQUIRED )
find_package ( zstd 1.5 REQUIRED )
2025-08-16 03:19:02 +02:00
if ( ENABLE_CUBEB )
find_package ( cubeb CONFIG )
endif ( )
2025-08-14 20:30:30 +02:00
if ( YUZU_TESTS )
find_package ( Catch2 3.0.1 REQUIRED )
endif ( )
if ( CMAKE_SYSTEM_NAME STREQUAL "Linux" OR ANDROID )
find_package ( gamemode 1.7 MODULE )
endif ( )
if ( ENABLE_OPENSSL )
find_package ( OpenSSL 1.1.1 REQUIRED )
endif ( )
2025-07-03 01:13:33 +00:00
endif ( )
2025-08-16 03:19:02 +02:00
if ( NOT TARGET Boost::headers )
AddPackage (
NAME boost_headers
REPO "boostorg/headers"
SHA 0456900fad
HASH 50cd75dcdfc5f082225cdace058f47b4fb114a47585f7aee1d22236a910a80b667186254c214fa2fcebac67ae6d37ba4b6e695e1faea8affd6fd42a03cf996e3
BUNDLED_PACKAGE ON
)
endif ( )
2022-12-28 17:26:46 -05:00
if ( ENABLE_LIBUSB )
2025-07-11 10:05:17 +02:00
if ( ${ CMAKE_SYSTEM_NAME } STREQUAL "FreeBSD" )
2025-08-04 21:57:01 +02:00
find_package ( libusb MODULE )
2025-07-11 10:05:17 +02:00
else ( )
2025-08-04 21:57:01 +02:00
find_package ( libusb 1.0.24 MODULE )
2025-07-11 10:05:17 +02:00
endif ( )
2022-12-28 17:26:46 -05:00
endif ( )
2025-08-16 03:19:02 +02:00
# 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
)
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
EXCLUDE_FROM_ALL ON
FIND_PACKAGE_ARGUMENTS "MODULE"
)
2025-08-14 20:30:30 +02:00
# 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 )
2023-11-03 19:27:08 +01:00
endif ( )
2025-03-31 18:33:05 +02:00
# find SDL2 exports a bunch of variables that are needed, so its easier to do this outside of the YUZU_find_package
2025-07-27 06:36:33 +02:00
# TODO(crueter): combine this all with CPM.
2021-04-15 23:12:23 -07:00
if ( ENABLE_SDL2 )
if ( YUZU_USE_BUNDLED_SDL2 )
# Detect toolchain and platform
2025-03-31 02:11:06 +02:00
if ( ( MSVC_VERSION GREATER_EQUAL 1920 ) AND ARCHITECTURE_x86_64 )
2025-06-03 18:36:20 +00:00
set ( SDL2_VER "SDL2-2.32.8" )
2021-04-15 23:12:23 -07:00
else ( )
message ( FATAL_ERROR "No bundled SDL2 binaries for your toolchain. Disable YUZU_USE_BUNDLED_SDL2 and provide your own." )
endif ( )
if ( DEFINED SDL2_VER )
2025-08-11 22:27:29 +02:00
download_bundled_external ( "sdl2/" ${ SDL2_VER } "sdl2-bundled" SDL2_PREFIX 2.32.8 )
2021-04-15 23:12:23 -07:00
endif ( )
set ( SDL2_FOUND YES )
set ( SDL2_INCLUDE_DIR "${SDL2_PREFIX}/include" CACHE PATH "Path to SDL2 headers" )
set ( SDL2_LIBRARY "${SDL2_PREFIX}/lib/x64/SDL2.lib" CACHE PATH "Path to SDL2 library" )
set ( SDL2_DLL_DIR "${SDL2_PREFIX}/lib/x64/" CACHE PATH "Path to SDL2.dll" )
2022-12-06 00:44:52 +01:00
add_library ( SDL2::SDL2 INTERFACE IMPORTED )
target_link_libraries ( SDL2::SDL2 INTERFACE "${SDL2_LIBRARY}" )
target_include_directories ( SDL2::SDL2 INTERFACE "${SDL2_INCLUDE_DIR}" )
2021-07-15 21:02:00 -04:00
elseif ( YUZU_USE_EXTERNAL_SDL2 )
message ( STATUS "Using SDL2 from externals." )
2021-04-15 23:12:23 -07:00
else ( )
2023-05-20 12:42:37 -06:00
find_package ( SDL2 2.26.4 REQUIRED )
2020-05-08 15:09:29 -06:00
endif ( )
endif ( )
2017-05-27 21:38:49 -07:00
2025-05-29 21:55:19 +00:00
# List of all FFmpeg components required
set ( FFmpeg_COMPONENTS
avcodec
avfilter
avutil
swscale )
2025-08-04 04:50:14 +02:00
# This function should be passed a list of all files in a target. It will automatically generate
# file groups following the directory hierarchy, so that the layout of the files in IDEs matches the
# one in the filesystem.
function ( create_target_directory_groups target_name )
# Place any files that aren't in the source list in a separate group so that they don't get in
# the way.
source_group ( "Other Files" REGULAR_EXPRESSION "." )
get_target_property ( target_sources "${target_name}" SOURCES )
foreach ( file_name IN LISTS target_sources )
get_filename_component ( dir_name "${file_name}" PATH )
# Group names use '\' as a separator even though the entire rest of CMake uses '/'...
string ( REPLACE "/" "\\" group_name "${dir_name}" )
source_group ( "${group_name}" FILES "${file_name}" )
endforeach ( )
endfunction ( )
2025-07-30 07:06:50 +02:00
2025-03-31 18:33:05 +02:00
add_subdirectory ( externals )
2025-08-14 20:30:30 +02:00
# pass targets from externals
2025-08-15 00:35:28 +02:00
find_package ( VulkanHeaders )
find_package ( VulkanUtilityLibraries )
find_package ( VulkanMemoryAllocator )
2025-08-14 20:30:30 +02:00
if ( ENABLE_WEB_SERVICE )
2025-08-15 00:35:28 +02:00
find_package ( httplib )
2025-08-14 20:30:30 +02:00
endif ( )
if ( ENABLE_WEB_SERVICE OR ENABLE_QT_UPDATE_CHECKER )
2025-08-15 00:35:28 +02:00
find_package ( cpp-jwt )
2025-08-14 20:30:30 +02:00
endif ( )
if ( NOT YUZU_USE_BUNDLED_SDL2 )
2025-08-16 03:19:02 +02:00
find_package ( SDL2 )
2025-08-14 20:30:30 +02:00
endif ( )
2025-03-31 18:33:05 +02:00
if ( ENABLE_QT )
2025-05-20 15:57:19 -04:00
if ( YUZU_USE_BUNDLED_QT )
2025-05-13 14:44:29 -04:00
download_qt ( 6.8.3 )
2025-05-20 15:57:19 -04:00
else ( )
message ( STATUS "Using system Qt" )
if ( NOT Qt6_DIR )
set ( Qt6_DIR "" CACHE PATH "Additional path to search for Qt6 libraries like C:/Qt/6.8.3/msvc2022_64/lib/cmake/Qt6" )
endif ( )
2025-08-04 04:50:14 +02:00
list ( APPEND CMAKE_PREFIX_PATH "${Qt6_DIR}" )
2025-03-31 18:33:05 +02:00
endif ( )
2025-07-17 21:00:00 +02:00
find_package ( Qt6 REQUIRED COMPONENTS Widgets Concurrent )
2025-07-16 23:17:34 +02:00
if ( YUZU_USE_QT_MULTIMEDIA )
find_package ( Qt6 REQUIRED COMPONENTS Multimedia )
2025-07-11 10:05:17 +02:00
endif ( )
2025-03-31 18:33:05 +02:00
2025-08-15 04:12:45 +02:00
if ( CMAKE_SYSTEM_NAME STREQUAL "Linux" )
2025-08-06 07:48:41 +02:00
find_package ( Qt6 REQUIRED COMPONENTS DBus GuiPrivate )
2025-08-15 04:12:45 +02:00
elseif ( UNIX AND NOT APPLE )
find_package ( Qt6 REQUIRED COMPONENTS DBus Gui )
2025-03-31 18:33:05 +02:00
endif ( )
if ( ENABLE_QT_TRANSLATION )
find_package ( Qt6 REQUIRED COMPONENTS LinguistTools )
endif ( )
if ( NOT DEFINED QT_TARGET_PATH )
get_target_property ( qtcore_path Qt6::Core LOCATION_Release )
string ( FIND "${qtcore_path}" "/bin/" qtcore_path_bin_pos REVERSE )
string ( FIND "${qtcore_path}" "/lib/" qtcore_path_lib_pos REVERSE )
if ( qtcore_path_bin_pos GREATER qtcore_path_lib_pos )
string ( SUBSTRING "${qtcore_path}" 0 ${ qtcore_path_bin_pos } QT_TARGET_PATH )
else ( )
string ( SUBSTRING "${qtcore_path}" 0 ${ qtcore_path_lib_pos } QT_TARGET_PATH )
endif ( )
endif ( )
if ( NOT DEFINED QT_HOST_PATH )
set ( QT_HOST_PATH "${QT_TARGET_PATH}" )
endif ( )
2025-05-20 15:57:19 -04:00
2025-03-31 18:33:05 +02:00
message ( STATUS "Using target Qt at ${QT_TARGET_PATH}" )
message ( STATUS "Using host Qt at ${QT_HOST_PATH}" )
endif ( )
function ( set_yuzu_qt_components )
2025-05-11 23:58:25 +00:00
# Best practice is to ask for all components at once, so they are from the same version
set ( YUZU_QT_COMPONENTS2 Core Widgets Concurrent )
if ( ${ CMAKE_SYSTEM_NAME } STREQUAL "Linux" )
list ( APPEND YUZU_QT_COMPONENTS2 DBus )
endif ( )
if ( YUZU_USE_QT_MULTIMEDIA )
list ( APPEND YUZU_QT_COMPONENTS2 Multimedia )
2025-03-31 18:33:05 +02:00
endif ( )
if ( YUZU_USE_QT_WEB_ENGINE )
2025-05-11 23:58:25 +00:00
list ( APPEND YUZU_QT_COMPONENTS2 WebEngineCore WebEngineWidgets )
2025-03-31 18:33:05 +02:00
endif ( )
if ( ENABLE_QT_TRANSLATION )
2025-05-11 23:58:25 +00:00
list ( APPEND YUZU_QT_COMPONENTS2 LinguistTools )
2025-03-31 18:33:05 +02:00
endif ( )
if ( USE_DISCORD_PRESENCE )
2025-05-11 23:58:25 +00:00
list ( APPEND YUZU_QT_COMPONENTS2 Network )
2025-03-31 18:33:05 +02:00
endif ( )
set ( YUZU_QT_COMPONENTS ${ YUZU_QT_COMPONENTS2 } PARENT_SCOPE )
2025-05-11 23:58:25 +00:00
endfunction ( set_yuzu_qt_components )
2025-03-31 18:33:05 +02:00
2025-05-11 23:58:25 +00:00
if ( UNIX AND NOT APPLE AND NOT ANDROID )
2022-09-20 22:21:52 +02:00
find_package ( PkgConfig REQUIRED )
2021-08-07 15:19:20 -04:00
pkg_check_modules ( LIBVA libva )
endif ( )
2025-08-04 04:50:14 +02:00
2021-02-06 03:14:11 -05:00
if ( NOT YUZU_USE_BUNDLED_FFMPEG )
# Use system installed FFmpeg
2025-07-11 10:05:17 +02:00
#find_package(FFmpeg 4.3 REQUIRED QUIET COMPONENTS ${FFmpeg_COMPONENTS})
find_package ( FFmpeg REQUIRED QUIET COMPONENTS ${ FFmpeg_COMPONENTS } )
2025-08-14 20:30:30 +02:00
# TODO(crueter): Version
set_property ( GLOBAL APPEND PROPERTY CPM_PACKAGE_NAMES FFmpeg )
set_property ( GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS "unknown (system)" )
set_property ( GLOBAL APPEND PROPERTY CPM_PACKAGE_URLS "https://github.com/FFmpeg/FFmpeg" )
2021-02-06 03:14:11 -05:00
endif ( )
2025-03-31 18:33:05 +02:00
if ( ENABLE_QT )
2025-05-11 23:58:25 +00:00
set_yuzu_qt_components ( )
find_package ( Qt6 REQUIRED COMPONENTS ${ YUZU_QT_COMPONENTS } )
set ( QT_MAJOR_VERSION 6 )
# Qt6 sets cxx_std_17 and we need to undo that
set_target_properties ( Qt6::Platform PROPERTIES INTERFACE_COMPILE_FEATURES "" )
endif ( )
2025-03-31 18:33:05 +02:00
2023-10-04 13:11:05 -04:00
if ( WIN32 AND YUZU_CRASH_DUMPS )
set ( BREAKPAD_VER "breakpad-c89f9dd" )
2025-08-11 22:27:29 +02:00
download_bundled_external ( "breakpad/" ${ BREAKPAD_VER } "breakpad-win" BREAKPAD_PREFIX "c89f9dd" )
2023-10-04 13:11:05 -04:00
set ( BREAKPAD_CLIENT_INCLUDE_DIR "${BREAKPAD_PREFIX}/include" )
set ( BREAKPAD_CLIENT_LIBRARY "${BREAKPAD_PREFIX}/lib/libbreakpad_client.lib" )
add_library ( libbreakpad_client INTERFACE IMPORTED )
target_link_libraries ( libbreakpad_client INTERFACE "${BREAKPAD_CLIENT_LIBRARY}" )
target_include_directories ( libbreakpad_client INTERFACE "${BREAKPAD_CLIENT_INCLUDE_DIR}" )
endif ( )
2020-05-08 15:09:29 -06:00
# Prefer the -pthread flag on Linux.
set ( THREADS_PREFER_PTHREAD_FLAG ON )
find_package ( Threads REQUIRED )
2018-01-04 00:13:23 -05:00
2017-05-27 23:45:55 -07:00
# Platform-specific library requirements
# ======================================
2019-03-16 01:45:08 -04:00
if ( APPLE )
# Umbrella framework for everything GUI-related
find_library ( COCOA_LIBRARY Cocoa )
2016-10-10 17:35:23 +00:00
set ( PLATFORM_LIBRARIES ${ COCOA_LIBRARY } ${ IOKIT_LIBRARY } ${ COREVIDEO_LIBRARY } )
2025-06-21 21:01:05 +00:00
find_library ( ICONV_LIBRARY iconv REQUIRED )
list ( APPEND PLATFORM_LIBRARIES ${ ICONV_LIBRARY } )
2019-03-16 01:45:08 -04:00
elseif ( WIN32 )
2023-03-03 20:48:15 -05:00
# Target Windows 10
add_definitions ( -D_WIN32_WINNT=0x0A00 -DWINVER=0x0A00 )
2021-08-12 21:32:53 +02:00
set ( PLATFORM_LIBRARIES winmm ws2_32 iphlpapi )
2019-03-16 01:45:08 -04:00
if ( MINGW )
2016-11-28 19:38:47 +01:00
# PSAPI is the Process Status API
2016-11-30 15:59:26 +01:00
set ( PLATFORM_LIBRARIES ${ PLATFORM_LIBRARIES } psapi imm32 version )
2019-03-16 01:45:08 -04:00
endif ( )
elseif ( CMAKE_SYSTEM_NAME MATCHES "^(Linux|kFreeBSD|GNU|SunOS)$" )
2014-12-24 10:34:25 +01:00
set ( PLATFORM_LIBRARIES rt )
2019-03-16 01:45:08 -04:00
endif ( )
2014-04-28 19:40:39 -07:00
2018-01-20 00:31:44 -07:00
# Setup a custom clang-format target (if clang-format can be found) that will run
# against all the src files. This should be used before making a pull request.
# =======================================================================
2023-01-29 19:56:12 -06:00
set ( CLANG_FORMAT_POSTFIX "-15" )
2018-01-20 00:31:44 -07:00
find_program ( CLANG_FORMAT
NAMES clang-format ${ CLANG_FORMAT_POSTFIX }
2025-05-11 23:58:25 +00:00
clang-format
2018-10-20 17:08:26 -04:00
PATHS ${ PROJECT_BINARY_DIR } /externals )
2018-01-20 00:31:44 -07:00
# if find_program doesn't find it, try to download from externals
if ( NOT CLANG_FORMAT )
2020-05-08 15:09:29 -06:00
if ( WIN32 AND NOT CMAKE_CROSSCOMPILING )
2018-01-20 00:31:44 -07:00
message ( STATUS "Clang format not found! Downloading..." )
2018-10-20 17:08:26 -04:00
set ( CLANG_FORMAT "${PROJECT_BINARY_DIR}/externals/clang-format${CLANG_FORMAT_POSTFIX}.exe" )
2018-01-20 00:31:44 -07:00
file ( DOWNLOAD
2025-07-05 23:59:23 +01:00
https://github.com/eden-emulator/ext-windows-bin/raw/master/clang-format ${ CLANG_FORMAT_POSTFIX } .exe
2018-01-20 00:31:44 -07:00
"${CLANG_FORMAT}" SHOW_PROGRESS
STATUS DOWNLOAD_SUCCESS )
if ( NOT DOWNLOAD_SUCCESS EQUAL 0 )
message ( WARNING "Could not download clang format! Disabling the clang format target" )
file ( REMOVE ${ CLANG_FORMAT } )
unset ( CLANG_FORMAT )
endif ( )
else ( )
message ( WARNING "Clang format not found! Disabling the clang format target" )
endif ( )
endif ( )
if ( CLANG_FORMAT )
2018-10-20 17:08:26 -04:00
set ( SRCS ${ PROJECT_SOURCE_DIR } /src )
2018-01-20 00:31:44 -07:00
set ( CCOMMENT "Running clang format against all the .h and .cpp files in src/" )
if ( WIN32 )
add_custom_target ( clang-format
2019-04-02 21:02:43 -04:00
COMMAND powershell.exe -Command "Get-ChildItem '${SRCS}/*' -Include *.cpp,*.h -Recurse | Foreach {&'${CLANG_FORMAT}' -i $_.fullname}"
2018-01-20 00:31:44 -07:00
COMMENT ${ CCOMMENT } )
elseif ( MINGW )
add_custom_target ( clang-format
COMMAND find `cygpath -u ${ SRCS } ` -iname *.h -o -iname *.cpp | xargs `cygpath -u ${ CLANG_FORMAT } ` -i
COMMENT ${ CCOMMENT } )
else ( )
add_custom_target ( clang-format
COMMAND find ${ SRCS } -iname *.h -o -iname *.cpp | xargs ${ CLANG_FORMAT } -i
COMMENT ${ CCOMMENT } )
endif ( )
unset ( SRCS )
unset ( CCOMMENT )
endif ( )
2015-08-28 16:57:08 -03:00
2017-05-27 23:45:55 -07:00
# Include source code
# ===================
2013-08-29 23:35:09 -04:00
2021-12-23 18:23:02 -07:00
# Adjustments for MSVC + Ninja
if ( MSVC AND CMAKE_GENERATOR STREQUAL "Ninja" )
add_compile_options (
/wd4464 # relative include path contains '..'
2022-10-21 02:34:07 -04:00
/wd4711 # function 'function' selected for automatic inline expansion
/wd4820 # 'bytes' bytes padding added after construct 'member_name'
2021-12-23 18:23:02 -07:00
)
endif ( )
2019-08-24 15:57:49 +02:00
2022-12-10 12:50:00 -05:00
if ( YUZU_USE_FASTER_LD AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
# We will assume that if the compiler is GCC, it will attempt to use ld.bfd by default.
# Try to pick a faster linker.
find_program ( LLD lld )
find_program ( MOLD mold )
if ( MOLD AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "12.1" )
message ( NOTICE "Selecting mold as linker" )
add_link_options ( "-fuse-ld=mold" )
elseif ( LLD )
message ( NOTICE "Selecting lld as linker" )
add_link_options ( "-fuse-ld=lld" )
endif ( )
endif ( )
2025-03-31 18:33:05 +02:00
# Set runtime library to MD/MDd for all configurations
if ( MSVC )
set ( CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL" )
# Force all projects (including external dependencies) to use the same runtime
set ( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD" )
set ( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd" )
set ( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MD" )
set ( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MDd" )
# Add this to ensure Cubeb uses the same runtime
add_compile_options (
$< $<CONFIG:Debug > :/MDd>
$< $<CONFIG:Release > :/MD>
$< $<CONFIG:RelWithDebInfo > :/MD>
$< $<CONFIG:MinSizeRel > :/MD>
)
endif ( )
2013-08-29 23:35:09 -04:00
add_subdirectory ( src )
2015-04-22 13:34:42 +02:00
2018-09-22 12:24:02 +02:00
# Set yuzu project or yuzu-cmd project as default StartUp Project in Visual Studio depending on whether QT is enabled or not
if ( ENABLE_QT )
set_property ( DIRECTORY ${ CMAKE_CURRENT_SOURCE_DIR } PROPERTY VS_STARTUP_PROJECT yuzu )
else ( )
set_property ( DIRECTORY ${ CMAKE_CURRENT_SOURCE_DIR } PROPERTY VS_STARTUP_PROJECT yuzu-cmd )
endif ( )
2018-09-12 17:36:10 +02:00
2017-05-27 23:45:55 -07:00
# Installation instructions
# =========================
2015-04-22 13:34:42 +02:00
# Install freedesktop.org metadata files, following those specifications:
2022-04-28 23:24:19 +02:00
# https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html
# https://specifications.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html
# https://specifications.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html
# https://www.freedesktop.org/software/appstream/docs/
2016-10-10 05:58:05 +00:00
if ( ENABLE_QT AND UNIX AND NOT APPLE )
2025-06-11 15:05:03 +00:00
install ( FILES "dist/org.eden_emu.eden.desktop"
2025-05-11 23:58:25 +00:00
DESTINATION "share/applications" )
2025-06-11 15:05:03 +00:00
install ( FILES "dist/org.eden_emu.eden.svg"
DESTINATION "share/icons/hicolor/scalable/apps" )
2025-05-20 15:57:19 -04:00
# TODO: these files need to be updated.
2025-06-11 15:05:03 +00:00
install ( FILES "dist/org.eden_emu.eden.xml"
2025-05-11 23:58:25 +00:00
DESTINATION "share/mime/packages" )
2025-06-11 15:05:03 +00:00
install ( FILES "dist/org.eden_emu.eden.metainfo.xml"
2025-05-11 23:58:25 +00:00
DESTINATION "share/metainfo" )
2015-04-22 13:34:42 +02:00
endif ( )