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 )
2025-08-19 21:29:36 +02:00
if ( ${ CMAKE_SYSTEM_NAME } STREQUAL "SunOS" )
set ( PLATFORM_SUN ON )
elseif ( ${ CMAKE_SYSTEM_NAME } STREQUAL "FreeBSD" )
set ( PLATFORM_FREEBSD ON )
elseif ( ${ CMAKE_SYSTEM_NAME } STREQUAL "OpenBSD" )
set ( PLATFORM_OPENBSD ON )
2025-10-17 22:12:58 +02:00
elseif ( ${ CMAKE_SYSTEM_NAME } STREQUAL "NetBSD" )
set ( PLATFORM_NETBSD ON )
2025-10-22 04:53:40 +02:00
elseif ( ${ CMAKE_SYSTEM_NAME } STREQUAL "Haiku" )
set ( PLATFORM_HAIKU ON )
2025-08-19 21:29:36 +02:00
elseif ( ${ CMAKE_SYSTEM_NAME } STREQUAL "Linux" )
set ( PLATFORM_LINUX ON )
endif ( )
2025-09-09 20:47:49 +02:00
if ( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" )
set ( CXX_CLANG ON )
if ( MSVC )
set ( CXX_CLANG_CL ON )
endif ( )
elseif ( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
set ( CXX_GCC ON )
elseif ( CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" )
set ( CXX_CL ON )
elseif ( CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM" )
set ( CXX_ICC ON )
elseif ( CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" )
set ( CXX_APPLE ON )
endif ( )
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-10-05 03:04:53 +02:00
# NB: this does not account for SPARC
# If you get Eden working on SPARC, please shoot crueter@crueter.xyz multiple emails
# and you will be hailed for eternity
2025-08-19 21:29:36 +02:00
if ( PLATFORM_SUN )
2025-08-15 04:12:45 +02:00
# 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" )
2025-10-05 03:04:53 +02:00
2025-10-17 22:12:58 +02:00
# Amazing - absolutely incredible
2025-10-05 03:04:53 +02:00
list ( APPEND CMAKE_PREFIX_PATH "/usr/lib/amd64/cmake" )
list ( APPEND CMAKE_MODULE_PATH "/usr/lib/amd64/cmake" )
2025-08-20 00:21:16 +02:00
# For some mighty reason, doing a normal release build sometimes may not trigger
# the proper -O3 switch to materialize
if ( CMAKE_BUILD_TYPE MATCHES "Release" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3" )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3" )
endif ( )
2025-10-17 05:08:51 +02:00
if ( CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2" )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2" )
endif ( )
2025-08-15 04:12:45 +02:00
endif ( )
2023-01-05 05:00:44 +01:00
2025-09-16 18:44:19 +02:00
# Needed for FFmpeg w/ VAAPI and DRM
if ( PLATFORM_OPENBSD )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I/usr/X11R6/include" )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/X11R6/include" )
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/X11R6/lib" )
2025-10-17 22:12:58 +02:00
elseif ( PLATFORM_NETBSD )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I/usr/X11R7/include" )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/X11R7/include" )
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/X11R7/lib" )
endif ( )
# NetBSD: Fun for the whole family!
if ( PLATFORM_NETBSD )
set ( ENV{PKG_CONFIG_PATH} "${PKG_CONFIG_PATH}:/usr/pkg/lib/ffmpeg7/pkgconfig" )
2025-09-16 18:44:19 +02:00
endif ( )
2025-09-09 20:47:49 +02:00
# Detect current compilation architecture and create standard definitions
# =======================================================================
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 ( )
if ( NOT ENABLE_GENERIC )
if ( MSVC )
detect_architecture ( "_M_AMD64" x86_64 )
detect_architecture ( "_M_IX86" x86 )
detect_architecture ( "_M_ARM" arm )
detect_architecture ( "_M_ARM64" arm64 )
else ( )
detect_architecture ( "__x86_64__" x86_64 )
detect_architecture ( "__i386__" x86 )
detect_architecture ( "__arm__" arm )
detect_architecture ( "__aarch64__" arm64 )
endif ( )
endif ( )
if ( NOT DEFINED ARCHITECTURE )
set ( ARCHITECTURE "GENERIC" )
set ( ARCHITECTURE_GENERIC 1 )
add_definitions ( -DARCHITECTURE_GENERIC=1 )
endif ( )
message ( STATUS "Target architecture: ${ARCHITECTURE}" )
if ( MSVC AND ARCHITECTURE_x86 )
message ( FATAL_ERROR "Attempting to build with the x86 environment is not supported. \
2025-09-16 18:44:19 +02:00
This can typically happen if you used the Developer Command Prompt from the start menu; \
2025-09-09 20:47:49 +02:00
instead, run vcvars64.bat directly, located at C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Auxiliary/Build/vcvars64.bat" )
endif ( )
if ( CXX_CLANG_CL )
add_compile_options (
# clang-cl prints literally 10000+ warnings without this
$< $<COMPILE_LANGUAGE:C,CXX > :-Wno-unused-command-line-argument>
$< $<COMPILE_LANGUAGE:C,CXX > :-Wno-unsafe-buffer-usage>
$< $<COMPILE_LANGUAGE:C,CXX > :-Wno-unused-value>
$< $<COMPILE_LANGUAGE:C,CXX > :-Wno-extra-semi-stmt>
$< $<COMPILE_LANGUAGE:C,CXX > :-Wno-sign-conversion>
$< $<COMPILE_LANGUAGE:C,CXX > :-Wno-reserved-identifier>
$< $<COMPILE_LANGUAGE:C,CXX > :-Wno-deprecated-declarations>
$< $<COMPILE_LANGUAGE:C,CXX > :-Wno-cast-function-type-mismatch>
$< $<COMPILE_LANGUAGE:C,CXX > :/EHsc> # thanks microsoft
)
if ( ARCHITECTURE_x86_64 )
add_compile_options (
# Required CPU features for amd64
$< $<COMPILE_LANGUAGE:C,CXX > :-msse4.1>
$< $<COMPILE_LANGUAGE:C,CXX > :-mcx16>
)
endif ( )
endif ( )
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
2025-09-16 18:44:19 +02:00
if ( MSVC AND NOT CXX_CLANG )
2025-03-31 18:33:05 +02:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX-" )
endif ( )
2025-08-19 21:29:36 +02:00
if ( PLATFORM_FREEBSD )
2025-07-11 10:05:17 +02:00
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib" )
2025-10-17 22:12:58 +02:00
2025-07-11 10:05:17 +02:00
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
2025-09-30 02:51:48 +02:00
cmake_dependent_option ( ENABLE_SDL2 "Enable the SDL2 frontend" ON "NOT ANDROID" OFF )
2017-05-27 23:45:55 -07:00
2025-09-27 22:40:08 +02:00
if ( ENABLE_SDL2 )
# TODO(crueter): Cleanup, each dep that has a bundled option should allow to choose between bundled, external, system
2025-09-30 02:51:48 +02:00
cmake_dependent_option ( YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" OFF "NOT MSVC" OFF )
2025-09-27 22:40:08 +02:00
option ( YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 build" "${MSVC}" )
endif ( )
2025-08-23 19:42:49 +02:00
2025-10-04 09:27:13 +02:00
# qt stuff
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-10-21 23:36:35 +02:00
option ( ENABLE_UPDATE_CHECKER "Enable update checker (for Qt and Android)" OFF )
2025-09-30 02:51:48 +02:00
cmake_dependent_option ( YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" "${MSVC}" "ENABLE_QT" OFF )
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" )
2025-10-22 19:12:33 +02:00
# FreeBSD doesn't have a cubeb port yet, vendoring it isn't required (it's optional anyways)
cmake_dependent_option ( ENABLE_CUBEB "Enables the cubeb audio backend" ON "NOT PLATFORM_FREEBSD" OFF )
2018-07-28 13:44:50 -04:00
2025-09-30 02:51:48 +02:00
set ( EXT_DEFAULT OFF )
if ( MSVC OR ANDROID )
set ( EXT_DEFAULT ON )
endif ( )
option ( YUZU_USE_CPM "Use CPM to fetch system dependencies (fmt, boost, etc) if needed. Externals will still be fetched." ${ EXT_DEFAULT } )
2022-11-22 18:38:23 -05:00
2025-10-04 09:27:13 +02:00
# ffmpeg
2025-09-30 02:51:48 +02:00
option ( YUZU_USE_BUNDLED_FFMPEG "Download bundled FFmpeg" ${ EXT_DEFAULT } )
2025-10-04 09:27:13 +02:00
cmake_dependent_option ( YUZU_USE_EXTERNAL_FFMPEG "Build FFmpeg from source" "${PLATFORM_SUN}" "NOT WIN32 AND NOT ANDROID" OFF )
# sirit
option ( YUZU_USE_BUNDLED_SIRIT "Download bundled sirit" ${ EXT_DEFAULT } )
2023-09-08 22:43:54 +03:00
2025-10-22 19:12:33 +02:00
# Re-allow on FreeBSD once its on mainline ports
cmake_dependent_option ( ENABLE_LIBUSB "Enable the use of LibUSB" ON "WIN32 OR PLATFORM_LINUX OR APPLE" OFF )
2025-08-19 21:29:36 +02:00
2025-09-30 02:51:48 +02:00
cmake_dependent_option ( ENABLE_OPENGL "Enable OpenGL" ON "NOT WIN32 OR NOT ARCHITECTURE_arm64" OFF )
mark_as_advanced ( FORCE ENABLE_OPENGL )
2025-05-19 21:30:10 +00:00
2025-09-30 02:51:48 +02:00
option ( ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON )
option ( ENABLE_WIFI_SCAN "Enable WiFi scanning" OFF )
2025-05-19 21:30:10 +00:00
2025-09-30 02:51:48 +02:00
cmake_dependent_option ( USE_DISCORD_PRESENCE "Enables Discord Rich Presence" OFF "ENABLE_QT" OFF )
2022-12-28 17:18:27 -05:00
2025-09-30 02:51:48 +02:00
option ( YUZU_TESTS "Compile tests" "${BUILD_TESTING}" )
2022-07-25 16:45:38 -04:00
2023-02-27 01:01:44 -03:00
option ( YUZU_ENABLE_LTO "Enable link-time optimization" OFF )
2025-09-27 22:40:08 +02:00
if ( YUZU_ENABLE_LTO )
include ( CheckIPOSupported )
check_ipo_supported ( RESULT COMPILER_SUPPORTS_LTO )
if ( NOT COMPILER_SUPPORTS_LTO )
message ( FATAL_ERROR "Your compiler does not support interprocedural optimization (IPO). Re-run CMake with -DYUZU_ENABLE_LTO=OFF." )
endif ( )
2025-09-30 02:51:48 +02:00
set ( CMAKE_POLICY_DEFAULT_CMP0069 NEW )
2025-09-27 22:40:08 +02:00
set ( CMAKE_INTERPROCEDURAL_OPTIMIZATION ${ COMPILER_SUPPORTS_LTO } )
endif ( )
2025-09-30 02:51:48 +02:00
option ( USE_CCACHE "Use ccache for compilation" OFF )
set ( CCACHE_PATH "ccache" CACHE STRING "Path to ccache binary" )
if ( USE_CCACHE )
find_program ( CCACHE_BINARY ${ CCACHE_PATH } )
if ( CCACHE_BINARY )
message ( STATUS "Found ccache at: ${CCACHE_BINARY}" )
set ( CMAKE_C_COMPILER_LAUNCHER ${ CCACHE_BINARY } )
set ( CMAKE_CXX_COMPILER_LAUNCHER ${ CCACHE_BINARY } )
else ( )
message ( WARNING "USE_CCACHE enabled, but no executable found at: ${CCACHE_PATH}" )
endif ( )
endif ( )
2023-02-27 01:01:44 -03:00
2025-09-30 02:51:48 +02:00
# TODO(crueter): CI this?
option ( YUZU_DOWNLOAD_ANDROID_VVL "Download validation layer binary for android" ON )
2025-10-05 05:41:20 +02:00
option ( YUZU_LEGACY "Apply patches that improve compatibility with older GPUs (e.g. Snapdragon 865) at the cost of performance" OFF )
2025-09-30 02:51:48 +02: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 )
2023-06-16 04:32:31 -04:00
2025-09-30 02:51:48 +02:00
cmake_dependent_option ( YUZU_CMD "Compile the eden-cli executable" ON "ENABLE_SDL2;NOT ANDROID" OFF )
2022-12-10 12:50:00 -05:00
2025-09-30 02:51:48 +02:00
cmake_dependent_option ( YUZU_CRASH_DUMPS "Compile crash dump (Minidump) support" OFF "WIN32 OR LINUX" OFF )
2023-08-17 09:17:56 +08:00
2025-09-30 02:51:48 +02:00
option ( YUZU_DOWNLOAD_TIME_ZONE_DATA "Always download time zone binaries" ON )
2025-09-10 18:36:42 +02:00
set ( YUZU_TZDB_PATH "" CACHE STRING "Path to a pre-downloaded timezone database" )
2025-09-30 02:51:48 +02:00
cmake_dependent_option ( YUZU_USE_FASTER_LD "Check if a faster linker is available" ON "LINUX" OFF )
2025-10-01 16:36:07 +02:00
cmake_dependent_option ( YUZU_USE_BUNDLED_MOLTENVK "Download bundled MoltenVK lib" ON "APPLE" OFF )
2025-09-30 02:51:48 +02:00
2025-09-20 22:58:33 +02:00
option ( YUZU_DISABLE_LLVM "Disable LLVM (useful for CI)" OFF )
2023-06-25 17:36:51 -07:00
set ( DEFAULT_ENABLE_OPENSSL ON )
2025-08-19 21:29:36 +02:00
if ( ANDROID OR WIN32 OR APPLE OR PLATFORM_SUN )
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 } )
2025-08-29 00:18:02 +02:00
if ( ENABLE_OPENSSL )
2025-10-17 22:12:58 +02:00
set ( DEFAULT_YUZU_USE_BUNDLED_OPENSSL OFF )
if ( EXT_DEFAULT OR PLATFORM_SUN )
set ( DEFAULT_YUZU_USE_BUNDLED_OPENSSL ON )
endif ( )
option ( YUZU_USE_BUNDLED_OPENSSL "Download bundled OpenSSL build" ${ DEFAULT_YUZU_USE_BUNDLED_OPENSSL } )
2025-08-23 19:42:49 +02:00
endif ( )
2023-09-08 22:43:54 +03:00
if ( ANDROID AND YUZU_DOWNLOAD_ANDROID_VVL )
2025-09-23 19:38:11 +02:00
# TODO(crueter): CPM this
set ( vvl_version "1.4.321.0" )
2023-09-08 22:43:54 +03:00
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" )
2025-09-23 19:38:11 +02:00
file ( DOWNLOAD "${vvl_base_url}/vulkan-sdk-${vvl_version}/android-binaries-${vvl_version}.zip"
2023-09-08 22:43:54 +03:00
"${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 ( )
2025-10-08 01:04:18 +02:00
# We need to downgrade debug info (/Zi -> /Z7) to use an older but more cacheable format
# See https://github.com/nanoant/CMakePCHCompiler/issues/21
if ( WIN32 AND ( CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo" ) )
string ( REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}" )
string ( REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}" )
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 ( )
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 )
2025-08-29 00:18:02 +02:00
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 ( )
2025-08-29 00:18:02 +02:00
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 ( )
2025-08-29 00:18:02 +02:00
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 ( )
2020-08-31 10:09:06 -04:00
if ( UNIX )
2025-09-08 19:21:38 +02:00
add_compile_definitions ( YUZU_UNIX=1 )
2020-08-31 10:09:06 -04:00
endif ( )
2017-05-27 23:45:55 -07:00
2025-10-05 05:41:20 +02:00
if ( YUZU_LEGACY )
message ( WARNING "Making legacy build. Performance may suffer." )
add_compile_definitions ( YUZU_LEGACY )
endif ( )
2025-08-23 19:42:49 +02:00
if ( ARCHITECTURE_arm64 AND ( ANDROID OR PLATFORM_LINUX ) )
2023-11-26 20:25:18 -05:00
set ( HAS_NCE 1 )
2025-09-08 19:21:38 +02:00
add_compile_definitions ( HAS_NCE=1 )
2023-11-26 20:25:18 -05:00
endif ( )
2025-05-19 21:30:10 +00:00
if ( YUZU_ROOM )
2025-09-08 19:21:38 +02:00
add_compile_definitions ( YUZU_ROOM )
2025-05-19 21:30:10 +00:00
endif ( )
2025-10-17 22:12:58 +02:00
if ( ( ANDROID OR APPLE OR UNIX ) AND ( NOT PLATFORM_LINUX OR ANDROID ) AND NOT WIN32 )
2025-10-01 06:59:35 +02:00
if ( CXX_APPLE OR CXX_CLANG )
# libc++ has stop_token and jthread as experimental
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexperimental-library" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fexperimental-library" )
else ( )
# Uses glibc, mostly?
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_LIBCPP_ENABLE_EXPERIMENTAL=1" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_LIBCPP_ENABLE_EXPERIMENTAL=1" )
endif ( )
endif ( )
2025-07-27 06:36:33 +02:00
# Build/optimization presets
2025-09-09 20:47:49 +02:00
if ( PLATFORM_LINUX OR CXX_CLANG )
2025-07-27 06:36:33 +02:00
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-29 00:18:02 +02:00
# openssl funniness
if ( ENABLE_OPENSSL )
if ( YUZU_USE_BUNDLED_OPENSSL )
AddJsonPackage ( openssl )
2025-10-21 20:43:42 +02:00
if ( OpenSSL_ADDED )
add_compile_definitions ( YUZU_BUNDLED_OPENSSL )
endif ( )
2025-08-29 00:18:02 +02:00
endif ( )
find_package ( OpenSSL 1.1.1 REQUIRED )
endif ( )
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 )
2025-09-23 19:38:11 +02:00
set ( ENABLE_TESTING OFF )
2025-08-14 20:30:30 +02:00
# TODO(crueter): renderdoc?
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-09-09 20:47:49 +02:00
2025-08-29 00:18:02 +02:00
AddJsonPackage ( boost )
2025-08-14 20:30:30 +02:00
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 )
endif ( )
2025-09-09 20:47:49 +02:00
if ( NOT MSVC OR CXX_CLANG )
2025-08-14 20:30:30 +02:00
# boost sucks
2025-08-30 20:32:21 +02:00
if ( PLATFORM_SUN )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthreads" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthreads" )
2025-08-29 00:18:02 +02:00
endif ( )
2025-08-14 20:30:30 +02:00
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-29 00:18:02 +02:00
AddJsonPackage ( fmt )
2025-08-14 20:30:30 +02:00
2025-08-16 03:19:02 +02:00
# lz4
2025-08-29 00:18:02 +02:00
AddJsonPackage ( lz4 )
2025-08-14 20:30:30 +02:00
if ( lz4_ADDED )
add_library ( lz4::lz4 ALIAS lz4_static )
endif ( )
2025-08-16 03:19:02 +02:00
# nlohmann
2025-08-29 00:18:02 +02:00
AddJsonPackage ( nlohmann )
2025-08-14 20:30:30 +02:00
2025-08-16 03:19:02 +02:00
# zlib
2025-08-29 00:18:02 +02:00
AddJsonPackage ( zlib )
2025-08-14 20:30:30 +02:00
if ( ZLIB_ADDED )
add_library ( ZLIB::ZLIB ALIAS zlibstatic )
endif ( )
2025-08-16 03:19:02 +02:00
# zstd
2025-08-29 00:18:02 +02:00
AddJsonPackage ( zstd )
if ( zstd_ADDED )
add_library ( zstd::zstd ALIAS libzstd_static )
2025-10-05 03:04:53 +02:00
add_library ( zstd::libzstd ALIAS libzstd_static )
2025-08-29 00:18:02 +02:00
endif ( )
2025-08-14 20:30:30 +02:00
2025-08-16 03:19:02 +02:00
# Opus
2025-08-29 00:18:02 +02:00
AddJsonPackage ( opus )
2025-09-09 20:47:49 +02:00
if ( Opus_ADDED )
if ( MSVC AND CXX_CLANG )
target_compile_options ( opus PRIVATE
-Wno-implicit-function-declaration
)
endif ( )
endif ( )
2025-09-15 04:22:15 +02:00
2025-09-23 19:38:11 +02:00
if ( NOT TARGET Opus::opus )
add_library ( Opus::opus ALIAS opus )
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 )
2025-10-04 09:27:13 +02:00
2025-09-20 22:58:33 +02:00
if ( NOT YUZU_DISABLE_LLVM )
find_package ( LLVM MODULE COMPONENTS Demangle )
endif ( )
2025-08-14 20:30:30 +02:00
find_package ( nlohmann_json 3.8 REQUIRED )
find_package ( lz4 REQUIRED )
find_package ( RenderDoc MODULE )
find_package ( stb MODULE )
2025-10-04 09:27:13 +02:00
2025-08-28 01:34:41 +02:00
find_package ( Opus 1.3 MODULE REQUIRED )
2025-08-14 20:30:30 +02:00
find_package ( ZLIB 1.2 REQUIRED )
2025-08-29 00:18:02 +02:00
find_package ( zstd 1.5 REQUIRED MODULE )
2025-09-16 18:44:19 +02:00
# wow
2025-10-21 05:49:02 +02:00
find_package ( Boost 1.57.0 CONFIG REQUIRED OPTIONAL_COMPONENTS headers context system fiber )
2025-09-16 18:44:19 +02:00
2025-08-14 20:30:30 +02:00
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 )
2025-08-29 00:18:02 +02:00
AddJsonPackage ( boost_headers )
2025-08-16 03:19:02 +02:00
endif ( )
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-10-26 17:28:14 +01:00
# Platform-specific library requirements
# Put these BEFORE EXTERNALS or Boost WILL die
# =============================================
if ( APPLE )
# Umbrella framework for everything GUI-related
find_library ( COCOA_LIBRARY Cocoa )
set ( PLATFORM_LIBRARIES ${ COCOA_LIBRARY } ${ IOKIT_LIBRARY } ${ COREVIDEO_LIBRARY } )
find_library ( ICONV_LIBRARY iconv REQUIRED )
list ( APPEND PLATFORM_LIBRARIES ${ ICONV_LIBRARY } )
elseif ( WIN32 )
# Target Windows 10
add_compile_definitions ( _WIN32_WINNT=0x0A00 WINVER=0x0A00 )
set ( PLATFORM_LIBRARIES winmm ws2_32 iphlpapi )
if ( MINGW )
# PSAPI is the Process Status API
set ( PLATFORM_LIBRARIES ${ PLATFORM_LIBRARIES } psapi imm32 version )
endif ( )
elseif ( PLATFORM_HAIKU )
# Haiku is so special :)
# Some fucking genius decided to name an entire module "network" in 2019
# this caused great disaster amongst the Haiku community who had came first with
# their "libnetwork.so"; since CMake doesn't do magic, we have to use an ABSOLUTE PATH
# to the library itself, otherwise it will think we are linking to... our network thing
set ( PLATFORM_LIBRARIES bsd /boot/system/lib/libnetwork.so )
elseif ( CMAKE_SYSTEM_NAME MATCHES "^(Linux|kFreeBSD|GNU|SunOS)$" )
set ( PLATFORM_LIBRARIES rt )
endif ( )
2025-03-31 18:33:05 +02:00
add_subdirectory ( externals )
2025-08-14 20:30:30 +02:00
# pass targets from externals
2025-09-08 19:21:38 +02:00
find_package ( libusb )
2025-08-15 00:35:28 +02:00
find_package ( VulkanMemoryAllocator )
2025-10-04 09:27:13 +02:00
find_package ( enet )
find_package ( MbedTLS )
find_package ( VulkanUtilityLibraries )
find_package ( SimpleIni )
find_package ( SPIRV-Tools )
2025-10-05 03:04:53 +02:00
find_package ( sirit )
2025-10-26 02:59:51 +01:00
if ( ARCHITECTURE_arm64 )
find_package ( sse2neon )
endif ( )
2025-08-14 20:30:30 +02:00
2025-09-10 18:36:42 +02:00
if ( ARCHITECTURE_x86 OR ARCHITECTURE_x86_64 )
find_package ( xbyak )
endif ( )
2025-10-15 00:33:07 +02:00
if ( ENABLE_WEB_SERVICE OR ENABLE_QT_UPDATE_CHECKER )
2025-10-15 04:25:56 +02:00
# Workaround: httplib will kill itself if you attempt to do a find_package propagation
# find_package(httplib CONFIG)
2025-08-14 20:30:30 +02:00
endif ( )
2025-10-21 23:36:35 +02:00
if ( ENABLE_WEB_SERVICE OR ENABLE_UPDATE_CHECKER )
2025-08-15 00:35:28 +02:00
find_package ( cpp-jwt )
2025-08-14 20:30:30 +02:00
endif ( )
2025-10-04 09:27:13 +02:00
if ( ARCHITECTURE_arm64 OR DYNARMIC_TESTS )
find_package ( oaknut )
endif ( )
if ( ENABLE_SDL2 )
find_package ( SDL2 )
endif ( )
if ( USE_DISCORD_PRESENCE )
find_package ( DiscordRPC )
endif ( )
if ( ENABLE_CUBEB )
find_package ( cubeb )
endif ( )
if ( YUZU_TESTS OR DYNARMIC_TESTS )
find_package ( Catch2 )
endif ( )
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-10-05 03:04:53 +02:00
# yes Qt, we get it
set ( QT_NO_PRIVATE_MODULE_WARNING ON )
2025-08-23 19:42:49 +02:00
find_package ( Qt6 REQUIRED COMPONENTS DBus OPTIONAL_COMPONENTS 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 )
2025-08-19 21:29:36 +02:00
if ( PLATFORM_LINUX )
2025-05-11 23:58:25 +00:00
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 ( )
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-10-25 07:28:08 +02:00
if ( ENABLE_QT )
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-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
2025-09-23 19:38:11 +02:00
if ( NOT ( YUZU_USE_BUNDLED_FFMPEG OR YUZU_USE_EXTERNAL_FFMPEG ) )
2021-02-06 03:14:11 -05:00
# Use system installed FFmpeg
2025-07-11 10:05:17 +02:00
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 ( )
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
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
2025-09-09 20:47:49 +02:00
# Adjustments for clang-cl
if ( MSVC AND CXX_CLANG )
if ( ARCHITECTURE_x86_64 )
set ( FILE_ARCH x86_64 )
elseif ( ARCHITECTURE_arm64 )
set ( FILE_ARCH aarch64 )
else ( )
message ( FATAL_ERROR "clang-cl: Unsupported architecture ${ARCHITECTURE}" )
endif ( )
AddJsonPackage ( llvm-mingw )
set ( LIB_PATH "${llvm-mingw_SOURCE_DIR}/libclang_rt.builtins-${FILE_ARCH}.a" )
add_library ( llvm-mingw-runtime STATIC IMPORTED )
set_target_properties ( llvm-mingw-runtime PROPERTIES
IMPORTED_LOCATION "${LIB_PATH}"
)
link_libraries ( llvm-mingw-runtime )
endif ( )
2025-09-30 02:18:31 +02:00
#[[
s e a r c h o r d e r :
- gold ( GCC only ) - t h e b e s t , g e n e r a l l y , b u t u n f o r t u n a t e l y n o t p a c k a g e d a n y m o r e
- mold ( GCC only ) - g e n e r a l l y d o e s w e l l o n G C C
- l d d - p r e f e r r e d o n c l a n g
- b f d - t h e f i n a l f a l l b a c k
- I f n o n e a r e found ( macOS uses ld.prime, etc ) j u s t u s e t h e d e f a u l t l i n k e r
] ]
2025-09-27 22:40:08 +02:00
if ( YUZU_USE_FASTER_LD )
2025-09-30 02:18:31 +02:00
find_program ( LINKER_BFD bfd )
if ( LINKER_BFD )
set ( LINKER bfd )
endif ( )
find_program ( LINKER_LLD lld )
if ( LINKER_LLD )
2025-09-27 22:40:08 +02:00
set ( LINKER lld )
2022-12-10 12:50:00 -05:00
endif ( )
2025-09-30 02:18:31 +02:00
2025-09-27 22:40:08 +02:00
if ( CXX_GCC )
2025-09-30 02:18:31 +02:00
find_program ( LINKER_MOLD mold )
if ( LINKER_MOLD AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "12.1" )
2025-09-27 22:40:08 +02:00
set ( LINKER mold )
endif ( )
2025-09-30 02:18:31 +02:00
find_program ( LINKER_GOLD gold )
if ( LINKER_GOLD )
set ( LINKER gold )
endif ( )
endif ( )
if ( LINKER )
message ( NOTICE "Selecting ${LINKER} as linker" )
add_link_options ( "-fuse-ld=${LINKER}" )
else ( )
message ( WARNING "No faster linker found--using default" )
endif ( )
if ( LINKER STREQUAL "lld" AND CXX_GCC )
message ( WARNING "Using lld on GCC may cause issues with certain LTO settings. If the program fails to compile, disable YUZU_USE_FASTER_LD, or install mold or GNU gold." )
2025-09-27 22:40:08 +02:00
endif ( )
2022-12-10 12:50:00 -05:00
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-08-31 04:56:23 +02:00
install ( FILES "dist/dev.eden_emu.eden.desktop"
2025-05-11 23:58:25 +00:00
DESTINATION "share/applications" )
2025-08-31 04:56:23 +02:00
install ( FILES "dist/dev.eden_emu.eden.svg"
2025-06-11 15:05:03 +00:00
DESTINATION "share/icons/hicolor/scalable/apps" )
2025-05-20 15:57:19 -04:00
# TODO: these files need to be updated.
2025-08-31 04:56:23 +02:00
install ( FILES "dist/dev.eden_emu.eden.xml"
2025-05-11 23:58:25 +00:00
DESTINATION "share/mime/packages" )
2025-08-31 04:56:23 +02:00
install ( FILES "dist/dev.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 ( )