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
chore: make yuzu REUSE compliant
[REUSE] is a specification that aims at making file copyright
information consistent, so that it can be both human and machine
readable. It basically requires that all files have a header containing
copyright and licensing information. When this isn't possible, like
when dealing with binary assets, generated files or embedded third-party
dependencies, it is permitted to insert copyright information in the
`.reuse/dep5` file.
Oh, and it also requires that all the licenses used in the project are
present in the `LICENSES` folder, that's why the diff is so huge.
This can be done automatically with `reuse download --all`.
The `reuse` tool also contains a handy subcommand that analyzes the
project and tells whether or not the project is (still) compliant,
`reuse lint`.
Following REUSE has a few advantages over the current approach:
- Copyright information is easy to access for users / downstream
- Files like `dist/license.md` do not need to exist anymore, as
`.reuse/dep5` is used instead
- `reuse lint` makes it easy to ensure that copyright information of
files like binary assets / images is always accurate and up to date
To add copyright information of files that didn't have it I looked up
who committed what and when, for each file. As yuzu contributors do not
have to sign a CLA or similar I couldn't assume that copyright ownership
was of the "yuzu Emulator Project", so I used the name and/or email of
the commit author instead.
[REUSE]: https://reuse.software
Follow-up to b2eb10382941bef0914f4a0a4685b9033440aa9f
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 )
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-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-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-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" )
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
T h i s c a n t y p i c a l l y h a p p e n i f y o u u s e d t h e D e v e l o p e r C o m m a n d P r o m p t f r o m t h e s t a r t m e n u ; \
2025-09-09 20:47:49 +02:00
i n s t e a d , r u n v c v a r s 6 4 . b a t d i r e c t l y , l o c a t e d a t C : / P r o g r a m F i l e s / M i c r o s o f t V i s u a l S t u d i o / 2 0 2 2 / C o m m u n i t y / V C / A u x i l i a r y / B u i l d / v c v a r s 6 4 . b a t " )
endif ( )
if ( CXX_CLANG_CL )
add_compile_options (
# clang-cl prints literally 10000+ warnings without this
$ < $ < C O M P I L E _ L A N G U A G E : C , C X X > : - W n o - u n u s e d - c o m m a n d - l i n e - a r g u m e n t >
$ < $ < C O M P I L E _ L A N G U A G E : C , C X X > : - W n o - u n s a f e - b u f f e r - u s a g e >
$ < $ < C O M P I L E _ L A N G U A G E : C , C X X > : - W n o - u n u s e d - v a l u e >
$ < $ < C O M P I L E _ L A N G U A G E : C , C X X > : - W n o - e x t r a - s e m i - s t m t >
$ < $ < C O M P I L E _ L A N G U A G E : C , C X X > : - W n o - s i g n - c o n v e r s i o n >
$ < $ < C O M P I L E _ L A N G U A G E : C , C X X > : - W n o - r e s e r v e d - i d e n t i f i e r >
$ < $ < C O M P I L E _ L A N G U A G E : C , C X X > : - W n o - d e p r e c a t e d - d e c l a r a t i o n s >
$ < $ < C O M P I L E _ L A N G U A G E : C , C X X > : - W n o - c a s t - f u n c t i o n - t y p e - m i s m a t c h >
$ < $ < C O M P I L E _ L A N G U A G E : C , C X X > : / E H s c > # thanks microsoft
)
if ( ARCHITECTURE_x86_64 )
add_compile_options (
# Required CPU features for amd64
$ < $ < C O M P I L E _ L A N G U A G E : C , C X X > : - m s s e 4 . 1 >
$ < $ < C O M P I L E _ L A N G U A G E : C , C X X > : - m c x 1 6 >
)
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" )
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-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 )
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" )
2018-07-28 13:44:50 -04:00
option ( ENABLE_CUBEB "Enables the cubeb audio backend" ON )
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-09-30 02:51:48 +02:00
option ( YUZU_USE_BUNDLED_FFMPEG "Download bundled FFmpeg" ${ EXT_DEFAULT } )
cmake_dependent_option ( YUZU_USE_EXTERNAL_FFMPEG "Build FFmpeg from source" OFF "NOT WIN32 AND NOT ANDROID" OFF )
2023-09-08 22:43:54 +03:00
2025-09-30 02:51:48 +02:00
cmake_dependent_option ( ENABLE_LIBUSB "Enable the use of LibUSB" ON "NOT ANDROID" 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
2025-09-30 02:51:48 +02:00
option ( YUZU_USE_PRECOMPILED_HEADERS "Use precompiled headers" OFF )
if ( YUZU_USE_PRECOMPILED_HEADERS )
message ( STATUS "Using Precompiled Headers." )
set ( CMAKE_PCH_INSTANTIATE_TEMPLATES ON )
endif ( )
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 } )
if ( YUZU_USE_PRECOMPILED_HEADERS )
message ( FATAL_ERROR "Precompiled headers are incompatible with ccache. Re-run CMake with -DYUZU_USE_PRECOMPILED_HEADERS=OFF." )
endif ( )
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 )
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-09-30 02:51:48 +02:00
cmake_dependent_option ( YUZU_USE_BUNDLED_OPENSSL "Download bundled OpenSSL build" "${MSVC}" "NOT ANDROID" ON )
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
" $ { v v l _ z i p _ f i l e } " S H O W _ P R O G R E S S )
execute_process ( COMMAND ${ CMAKE_COMMAND } -E tar xf "${vvl_zip_file}"
2025-05-11 23:58:25 +00:00
W O R K I N G _ D I R E C T O R Y " $ { C M A K E _ B I N A R Y _ D I R } / e x t e r n a l s " )
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
D E S T I N A T I O N " $ { v v l _ l i b _ p a t h } " )
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 ( )
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
$ { P R O J E C T _ B I N A R Y _ D I R } / d i s t / c o m p a t i b i l i t y _ l i s t / c o m p a t i b i l i t y _ l i s t . q r c
C O P Y O N L Y )
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
" $ { P R O J E C T _ B I N A R Y _ D I R } / d i s t / c o m p a t i b i l i t y _ l i s t / c o m p a t i b i l i t y _ l i s t . j s o n "
C O P Y O N L Y )
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
h t t p s : / / a p i . y u z u - e m u . o r g / g a m e d b /
2018-10-20 17:08:26 -04:00
" $ { P R O J E C T _ B I N A R Y _ D I R } / d i s t / c o m p a t i b i l i t y _ l i s t / c o m p a t i b i l i t y _ l i s t . j s o n " S H O W _ P R O G R E S S )
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-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 )
2025-09-26 21:46:56 +02:00
find_package ( oaknut 2.0.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-01 06:59:35 +02:00
if ( ANDROID OR PLATFORM_FREEBSD OR PLATFORM_OPENBSD OR PLATFORM_SUN OR APPLE )
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 )
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 )
endif ( )
2025-08-14 20:30:30 +02:00
2025-08-16 03:19:02 +02:00
# Catch2
2025-08-14 20:30:30 +02:00
if ( YUZU_TESTS OR DYNARMIC_TESTS )
2025-08-29 00:18:02 +02:00
AddJsonPackage ( catch2 )
2025-08-14 20:30:30 +02:00
endif ( )
2025-08-16 03:19:02 +02:00
# ENet
2025-08-29 00:18:02 +02:00
AddJsonPackage ( enet )
2025-08-16 03:19:02 +02:00
if ( enet_ADDED )
target_include_directories ( enet INTERFACE ${ enet_SOURCE_DIR } /include )
endif ( )
2025-09-23 19:38:11 +02:00
if ( NOT TARGET enet::enet )
add_library ( enet::enet ALIAS enet )
endif ( )
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
- W n o - i m p l i c i t - f u n c t i o n - d e c l a r a t i o n
)
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-09-15 04:22:15 +02:00
# VulkanUtilityHeaders - pulls in headers and utility libs
AddJsonPackage ( vulkan-utility-headers )
# small hack
if ( NOT VulkanUtilityLibraries_ADDED )
find_package ( VulkanHeaders 1.3.274 REQUIRED )
endif ( )
# SPIRV Headers
AddJsonPackage ( spirv-headers )
# SPIRV Tools
AddJsonPackage ( spirv-tools )
if ( SPIRV-Tools_ADDED )
add_library ( SPIRV-Tools::SPIRV-Tools ALIAS SPIRV-Tools-static )
target_link_libraries ( SPIRV-Tools-static PRIVATE SPIRV-Tools-opt SPIRV-Tools-link )
endif ( )
# mbedtls
AddJsonPackage ( mbedtls )
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-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-08-28 01:34:41 +02:00
find_package ( enet 1.3 MODULE REQUIRED )
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
if ( PLATFORM_LINUX )
find_package ( Boost 1.57.0 REQUIRED headers context system fiber )
else ( )
find_package ( Boost 1.57.0 REQUIRED )
endif ( )
# OpenBSD does not package mbedtls3 (only 2)
if ( PLATFORM_OPENBSD )
AddJsonPackage ( mbedtls )
else ( )
find_package ( MbedTLS 3 REQUIRED )
endif ( )
2025-09-15 04:22:15 +02:00
find_package ( VulkanUtilityLibraries REQUIRED )
find_package ( VulkanHeaders 1.3.274 REQUIRED )
2025-09-16 18:44:19 +02:00
# FreeBSD does not package spirv-headers
if ( PLATFORM_FREEBSD )
AddJsonPackage ( spirv-headers )
else ( )
find_package ( SPIRV-Headers 1.3.274 REQUIRED )
endif ( )
2025-09-15 04:22:15 +02:00
find_package ( SPIRV-Tools MODULE REQUIRED )
2025-08-16 03:19:02 +02:00
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 )
2025-08-29 00:18:02 +02:00
AddJsonPackage ( boost_headers )
2025-08-16 03:19:02 +02:00
endif ( )
# DiscordRPC
if ( USE_DISCORD_PRESENCE )
2025-09-09 20:47:49 +02:00
if ( ARCHITECTURE_arm64 )
add_compile_definitions ( RAPIDJSON_ENDIAN=RAPIDJSON_LITTLEENDIAN )
endif ( )
2025-08-29 00:18:02 +02:00
AddJsonPackage ( discord-rpc )
2025-08-16 03:19:02 +02:00
target_include_directories ( discord-rpc INTERFACE ${ discord-rpc_SOURCE_DIR } /include )
add_library ( DiscordRPC::discord-rpc ALIAS discord-rpc )
endif ( )
# SimpleIni
2025-08-29 00:18:02 +02:00
AddJsonPackage ( simpleini )
# Most linux distros don't package cubeb, so enable regardless of cpm settings
if ( ENABLE_CUBEB )
AddJsonPackage ( cubeb )
2025-08-16 03:19:02 +02:00
2025-08-29 00:18:02 +02:00
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
- W n o - i m p l i c i t - c o n s t - i n t - f l o a t - c o n v e r s i o n
- W n o - s h a d o w
- W n o - m i s s i n g - d e c l a r a t i o n s
- W n o - r e t u r n - t y p e
- W n o - u n i n i t i a l i z e d
)
else ( )
target_compile_options ( cubeb PRIVATE
/ w d 4 4 5 6
/ w d 4 4 5 8
)
endif ( )
endif ( )
2025-09-23 19:38:11 +02:00
if ( NOT TARGET cubeb::cubeb )
add_library ( cubeb::cubeb ALIAS cubeb )
endif ( )
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
2021-04-15 23:12:23 -07:00
if ( ENABLE_SDL2 )
2025-08-29 00:18:02 +02:00
if ( YUZU_USE_EXTERNAL_SDL2 )
2025-08-23 19:42:49 +02:00
message ( STATUS "Using SDL2 from externals." )
if ( NOT WIN32 )
# Yuzu itself needs: Atomic Audio Events Joystick Haptic Sensor Threads Timers
# Since 2.0.18 Atomic+Threads required for HIDAPI/libusb (see https://github.com/libsdl-org/SDL/issues/5095)
# Yuzu-cmd also needs: Video (depends on Loadso/Dlopen)
# CPUinfo also required for SDL Audio, at least until 2.28.0 (see https://github.com/libsdl-org/SDL/issues/7809)
set ( SDL_UNUSED_SUBSYSTEMS
F i l e F i l e s y s t e m
L o c a l e P o w e r R e n d e r )
foreach ( _SUB ${ SDL_UNUSED_SUBSYSTEMS } )
string ( TOUPPER ${ _SUB } _OPT )
set ( SDL_ ${ _OPT } OFF )
endforeach ( )
set ( HIDAPI ON )
2021-04-15 23:12:23 -07:00
endif ( )
2025-08-23 19:42:49 +02:00
if ( APPLE )
set ( SDL_FILE ON )
2021-04-15 23:12:23 -07:00
endif ( )
2025-08-23 19:42:49 +02:00
if ( "${YUZU_SYSTEM_PROFILE}" STREQUAL "steamdeck" )
set ( SDL_PIPEWIRE OFF ) # build errors out with this on
2025-08-29 00:18:02 +02:00
AddJsonPackage ( "sdl2_steamdeck" )
2025-08-23 19:42:49 +02:00
else ( )
2025-08-29 00:18:02 +02:00
AddJsonPackage ( "sdl2_generic" )
2025-08-23 19:42:49 +02:00
endif ( )
2025-08-29 00:18:02 +02:00
elseif ( YUZU_USE_BUNDLED_SDL2 )
2025-08-23 19:42:49 +02:00
message ( STATUS "Using bundled SDL2" )
2025-08-29 00:18:02 +02:00
AddJsonPackage ( sdl2 )
2025-08-23 19:42:49 +02:00
endif ( )
find_package ( SDL2 2.26.4 REQUIRED )
2020-05-08 15:09:29 -06:00
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
a v c o d e c
a v f i l t e r
a v u t i l
s w s c a l e )
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-09-08 19:21:38 +02:00
find_package ( libusb )
2025-08-15 00:35:28 +02:00
find_package ( VulkanMemoryAllocator )
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-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 ( )
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-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 ( )
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
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 ( )
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
2025-09-08 19:21:38 +02:00
add_compile_definitions ( _WIN32_WINNT=0x0A00 WINVER=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
N A M E S c l a n g - f o r m a t $ { C L A N G _ F O R M A T _ P O S T F I X }
2025-05-11 23:58:25 +00:00
c l a n g - f o r m a t
2018-10-20 17:08:26 -04:00
P A T H S $ { P R O J E C T _ B I N A R Y _ D I R } / e x t e r n a l s )
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
h t t p s : / / g i t h u b . c o m / e d e n - e m u l a t o r / e x t - w i n d o w s - b i n / r a w / m a s t e r / c l a n g - f o r m a t $ { C L A N G _ F O R M A T _ P O S T F I X } . e x e
2018-01-20 00:31:44 -07:00
" $ { C L A N G _ F O R M A T } " S H O W _ P R O G R E S S
S T A T U S D O W N L O A D _ S U C C E S S )
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
C O M M A N D p o w e r s h e l l . e x e - C o m m a n d " G e t - C h i l d I t e m ' $ { S R C S } / * ' - I n c l u d e * . c p p , * . h - R e c u r s e | F o r e a c h { & ' $ { C L A N G _ F O R M A T } ' - i $ _ . f u l l n a m e } "
2018-01-20 00:31:44 -07:00
C O M M E N T $ { C C O M M E N T } )
elseif ( MINGW )
add_custom_target ( clang-format
C O M M A N D f i n d ` c y g p a t h - u $ { S R C S } ` - i n a m e * . h - o - i n a m e * . c p p | x a r g s ` c y g p a t h - u $ { C L A N G _ F O R M A T } ` - i
C O M M E N T $ { C C O M M E N T } )
else ( )
add_custom_target ( clang-format
C O M M A N D f i n d $ { S R C S } - i n a m e * . h - o - i n a m e * . c p p | x a r g s $ { C L A N G _ F O R M A T } - i
C O M M E N T $ { C C O M M E N T } )
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 (
/ w d 4 4 6 4 # relative include path contains '..'
2022-10-21 02:34:07 -04:00
/ w d 4 7 1 1 # function 'function' selected for automatic inline expansion
/ w d 4 8 2 0 # '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
I M P O R T E D _ L O C A T I O N " $ { L I B _ P A T H } "
)
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 (
$ < $ < C O N F I G : D e b u g > : / M D d >
$ < $ < C O N F I G : R e l e a s e > : / M D >
$ < $ < C O N F I G : R e l W i t h D e b I n f o > : / M D >
$ < $ < C O N F I G : M i n S i z e R e l > : / M D >
)
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
D E S T I N A T I O N " s h a r e / a p p l i c a t i o n s " )
2025-08-31 04:56:23 +02:00
install ( FILES "dist/dev.eden_emu.eden.svg"
2025-06-11 15:05:03 +00:00
D E S T I N A T I O N " s h a r e / i c o n s / h i c o l o r / s c a l a b l e / a p p s " )
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
D E S T I N A T I O N " s h a r e / m i m e / p a c k a g e s " )
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
D E S T I N A T I O N " s h a r e / m e t a i n f o " )
2015-04-22 13:34:42 +02:00
endif ( )