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
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")
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)
cmake_dependent_option(YUZU_APPLE_USE_BUNDLED_MONTENVK "Download bundled MoltenVK lib" ON "APPLE" OFF)
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
"${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()
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-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-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
-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-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
-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()
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
File Filesystem
Locale Power Render)
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
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-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
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
#[[
search order:
- gold (GCC only) - the best, generally, but unfortunately not packaged anymore
- mold (GCC only) - generally does well on GCC
- ldd - preferred on clang
- bfd - the final fallback
- If none are found (macOS uses ld.prime, etc) just use the default linker
]]
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()