2022-09-21 18:36:12 +02:00
|
|
|
# CMake 3.12 required for 20 to be a valid value for CXX_STANDARD
|
2022-11-06 03:35:20 +01:00
|
|
|
cmake_minimum_required(VERSION 3.15)
|
|
|
|
|
|
|
|
# Don't override the warning flags in MSVC:
|
|
|
|
cmake_policy(SET CMP0092 NEW)
|
|
|
|
# Enforce new LTO setting
|
|
|
|
cmake_policy(SET CMP0069 NEW)
|
2023-07-05 06:00:24 +02:00
|
|
|
# Honor visibility properties for all targets
|
|
|
|
# Set the default so subdirectory cmake_minimum_required calls won't unset the policy.
|
|
|
|
cmake_policy(SET CMP0063 NEW)
|
|
|
|
set(CMAKE_POLICY_DEFAULT_CMP0063 NEW)
|
2022-09-21 18:36:12 +02:00
|
|
|
|
2017-05-28 08:45:55 +02:00
|
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
|
|
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modules")
|
2017-09-09 19:24:13 +02:00
|
|
|
include(DownloadExternals)
|
2018-01-20 08:46:04 +01:00
|
|
|
include(CMakeDependentOption)
|
2013-08-30 05:35:09 +02:00
|
|
|
|
2021-02-11 06:18:25 +01:00
|
|
|
project(citra LANGUAGES C CXX ASM)
|
2017-05-28 08:45:55 +02:00
|
|
|
|
2023-10-20 00:02:49 +02:00
|
|
|
# Some submodules like to pick their own default build type if not specified.
|
|
|
|
# Make sure we default to Release build type always, unless the generator has custom types.
|
|
|
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|
|
|
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE)
|
|
|
|
endif()
|
|
|
|
|
2023-07-05 06:00:24 +02:00
|
|
|
if (APPLE)
|
|
|
|
# Silence warnings on empty objects, for example when platform-specific code is #ifdef'd out.
|
|
|
|
set(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>")
|
|
|
|
set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>")
|
|
|
|
set(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
|
|
|
|
set(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
|
|
|
|
|
|
|
|
if (IOS)
|
|
|
|
# Minimum iOS 14
|
|
|
|
set(CMAKE_OSX_DEPLOYMENT_TARGET "14.0")
|
|
|
|
|
|
|
|
# Enable searching CMAKE_PREFIX_PATH for bundled dependencies.
|
|
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
|
|
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)
|
|
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)
|
|
|
|
else()
|
|
|
|
# Minimum macOS 11
|
|
|
|
set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0")
|
|
|
|
endif()
|
2022-09-21 18:36:12 +02:00
|
|
|
endif()
|
|
|
|
|
2023-06-27 02:42:00 +02:00
|
|
|
if (CMAKE_BUILD_TYPE STREQUAL Debug)
|
|
|
|
set(IS_DEBUG_BUILD ON)
|
2023-08-26 20:15:13 +02:00
|
|
|
set(IS_RELEASE_BUILD OFF)
|
2023-06-27 02:42:00 +02:00
|
|
|
else()
|
|
|
|
set(IS_DEBUG_BUILD OFF)
|
2023-08-26 20:15:13 +02:00
|
|
|
set(IS_RELEASE_BUILD ON)
|
2023-06-27 02:42:00 +02:00
|
|
|
endif()
|
2022-09-21 18:36:12 +02:00
|
|
|
|
2023-09-24 00:00:16 +02:00
|
|
|
# LTO takes too much memory and time using MSVC.
|
|
|
|
if (NOT MSVC AND IS_RELEASE_BUILD)
|
|
|
|
set(DEFAULT_ENABLE_LTO ON)
|
|
|
|
else()
|
|
|
|
set(DEFAULT_ENABLE_LTO OFF)
|
|
|
|
endif()
|
|
|
|
|
2023-06-08 05:40:53 +02:00
|
|
|
option(ENABLE_SDL2 "Enable using SDL2" ON)
|
|
|
|
CMAKE_DEPENDENT_OPTION(ENABLE_SDL2_FRONTEND "Enable the SDL2 frontend" ON "ENABLE_SDL2;NOT ANDROID AND NOT IOS" OFF)
|
2022-09-21 18:36:12 +02:00
|
|
|
option(USE_SYSTEM_SDL2 "Use the system SDL2 lib (instead of the bundled one)" OFF)
|
2017-05-28 08:45:55 +02:00
|
|
|
|
2022-09-21 18:36:12 +02:00
|
|
|
# Set bundled qt as dependent options.
|
2017-05-28 08:45:55 +02:00
|
|
|
option(ENABLE_QT "Enable the Qt frontend" ON)
|
2017-09-23 15:14:20 +02:00
|
|
|
option(ENABLE_QT_TRANSLATION "Enable translations for the Qt frontend" OFF)
|
2023-06-08 05:40:53 +02:00
|
|
|
CMAKE_DEPENDENT_OPTION(ENABLE_QT_UPDATER "Enable built-in updater for the Qt frontend" ON "NOT IOS" OFF)
|
2017-05-28 08:45:55 +02:00
|
|
|
|
2023-06-08 05:40:53 +02:00
|
|
|
CMAKE_DEPENDENT_OPTION(ENABLE_TESTS "Enable generating tests executable" ON "NOT IOS" OFF)
|
|
|
|
CMAKE_DEPENDENT_OPTION(ENABLE_DEDICATED_ROOM "Enable generating dedicated room executable" ON "NOT ANDROID AND NOT IOS" OFF)
|
|
|
|
|
2017-07-09 23:52:18 +02:00
|
|
|
option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON)
|
2023-08-06 21:23:53 +02:00
|
|
|
option(ENABLE_SCRIPTING "Enable RPC server for scripting" ON)
|
2017-07-09 23:52:18 +02:00
|
|
|
|
2024-02-02 00:29:14 +01:00
|
|
|
CMAKE_DEPENDENT_OPTION(ENABLE_CUBEB "Enables the cubeb audio backend" ON "NOT IOS" OFF)
|
2023-05-01 21:17:45 +02:00
|
|
|
option(ENABLE_OPENAL "Enables the OpenAL audio backend" ON)
|
2018-05-25 07:50:37 +02:00
|
|
|
|
2023-04-22 17:10:12 +02:00
|
|
|
CMAKE_DEPENDENT_OPTION(ENABLE_LIBUSB "Enable libusb for GameCube Adapter support" ON "NOT IOS" OFF)
|
|
|
|
|
2024-01-22 08:29:46 +01:00
|
|
|
CMAKE_DEPENDENT_OPTION(ENABLE_SOFTWARE_RENDERER "Enables the software renderer" ON "NOT ANDROID" OFF)
|
|
|
|
CMAKE_DEPENDENT_OPTION(ENABLE_OPENGL "Enables the OpenGL renderer" ON "NOT APPLE" OFF)
|
|
|
|
option(ENABLE_VULKAN "Enables the Vulkan renderer" ON)
|
|
|
|
|
2018-08-20 11:20:33 +02:00
|
|
|
option(USE_DISCORD_PRESENCE "Enables Discord Rich Presence" OFF)
|
|
|
|
|
2023-06-27 02:42:00 +02:00
|
|
|
# Compile options
|
|
|
|
CMAKE_DEPENDENT_OPTION(COMPILE_WITH_DWARF "Add DWARF debugging information" ${IS_DEBUG_BUILD} "MINGW" OFF)
|
2023-09-24 00:00:16 +02:00
|
|
|
option(ENABLE_LTO "Enable link time optimization" ${DEFAULT_ENABLE_LTO})
|
2023-06-27 02:42:00 +02:00
|
|
|
option(CITRA_USE_PRECOMPILED_HEADERS "Use precompiled headers" ON)
|
|
|
|
option(CITRA_WARNINGS_AS_ERRORS "Enable warnings as errors" ON)
|
2019-08-14 04:10:22 +02:00
|
|
|
|
2023-10-21 02:02:20 +02:00
|
|
|
include(CitraHandleSystemLibs)
|
2019-12-30 01:51:06 +01:00
|
|
|
|
2022-12-17 16:06:38 +01:00
|
|
|
if (CITRA_USE_PRECOMPILED_HEADERS)
|
|
|
|
message(STATUS "Using Precompiled Headers.")
|
|
|
|
set(CMAKE_PCH_INSTANTIATE_TEMPLATES ON)
|
2023-10-09 08:56:01 +02:00
|
|
|
|
|
|
|
# This ensures that pre-compiled headers won't invalidate build caches for every fresh checkout.
|
|
|
|
if(NOT MSVC AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
|
|
|
list(APPEND CMAKE_CXX_COMPILE_OPTIONS_CREATE_PCH -Xclang -fno-pch-timestamp)
|
|
|
|
endif()
|
2022-12-17 16:06:38 +01:00
|
|
|
endif()
|
|
|
|
|
2018-10-20 23:08:26 +02:00
|
|
|
if(NOT EXISTS ${PROJECT_SOURCE_DIR}/.git/hooks/pre-commit)
|
2017-05-28 08:45:55 +02:00
|
|
|
message(STATUS "Copying pre-commit hook")
|
|
|
|
file(COPY hooks/pre-commit
|
2018-10-20 23:08:26 +02:00
|
|
|
DESTINATION ${PROJECT_SOURCE_DIR}/.git/hooks)
|
2017-05-28 08:45:55 +02:00
|
|
|
endif()
|
|
|
|
|
2022-04-04 20:18:33 +02:00
|
|
|
# Use ccache for android if available
|
|
|
|
# =======================================================================
|
|
|
|
if (NOT $ENV{NDK_CCACHE} EQUAL "")
|
|
|
|
set(CCACHE_EXE $ENV{NDK_CCACHE})
|
|
|
|
set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_EXE})
|
|
|
|
set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_EXE})
|
|
|
|
endif()
|
|
|
|
|
2022-09-21 18:36:12 +02:00
|
|
|
# Check for LTO support
|
|
|
|
# =======================================================================
|
|
|
|
if (ENABLE_LTO)
|
|
|
|
include(CheckIPOSupported)
|
|
|
|
check_ipo_supported(RESULT supported OUTPUT error_msg)
|
|
|
|
|
|
|
|
if (supported)
|
|
|
|
message(STATUS "LTO enabled")
|
|
|
|
else()
|
|
|
|
message(STATUS "LTO enabled but is unavailable, disabling: ${error_msg}")
|
|
|
|
set(ENABLE_LTO OFF)
|
|
|
|
endif()
|
|
|
|
else()
|
|
|
|
message(STATUS "LTO disabled")
|
|
|
|
endif()
|
|
|
|
|
2017-07-16 20:52:05 +02:00
|
|
|
# Sanity check : Check that all submodules are present
|
|
|
|
# =======================================================================
|
|
|
|
|
|
|
|
function(check_submodules_present)
|
2018-10-20 23:08:26 +02:00
|
|
|
file(READ "${PROJECT_SOURCE_DIR}/.gitmodules" gitmodules)
|
2017-07-16 20:52:05 +02:00
|
|
|
string(REGEX MATCHALL "path *= *[^ \t\r\n]*" gitmodules ${gitmodules})
|
|
|
|
foreach(module ${gitmodules})
|
|
|
|
string(REGEX REPLACE "path *= *" "" module ${module})
|
2018-10-20 23:08:26 +02:00
|
|
|
if (NOT EXISTS "${PROJECT_SOURCE_DIR}/${module}/.git")
|
2017-07-16 20:52:05 +02:00
|
|
|
message(SEND_ERROR "Git submodule ${module} not found."
|
|
|
|
"Please run: git submodule update --init --recursive")
|
|
|
|
endif()
|
|
|
|
endforeach()
|
|
|
|
endfunction()
|
2023-06-20 18:44:20 +02:00
|
|
|
if (EXISTS "${PROJECT_SOURCE_DIR}/.git/objects")
|
|
|
|
# only check submodules when source is obtained via Git
|
|
|
|
check_submodules_present()
|
|
|
|
endif()
|
2017-05-28 08:45:55 +02:00
|
|
|
|
2018-10-20 23:08:26 +02:00
|
|
|
configure_file(${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.qrc
|
|
|
|
${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.qrc
|
2018-04-16 00:42:58 +02:00
|
|
|
COPYONLY)
|
2018-10-20 23:08:26 +02:00
|
|
|
if (ENABLE_COMPATIBILITY_LIST_DOWNLOAD AND NOT EXISTS ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json)
|
2018-04-16 00:42:58 +02:00
|
|
|
message(STATUS "Downloading compatibility list for citra...")
|
|
|
|
file(DOWNLOAD
|
2018-05-10 03:57:57 +02:00
|
|
|
https://api.citra-emu.org/gamedb/
|
2018-10-20 23:08:26 +02:00
|
|
|
"${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json" SHOW_PROGRESS)
|
2018-04-16 00:42:58 +02:00
|
|
|
endif()
|
2021-06-21 11:38:52 +02:00
|
|
|
if (EXISTS ${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.json)
|
|
|
|
file(COPY "${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.json"
|
|
|
|
DESTINATION "${PROJECT_BINARY_DIR}/dist/compatibility_list/")
|
|
|
|
endif()
|
2018-10-20 23:08:26 +02: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-04-16 00:42:58 +02:00
|
|
|
endif()
|
|
|
|
|
2017-05-28 08:45:55 +02:00
|
|
|
# Detect current compilation architecture and create standard definitions
|
|
|
|
# =======================================================================
|
2015-08-28 21:57:08 +02:00
|
|
|
|
2015-08-28 21:55:22 +02:00
|
|
|
include(CheckSymbolExists)
|
|
|
|
function(detect_architecture symbol arch)
|
|
|
|
if (NOT DEFINED ARCHITECTURE)
|
|
|
|
set(CMAKE_REQUIRED_QUIET 1)
|
|
|
|
check_symbol_exists("${symbol}" "" ARCHITECTURE_${arch})
|
|
|
|
unset(CMAKE_REQUIRED_QUIET)
|
|
|
|
|
|
|
|
# The output variable needs to be unique across invocations otherwise
|
|
|
|
# CMake's crazy scope rules will keep it defined
|
|
|
|
if (ARCHITECTURE_${arch})
|
|
|
|
set(ARCHITECTURE "${arch}" PARENT_SCOPE)
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
endfunction()
|
|
|
|
|
2018-01-08 17:54:37 +01:00
|
|
|
if (NOT ENABLE_GENERIC)
|
2023-01-06 16:28:02 +01:00
|
|
|
if (CMAKE_OSX_ARCHITECTURES)
|
|
|
|
set(ARCHITECTURE "${CMAKE_OSX_ARCHITECTURES}")
|
|
|
|
elseif (MSVC)
|
2018-01-08 17:54:37 +01:00
|
|
|
detect_architecture("_M_AMD64" x86_64)
|
|
|
|
detect_architecture("_M_IX86" x86)
|
2022-06-21 20:59:36 +02:00
|
|
|
detect_architecture("_M_ARM" arm)
|
|
|
|
detect_architecture("_M_ARM64" arm64)
|
2018-01-08 17:54:37 +01:00
|
|
|
else()
|
|
|
|
detect_architecture("__x86_64__" x86_64)
|
|
|
|
detect_architecture("__i386__" x86)
|
2022-06-21 20:59:36 +02:00
|
|
|
detect_architecture("__arm__" arm)
|
|
|
|
detect_architecture("__aarch64__" arm64)
|
2018-01-08 17:54:37 +01:00
|
|
|
endif()
|
2015-08-28 21:55:22 +02:00
|
|
|
endif()
|
|
|
|
if (NOT DEFINED ARCHITECTURE)
|
|
|
|
set(ARCHITECTURE "GENERIC")
|
2015-08-15 04:29:08 +02:00
|
|
|
endif()
|
2015-08-28 21:55:22 +02:00
|
|
|
message(STATUS "Target architecture: ${ARCHITECTURE}")
|
2015-08-15 04:29:08 +02:00
|
|
|
|
2017-05-28 08:45:55 +02:00
|
|
|
|
Port yuzu-emu/yuzu#2253: "Migrate off directly modifying CMAKE_* compilation-related flags directly" (#4714)
* CMakeLists: Move compilation flags into the src directory
We generally shouldn't be hijacking CMAKE_CXX_FLAGS, etc as a means to
append flags to the targets, since this adds the compilation flags to
everything, including our externals, which can result in weird issues
and makes the build hierarchy fragile.
Instead, we want to just apply these compilation flags to our targets,
and let those managing external libraries to properly specify their
compilation flags.
This also results in us not getting as many warnings, as we don't raise
the warning level on every external target.
* CMakeLists: Move off of modifying CMAKE_*-related flags
Modifying CMAKE_* related flags directly applies those changes to every
single CMake target. This includes even the targets we have in the
externals directory.
So, if we ever increased our warning levels, or enabled particular ones,
or enabled any other compilation setting, then this would apply to
externals as well, which is often not desirable.
This makes our compilation flag setup less error prone by only applying
our settings to our targets and leaving the externals alone entirely.
This also means we don't end up clobbering any provided flags on the
command line either, allowing users to specifically use the flags they
want.
2019-06-18 12:12:32 +02:00
|
|
|
# Configure C++ standard
|
2017-05-28 08:45:55 +02:00
|
|
|
# ===========================
|
|
|
|
|
2022-11-06 03:35:20 +01:00
|
|
|
# boost asio's concept usage doesn't play nicely with some compilers yet.
|
|
|
|
add_definitions(-DBOOST_ASIO_DISABLE_CONCEPTS)
|
2023-06-17 01:06:18 +02:00
|
|
|
# boost can have issues compiling with C++17 and up on newer versions of Clang.
|
|
|
|
add_definitions(-DBOOST_NO_CXX98_FUNCTION_BASE)
|
2022-09-21 18:36:12 +02:00
|
|
|
set(CMAKE_CXX_STANDARD 20)
|
2016-06-30 19:59:32 +02:00
|
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
|
|
|
2023-07-05 06:00:24 +02:00
|
|
|
# Apply consistent visibility settings.
|
|
|
|
set(CMAKE_CXX_VISIBILITY_PRESET default)
|
|
|
|
set(CMAKE_VISIBILITY_INLINES_HIDDEN NO)
|
|
|
|
|
2018-09-24 15:45:45 +02:00
|
|
|
# set up output paths for executable binaries
|
2020-05-02 16:24:28 +02:00
|
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin/$<CONFIG>)
|
2018-09-24 15:45:45 +02:00
|
|
|
|
|
|
|
|
2017-05-28 08:45:55 +02:00
|
|
|
# System imported libraries
|
|
|
|
# ======================
|
|
|
|
|
2016-04-24 17:39:25 +02:00
|
|
|
# Prefer the -pthread flag on Linux.
|
2017-05-28 08:45:55 +02:00
|
|
|
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
2016-03-27 05:59:50 +02:00
|
|
|
find_package(Threads REQUIRED)
|
|
|
|
|
2017-05-28 08:45:55 +02:00
|
|
|
if (ENABLE_QT)
|
2023-06-27 02:42:00 +02:00
|
|
|
if (NOT USE_SYSTEM_QT)
|
2023-11-02 01:58:02 +01:00
|
|
|
download_qt(6.6.0)
|
2017-05-28 08:45:55 +02:00
|
|
|
endif()
|
|
|
|
|
2023-05-05 12:10:34 +02:00
|
|
|
find_package(Qt6 REQUIRED COMPONENTS Widgets Multimedia Concurrent)
|
2017-09-23 15:14:20 +02:00
|
|
|
|
2023-03-23 19:37:10 +01:00
|
|
|
if (UNIX AND NOT APPLE)
|
2023-05-05 12:10:34 +02:00
|
|
|
find_package(Qt6 REQUIRED COMPONENTS DBus)
|
2023-03-23 19:37:10 +01:00
|
|
|
endif()
|
|
|
|
|
2017-09-23 15:14:20 +02:00
|
|
|
if (ENABLE_QT_TRANSLATION)
|
2023-05-05 12:10:34 +02:00
|
|
|
find_package(Qt6 REQUIRED COMPONENTS LinguistTools)
|
2023-04-28 22:02:53 +02:00
|
|
|
endif()
|
2024-02-05 19:09:50 +01:00
|
|
|
|
|
|
|
if (NOT DEFINED QT_TARGET_PATH)
|
|
|
|
# Determine the location of the compile target's Qt.
|
|
|
|
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)
|
|
|
|
# Use the same for host Qt if none is defined.
|
|
|
|
set(QT_HOST_PATH "${QT_TARGET_PATH}")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
message(STATUS "Using target Qt at ${QT_TARGET_PATH}")
|
|
|
|
message(STATUS "Using host Qt at ${QT_HOST_PATH}")
|
2017-05-28 08:45:55 +02:00
|
|
|
endif()
|
|
|
|
|
2023-05-10 15:42:20 +02:00
|
|
|
# Use system tsl::robin_map if available (otherwise we fallback to version bundled with dynarmic)
|
|
|
|
find_package(tsl-robin-map QUIET)
|
|
|
|
|
2017-05-28 08:45:55 +02:00
|
|
|
# Platform-specific library requirements
|
|
|
|
# ======================================
|
|
|
|
|
Port yuzu-emu/yuzu#2253: "Migrate off directly modifying CMAKE_* compilation-related flags directly" (#4714)
* CMakeLists: Move compilation flags into the src directory
We generally shouldn't be hijacking CMAKE_CXX_FLAGS, etc as a means to
append flags to the targets, since this adds the compilation flags to
everything, including our externals, which can result in weird issues
and makes the build hierarchy fragile.
Instead, we want to just apply these compilation flags to our targets,
and let those managing external libraries to properly specify their
compilation flags.
This also results in us not getting as many warnings, as we don't raise
the warning level on every external target.
* CMakeLists: Move off of modifying CMAKE_*-related flags
Modifying CMAKE_* related flags directly applies those changes to every
single CMake target. This includes even the targets we have in the
externals directory.
So, if we ever increased our warning levels, or enabled particular ones,
or enabled any other compilation setting, then this would apply to
externals as well, which is often not desirable.
This makes our compilation flag setup less error prone by only applying
our settings to our targets and leaving the externals alone entirely.
This also means we don't end up clobbering any provided flags on the
command line either, allowing users to specifically use the flags they
want.
2019-06-18 12:12:32 +02:00
|
|
|
if (APPLE)
|
2023-06-08 05:40:53 +02:00
|
|
|
if (NOT IOS)
|
|
|
|
# Umbrella framework for everything GUI-related
|
|
|
|
find_library(COCOA_LIBRARY Cocoa REQUIRED)
|
|
|
|
endif()
|
2023-06-05 16:29:05 +02:00
|
|
|
find_library(AVFOUNDATION_LIBRARY AVFoundation REQUIRED)
|
2023-06-08 05:40:53 +02:00
|
|
|
find_library(IOSURFACE_LIBRARY IOSurface REQUIRED)
|
|
|
|
set(PLATFORM_LIBRARIES ${COCOA_LIBRARY} ${AVFOUNDATION_LIBRARY} ${IOSURFACE_LIBRARY} ${MOLTENVK_LIBRARY})
|
2024-01-22 08:29:46 +01:00
|
|
|
|
|
|
|
if (ENABLE_VULKAN)
|
|
|
|
if (NOT USE_SYSTEM_MOLTENVK)
|
|
|
|
download_moltenvk()
|
|
|
|
endif()
|
|
|
|
find_library(MOLTENVK_LIBRARY MoltenVK REQUIRED)
|
|
|
|
message(STATUS "Using MoltenVK at ${MOLTENVK_LIBRARY}.")
|
|
|
|
set(PLATFORM_LIBRARIES ${PLATFORM_LIBRARIES} ${MOLTENVK_LIBRARY})
|
|
|
|
endif()
|
Port yuzu-emu/yuzu#2253: "Migrate off directly modifying CMAKE_* compilation-related flags directly" (#4714)
* CMakeLists: Move compilation flags into the src directory
We generally shouldn't be hijacking CMAKE_CXX_FLAGS, etc as a means to
append flags to the targets, since this adds the compilation flags to
everything, including our externals, which can result in weird issues
and makes the build hierarchy fragile.
Instead, we want to just apply these compilation flags to our targets,
and let those managing external libraries to properly specify their
compilation flags.
This also results in us not getting as many warnings, as we don't raise
the warning level on every external target.
* CMakeLists: Move off of modifying CMAKE_*-related flags
Modifying CMAKE_* related flags directly applies those changes to every
single CMake target. This includes even the targets we have in the
externals directory.
So, if we ever increased our warning levels, or enabled particular ones,
or enabled any other compilation setting, then this would apply to
externals as well, which is often not desirable.
This makes our compilation flag setup less error prone by only applying
our settings to our targets and leaving the externals alone entirely.
This also means we don't end up clobbering any provided flags on the
command line either, allowing users to specifically use the flags they
want.
2019-06-18 12:12:32 +02:00
|
|
|
elseif (WIN32)
|
2015-01-10 18:32:28 +01:00
|
|
|
set(PLATFORM_LIBRARIES winmm ws2_32)
|
Port yuzu-emu/yuzu#2253: "Migrate off directly modifying CMAKE_* compilation-related flags directly" (#4714)
* CMakeLists: Move compilation flags into the src directory
We generally shouldn't be hijacking CMAKE_CXX_FLAGS, etc as a means to
append flags to the targets, since this adds the compilation flags to
everything, including our externals, which can result in weird issues
and makes the build hierarchy fragile.
Instead, we want to just apply these compilation flags to our targets,
and let those managing external libraries to properly specify their
compilation flags.
This also results in us not getting as many warnings, as we don't raise
the warning level on every external target.
* CMakeLists: Move off of modifying CMAKE_*-related flags
Modifying CMAKE_* related flags directly applies those changes to every
single CMake target. This includes even the targets we have in the
externals directory.
So, if we ever increased our warning levels, or enabled particular ones,
or enabled any other compilation setting, then this would apply to
externals as well, which is often not desirable.
This makes our compilation flag setup less error prone by only applying
our settings to our targets and leaving the externals alone entirely.
This also means we don't end up clobbering any provided flags on the
command line either, allowing users to specifically use the flags they
want.
2019-06-18 12:12:32 +02: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)
|
Port yuzu-emu/yuzu#2253: "Migrate off directly modifying CMAKE_* compilation-related flags directly" (#4714)
* CMakeLists: Move compilation flags into the src directory
We generally shouldn't be hijacking CMAKE_CXX_FLAGS, etc as a means to
append flags to the targets, since this adds the compilation flags to
everything, including our externals, which can result in weird issues
and makes the build hierarchy fragile.
Instead, we want to just apply these compilation flags to our targets,
and let those managing external libraries to properly specify their
compilation flags.
This also results in us not getting as many warnings, as we don't raise
the warning level on every external target.
* CMakeLists: Move off of modifying CMAKE_*-related flags
Modifying CMAKE_* related flags directly applies those changes to every
single CMake target. This includes even the targets we have in the
externals directory.
So, if we ever increased our warning levels, or enabled particular ones,
or enabled any other compilation setting, then this would apply to
externals as well, which is often not desirable.
This makes our compilation flag setup less error prone by only applying
our settings to our targets and leaving the externals alone entirely.
This also means we don't end up clobbering any provided flags on the
command line either, allowing users to specifically use the flags they
want.
2019-06-18 12:12:32 +02:00
|
|
|
endif()
|
|
|
|
elseif (CMAKE_SYSTEM_NAME MATCHES "^(Linux|kFreeBSD|GNU|SunOS)$")
|
2014-12-24 10:34:25 +01:00
|
|
|
set(PLATFORM_LIBRARIES rt)
|
Port yuzu-emu/yuzu#2253: "Migrate off directly modifying CMAKE_* compilation-related flags directly" (#4714)
* CMakeLists: Move compilation flags into the src directory
We generally shouldn't be hijacking CMAKE_CXX_FLAGS, etc as a means to
append flags to the targets, since this adds the compilation flags to
everything, including our externals, which can result in weird issues
and makes the build hierarchy fragile.
Instead, we want to just apply these compilation flags to our targets,
and let those managing external libraries to properly specify their
compilation flags.
This also results in us not getting as many warnings, as we don't raise
the warning level on every external target.
* CMakeLists: Move off of modifying CMAKE_*-related flags
Modifying CMAKE_* related flags directly applies those changes to every
single CMake target. This includes even the targets we have in the
externals directory.
So, if we ever increased our warning levels, or enabled particular ones,
or enabled any other compilation setting, then this would apply to
externals as well, which is often not desirable.
This makes our compilation flag setup less error prone by only applying
our settings to our targets and leaving the externals alone entirely.
This also means we don't end up clobbering any provided flags on the
command line either, allowing users to specifically use the flags they
want.
2019-06-18 12:12:32 +02:00
|
|
|
endif()
|
2014-04-29 04:40:39 +02:00
|
|
|
|
2018-01-20 08:31:44 +01: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-09-27 15:59:49 +02:00
|
|
|
set(CLANG_FORMAT_POSTFIX "-15")
|
2018-01-20 08:31:44 +01:00
|
|
|
find_program(CLANG_FORMAT
|
|
|
|
NAMES clang-format${CLANG_FORMAT_POSTFIX}
|
|
|
|
clang-format
|
2018-10-20 23:08:26 +02:00
|
|
|
PATHS ${PROJECT_BINARY_DIR}/externals)
|
2018-01-20 08:31:44 +01:00
|
|
|
# if find_program doesn't find it, try to download from externals
|
|
|
|
if (NOT CLANG_FORMAT)
|
|
|
|
if (WIN32)
|
|
|
|
message(STATUS "Clang format not found! Downloading...")
|
2018-10-20 23:08:26 +02:00
|
|
|
set(CLANG_FORMAT "${PROJECT_BINARY_DIR}/externals/clang-format${CLANG_FORMAT_POSTFIX}.exe")
|
2018-01-20 08:31:44 +01:00
|
|
|
file(DOWNLOAD
|
2020-08-29 21:58:20 +02:00
|
|
|
https://github.com/citra-emu/ext-windows-bin/raw/master/clang-format${CLANG_FORMAT_POSTFIX}.exe
|
2018-01-20 08:31:44 +01: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 23:08:26 +02:00
|
|
|
set(SRCS ${PROJECT_SOURCE_DIR}/src)
|
2018-01-20 08:31:44 +01:00
|
|
|
set(CCOMMENT "Running clang format against all the .h and .cpp files in src/")
|
|
|
|
if (WIN32)
|
2022-11-13 08:22:05 +01:00
|
|
|
if(MINGW)
|
|
|
|
add_custom_target(clang-format
|
|
|
|
COMMAND find `cygpath -u ${SRCS}` -iname *.h -o -iname *.cpp -o -iname *.mm | xargs `cygpath -u ${CLANG_FORMAT}` -i
|
|
|
|
COMMENT ${CCOMMENT})
|
|
|
|
else()
|
|
|
|
add_custom_target(clang-format
|
|
|
|
COMMAND powershell.exe -Command "Get-ChildItem '${SRCS}/*' -Include *.cpp,*.h,*.mm -Recurse | Foreach {&'${CLANG_FORMAT}' -i $_.fullname}"
|
|
|
|
COMMENT ${CCOMMENT})
|
2023-06-27 02:42:00 +02:00
|
|
|
endif()
|
2018-01-20 08:31:44 +01:00
|
|
|
else()
|
|
|
|
add_custom_target(clang-format
|
2022-01-10 13:52:39 +01:00
|
|
|
COMMAND find ${SRCS} -iname *.h -o -iname *.cpp -o -iname *.mm | xargs ${CLANG_FORMAT} -i
|
2018-01-20 08:31:44 +01:00
|
|
|
COMMENT ${CCOMMENT})
|
|
|
|
endif()
|
|
|
|
unset(SRCS)
|
|
|
|
unset(CCOMMENT)
|
|
|
|
endif()
|
2015-08-28 21:57:08 +02:00
|
|
|
|
2017-05-28 08:45:55 +02:00
|
|
|
# Include source code
|
|
|
|
# ===================
|
2013-08-30 05:35:09 +02:00
|
|
|
|
2014-08-24 03:22:05 +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.
|
2017-12-11 00:55:03 +01:00
|
|
|
function(create_target_directory_groups target_name)
|
2014-08-24 03:22:05 +02:00
|
|
|
# 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 ".")
|
|
|
|
|
2017-12-11 00:55:03 +01:00
|
|
|
get_target_property(target_sources "${target_name}" SOURCES)
|
|
|
|
|
|
|
|
foreach(file_name IN LISTS target_sources)
|
2014-08-24 03:22:05 +02:00
|
|
|
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()
|
|
|
|
|
2017-08-02 01:54:24 +02:00
|
|
|
# Gets a UTC timstamp and sets the provided variable to it
|
|
|
|
function(get_timestamp _var)
|
|
|
|
string(TIMESTAMP timestamp UTC)
|
|
|
|
set(${_var} "${timestamp}" PARENT_SCOPE)
|
|
|
|
endfunction()
|
|
|
|
|
|
|
|
# generate git/build information
|
2014-04-24 03:43:57 +02:00
|
|
|
include(GetGitRevisionDescription)
|
|
|
|
get_git_head_revision(GIT_REF_SPEC GIT_REV)
|
|
|
|
git_describe(GIT_DESC --always --long --dirty)
|
2014-04-24 04:13:00 +02:00
|
|
|
git_branch_name(GIT_BRANCH)
|
2017-08-02 01:54:24 +02:00
|
|
|
get_timestamp(BUILD_DATE)
|
2013-08-30 05:35:09 +02:00
|
|
|
|
2023-08-02 21:20:35 +02:00
|
|
|
# Boost
|
|
|
|
# Prevent boost from linking against libs when building
|
|
|
|
add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY
|
|
|
|
-DBOOST_SYSTEM_NO_LIB
|
|
|
|
-DBOOST_DATE_TIME_NO_LIB
|
|
|
|
-DBOOST_REGEX_NO_LIB
|
|
|
|
)
|
|
|
|
if (USE_SYSTEM_BOOST)
|
|
|
|
find_package(Boost 1.70.0 COMPONENTS container locale serialization iostreams REQUIRED)
|
2019-12-30 01:51:06 +01:00
|
|
|
endif()
|
|
|
|
|
2017-05-01 23:11:06 +02:00
|
|
|
enable_testing()
|
2016-12-11 23:59:28 +01:00
|
|
|
add_subdirectory(externals)
|
2019-12-30 01:51:06 +01:00
|
|
|
|
2023-08-02 21:20:35 +02:00
|
|
|
# Boost (bundled)
|
|
|
|
if (NOT USE_SYSTEM_BOOST)
|
|
|
|
add_definitions( -DBOOST_ALL_NO_LIB )
|
2019-12-30 01:51:06 +01:00
|
|
|
add_library(Boost::boost ALIAS boost)
|
|
|
|
add_library(Boost::serialization ALIAS boost_serialization)
|
2023-03-23 14:30:52 +01:00
|
|
|
add_library(Boost::iostreams ALIAS boost_iostreams)
|
2019-12-30 01:51:06 +01:00
|
|
|
endif()
|
|
|
|
|
2022-09-21 18:36:12 +02:00
|
|
|
# SDL2
|
|
|
|
if (ENABLE_SDL2 AND USE_SYSTEM_SDL2)
|
|
|
|
find_package(SDL2 REQUIRED)
|
2022-09-23 19:55:51 +02:00
|
|
|
add_library(SDL2 INTERFACE)
|
|
|
|
target_link_libraries(SDL2 INTERFACE "${SDL2_LIBRARY}")
|
|
|
|
target_include_directories(SDL2 INTERFACE "${SDL2_INCLUDE_DIR}")
|
|
|
|
add_library(SDL2::SDL2 ALIAS SDL2)
|
2022-09-21 18:36:12 +02:00
|
|
|
endif()
|
|
|
|
|
2023-07-05 06:00:24 +02:00
|
|
|
if (ENABLE_LIBUSB AND USE_SYSTEM_LIBUSB)
|
|
|
|
include(FindPkgConfig)
|
|
|
|
find_package(LibUSB)
|
|
|
|
endif()
|
|
|
|
|
2023-09-16 23:46:32 +02:00
|
|
|
if (USE_SYSTEM_SOUNDTOUCH)
|
|
|
|
include(FindPkgConfig)
|
|
|
|
find_package(SoundTouch REQUIRED)
|
|
|
|
add_library(SoundTouch INTERFACE)
|
|
|
|
target_link_libraries(SoundTouch INTERFACE "${SOUNDTOUCH_LIBRARIES}")
|
|
|
|
target_include_directories(SoundTouch INTERFACE "${SOUNDTOUCH_INCLUDE_DIRS}")
|
|
|
|
endif()
|
|
|
|
|
2013-08-30 05:35:09 +02:00
|
|
|
add_subdirectory(src)
|
2017-09-28 18:27:42 +02:00
|
|
|
add_subdirectory(dist/installer)
|
2015-04-22 13:34:42 +02:00
|
|
|
|
2018-09-21 14:46:20 +02:00
|
|
|
|
2018-09-21 14:47:43 +02:00
|
|
|
# Set citra-qt project or citra 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 citra-qt)
|
|
|
|
else()
|
|
|
|
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT citra)
|
|
|
|
endif()
|
2017-05-28 08:45:55 +02:00
|
|
|
|
2023-06-27 02:42:00 +02:00
|
|
|
# Create target for outputting distributable bundles.
|
2024-02-05 19:09:50 +01:00
|
|
|
# Not supported for mobile platforms as distributables are built differently.
|
|
|
|
if (NOT ANDROID AND NOT IOS)
|
2023-06-27 02:42:00 +02:00
|
|
|
include(BundleTarget)
|
2023-06-29 09:44:13 +02:00
|
|
|
if (ENABLE_SDL2_FRONTEND)
|
|
|
|
bundle_target(citra)
|
|
|
|
endif()
|
|
|
|
if (ENABLE_QT)
|
|
|
|
bundle_target(citra-qt)
|
|
|
|
endif()
|
|
|
|
if (ENABLE_DEDICATED_ROOM)
|
|
|
|
bundle_target(citra-room)
|
|
|
|
endif()
|
2023-06-27 02:42:00 +02:00
|
|
|
endif()
|
|
|
|
|
2017-05-28 08:45:55 +02:00
|
|
|
# Installation instructions
|
|
|
|
# =========================
|
|
|
|
|
2015-04-22 13:34:42 +02:00
|
|
|
# Install freedesktop.org metadata files, following those specifications:
|
|
|
|
# http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html
|
|
|
|
# http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html
|
|
|
|
# http://standards.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html
|
2016-10-10 07:58:05 +02:00
|
|
|
if(ENABLE_QT AND UNIX AND NOT APPLE)
|
2023-06-27 02:42:00 +02:00
|
|
|
install(FILES "${PROJECT_SOURCE_DIR}/dist/citra-qt.desktop"
|
2015-04-22 13:34:42 +02:00
|
|
|
DESTINATION "${CMAKE_INSTALL_PREFIX}/share/applications")
|
2018-10-20 23:08:26 +02:00
|
|
|
install(FILES "${PROJECT_SOURCE_DIR}/dist/citra.svg"
|
2017-10-15 08:39:48 +02:00
|
|
|
DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps")
|
2018-10-20 23:08:26 +02:00
|
|
|
install(FILES "${PROJECT_SOURCE_DIR}/dist/citra.xml"
|
2015-04-22 13:34:42 +02:00
|
|
|
DESTINATION "${CMAKE_INSTALL_PREFIX}/share/mime/packages")
|
|
|
|
endif()
|
2016-11-22 05:30:22 +01:00
|
|
|
|
|
|
|
if(UNIX)
|
|
|
|
if(ENABLE_SDL2)
|
2018-10-20 23:08:26 +02:00
|
|
|
install(FILES "${PROJECT_SOURCE_DIR}/dist/citra.6"
|
2016-11-22 05:30:22 +01:00
|
|
|
DESTINATION "${CMAKE_INSTALL_PREFIX}/share/man/man6")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if (ENABLE_QT)
|
2018-10-20 23:08:26 +02:00
|
|
|
install(FILES "${PROJECT_SOURCE_DIR}/dist/citra-qt.6"
|
2016-11-22 05:30:22 +01:00
|
|
|
DESTINATION "${CMAKE_INSTALL_PREFIX}/share/man/man6")
|
|
|
|
endif()
|
|
|
|
endif()
|