2010-11-01 09:47:02 -06:00
########################################
# General setup
#
2019-05-04 15:54:25 -06:00
cmake_minimum_required ( VERSION 3.10 )
2021-01-13 07:23:57 -07:00
2017-01-24 00:45:54 -07:00
# Minimum OS X version.
# This is inserted into the Info.plist as well.
2019-12-21 22:32:17 -07:00
2021-01-16 21:31:48 -07:00
# MacOS prior to 10.14 did not support aligned alloc which is used to implement
# std::unique_ptr in the arm64 C++ standard library. x86_64 builds can override
2021-08-17 12:04:33 -06:00
# this to 10.13.0 using -DCMAKE_OSX_DEPLOYMENT_TARGET="10.13.0" without issue.
2022-04-28 11:20:16 -06:00
# This is done in the universal binary building script to build a binary that
2021-08-17 12:04:33 -06:00
# runs on 10.13 on x86_64 computers, while still containing an arm64 slice.
2021-01-16 21:31:48 -07:00
2021-01-13 07:23:57 -07:00
set ( CMAKE_OSX_DEPLOYMENT_TARGET "10.14.0" CACHE STRING "" )
2012-03-13 18:14:00 -06:00
2017-06-15 10:24:41 -06:00
set ( CMAKE_USER_MAKE_RULES_OVERRIDE "CMake/FlagsOverride.cmake" )
2022-04-28 11:20:16 -06:00
# Optionally enable these polcies so older versions of cmake don't break.
# we only need them for MSVC
if ( POLICY CMP0091 )
cmake_policy ( SET CMP0091 NEW ) # MSVC runtime library flags are selected by an abstraction.
cmake_policy ( SET CMP0092 NEW ) # MSVC warning flags are not in CMAKE_{C,CXX}_FLAGS by default.
endif ( )
2022-04-27 23:15:30 -06:00
2017-01-24 00:44:15 -07:00
project ( dolphin-emu )
2018-04-05 06:16:08 -06:00
2022-05-20 19:31:41 -06:00
if ( MSVC )
set ( CMAKE_C_STANDARD 99 )
set ( CMAKE_CXX_STANDARD 20 )
set ( CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std:c++latest" )
set ( CMAKE_CXX_STANDARD_REQUIRED ON )
set ( CMAKE_CXX_EXTENSIONS OFF )
endif ( )
2018-04-05 06:16:08 -06:00
# Name of the Dolphin distributor. If you redistribute Dolphin builds (forks,
# unofficial builds) please consider identifying your distribution with a
# unique name here.
set ( DISTRIBUTOR "None" CACHE STRING "Name of the distributor." )
2021-04-17 11:45:43 -06:00
set ( DOLPHIN_DEFAULT_UPDATE_TRACK "" CACHE STRING "Name of the default update track. If empty, disables auto-update." )
2018-10-03 07:03:36 -06:00
if ( UNIX AND NOT APPLE AND NOT ANDROID )
option ( ENABLE_X11 "Enables X11 Support" ON )
endif ( )
2020-12-12 13:25:51 -07:00
if ( NOT WIN32 AND NOT APPLE AND NOT HAIKU )
2018-10-03 07:03:36 -06:00
option ( ENABLE_EGL "Enables EGL OpenGL Interface" ON )
endif ( )
2021-12-03 14:40:19 -07:00
if ( NOT ANDROID )
option ( ENABLE_CLI_TOOL "Enable dolphin-tool, a CLI-based utility for functions such as managing disc images" ON )
endif ( )
2015-06-02 16:30:09 -06:00
option ( USE_SHARED_ENET "Use shared libenet if found rather than Dolphin's soon-to-compatibly-diverge version" OFF )
2013-07-08 18:13:02 -06:00
option ( USE_UPNP "Enables UPnP port mapping support" ON )
2018-10-24 02:14:50 -06:00
option ( ENABLE_NOGUI "Enable NoGUI frontend" ON )
2018-07-06 16:40:15 -06:00
option ( ENABLE_QT "Enable Qt (Default)" ON )
2014-04-23 03:15:25 -06:00
option ( ENABLE_LTO "Enables Link Time Optimization" OFF )
2014-05-25 19:52:52 -06:00
option ( ENABLE_GENERIC "Enables generic build that should run on any little-endian host" OFF )
2016-01-26 06:35:17 -07:00
option ( ENABLE_HEADLESS "Enables running Dolphin as a headless variant" OFF )
2016-12-03 11:36:34 -07:00
option ( ENABLE_ALSA "Enables ALSA sound backend" ON )
option ( ENABLE_PULSEAUDIO "Enables PulseAudio sound backend" ON )
2016-12-03 11:37:02 -07:00
option ( ENABLE_LLVM "Enables LLVM support, for disassembly" ON )
2018-12-08 15:06:23 -07:00
option ( ENABLE_TESTS "Enables building the unit tests" ON )
2018-09-03 10:09:23 -06:00
option ( ENABLE_VULKAN "Enables vulkan video backend" ON )
2018-06-08 14:56:11 -06:00
option ( USE_DISCORD_PRESENCE "Enables Discord Rich Presence, show the current game on Discord" ON )
2021-07-04 04:41:46 -06:00
option ( USE_MGBA "Enables GBA controllers emulation using libmgba" ON )
2022-03-15 16:40:13 -06:00
option ( ENABLE_AUTOUPDATE "Enables support for automatic updates" ON )
2015-06-28 19:09:24 -06:00
2016-06-16 18:28:34 -06:00
# Maintainers: if you consider blanket disabling this for your users, please
# consider the following points:
# * No data is being sent without explicit user approval (pop up box at first
# launch).
# * The Dolphin team relies on the data in order to understand the behavior
# of our software in the wild.
option ( ENABLE_ANALYTICS "Enables opt-in Analytics collection" ON )
2018-04-05 06:16:08 -06:00
option ( ENCODE_FRAMEDUMPS "Encode framedumps in AVI format" ON )
option ( ENABLE_GPROF "Enable gprof profiling (must be using Debug build)" OFF )
option ( FASTLOG "Enable all logs" OFF )
option ( OPROFILING "Enable profiling" OFF )
# TODO: Add DSPSpy
option ( DSPTOOL "Build dsptool" OFF )
2016-06-17 16:13:37 -06:00
2019-10-14 19:51:08 -06:00
# Enable SDL for default on operating systems that aren't Android, Linux or Windows.
if ( NOT ANDROID AND NOT CMAKE_SYSTEM_NAME STREQUAL "Linux" AND NOT MSVC )
2015-06-28 19:09:24 -06:00
option ( ENABLE_SDL "Enables SDL as a generic controller backend" ON )
else ( )
option ( ENABLE_SDL "Enables SDL as a generic controller backend" OFF )
endif ( )
2014-10-28 22:11:57 -06:00
if ( APPLE )
2021-01-16 21:31:48 -07:00
option ( MACOS_USE_DEFAULT_SEARCH_PATH "Don't prioritize system library paths" OFF )
2022-04-28 11:20:16 -06:00
option ( SKIP_POSTPROCESS_BUNDLE "Skip postprocessing bundle for redistributability" OFF )
2021-01-16 21:31:48 -07:00
# Enable adhoc code signing by default (otherwise makefile builds on ARM will not work)
option ( MACOS_CODE_SIGNING "Enable codesigning" ON )
set ( MACOS_CODE_SIGNING_IDENTITY "-" CACHE STRING "The identity used for codesigning." )
set ( MACOS_CODE_SIGNING_IDENTITY_UPDATER "-" CACHE STRING "The identity used for codesigning, for the updater." )
2014-10-28 22:11:57 -06:00
endif ( )
2013-01-25 12:55:05 -07:00
2018-07-02 11:01:16 -06:00
if ( CMAKE_SYSTEM_NAME STREQUAL "Linux" )
2018-04-21 10:37:17 -06:00
option ( ENABLE_VTUNE "Enable Intel VTune integration for JIT code." OFF )
2018-04-05 06:16:08 -06:00
if ( NOT ANDROID )
option ( ENABLE_EVDEV "Enables the evdev controller backend" ON )
endif ( )
2015-02-11 17:36:29 -07:00
endif ( )
2014-11-05 18:53:34 -07:00
2018-04-05 06:16:08 -06:00
if ( UNIX )
# Builds a relocatable binary on Linux.
# The Sys folder will need to be copied to the Binaries folder.
option ( LINUX_LOCAL_DEV "Enable relocatable binary" OFF )
2014-11-05 18:53:34 -07:00
endif ( )
2013-01-25 12:55:05 -07:00
2017-01-24 17:48:16 -07:00
list ( APPEND CMAKE_MODULE_PATH
2017-02-07 23:51:47 -07:00
$ { C M A K E _ S O U R C E _ D I R } / C M a k e
2017-01-24 17:48:16 -07:00
)
# Support functions
include ( CheckAndAddFlag )
2017-01-24 21:23:06 -07:00
include ( CheckCCompilerFlag )
2020-05-10 00:23:02 -06:00
include ( CheckVendoringApproved )
2017-01-25 08:20:03 -07:00
include ( DolphinCompileDefinitions )
2017-01-24 17:48:16 -07:00
2017-02-02 20:19:23 -07:00
# Enable folders for IDE
set_property ( GLOBAL PROPERTY USE_FOLDERS ON )
2010-11-04 07:47:17 -06:00
# Set up paths
2017-02-05 12:16:27 -07:00
set ( bindir ${ CMAKE_INSTALL_PREFIX } /bin CACHE PATH "bindir" )
2018-10-03 06:28:38 -06:00
set ( datadir ${ CMAKE_INSTALL_PREFIX } /share/dolphin-emu CACHE PATH "datadir" )
set ( mandir ${ CMAKE_INSTALL_PREFIX } /share/man CACHE PATH "mandir" )
2017-02-05 12:16:27 -07:00
add_definitions ( -DDATA_DIR= "${datadir}/" )
2010-11-04 07:47:17 -06:00
2017-01-17 13:34:18 -07:00
if ( CMAKE_SYSROOT )
# If we should use a sysroot, tell pkg-config to search for packages in there, not on the host
set ( ENV{PKG_CONFIG_LIBDIR} "${CMAKE_SYSROOT}/usr/lib/pkgconfig:${CMAKE_SYSROOT}/usr/share/pkgconfig" )
set ( ENV{PKG_CONFIG_SYSROOT_DIR} "${CMAKE_SYSROOT}" )
endif ( )
2011-02-10 19:38:23 -07:00
# Set where the binary files will be built. The program will not execute from
# here. You must run "make install" to install these to the proper location
# as defined above.
2010-11-04 07:47:17 -06:00
set ( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${ CMAKE_BINARY_DIR } /Binaries )
2010-11-01 09:47:02 -06:00
2019-05-15 01:59:55 -06:00
if ( WIN32 )
set ( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${ CMAKE_SOURCE_DIR } /Binary )
2020-02-11 16:07:56 -07:00
2021-04-17 13:33:07 -06:00
if ( CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64|AMD64" )
string ( APPEND CMAKE_RUNTIME_OUTPUT_DIRECTORY /x64 )
elseif ( CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" )
2020-10-23 15:48:37 -06:00
string ( APPEND CMAKE_RUNTIME_OUTPUT_DIRECTORY /ARM64 )
2020-02-11 16:07:56 -07:00
endif ( )
2019-05-08 15:57:47 -06:00
endif ( )
2017-01-17 14:38:02 -07:00
# setup CCache
include ( CCache )
2011-08-14 14:17:57 -06:00
# for revision info
2017-01-17 13:32:55 -07:00
find_package ( Git )
2017-02-06 18:14:15 -07:00
if ( GIT_FOUND )
# make sure version information gets re-run when the current Git HEAD changes
execute_process ( WORKING_DIRECTORY ${ PROJECT_SOURCE_DIR } COMMAND ${ GIT_EXECUTABLE } rev-parse --git-path HEAD
O U T P U T _ V A R I A B L E d o l p h i n _ g i t _ h e a d _ f i l e n a m e
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E )
set_property ( DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${dolphin_git_head_filename}" )
2017-03-01 05:43:43 -07:00
2017-02-07 01:50:28 -07:00
execute_process ( WORKING_DIRECTORY ${ PROJECT_SOURCE_DIR } COMMAND ${ GIT_EXECUTABLE } rev-parse --symbolic-full-name HEAD
O U T P U T _ V A R I A B L E d o l p h i n _ g i t _ h e a d _ s y m b o l i c
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E )
execute_process ( WORKING_DIRECTORY ${ PROJECT_SOURCE_DIR }
C O M M A N D $ { G I T _ E X E C U T A B L E } r e v - p a r s e - - g i t - p a t h $ { d o l p h i n _ g i t _ h e a d _ s y m b o l i c }
O U T P U T _ V A R I A B L E d o l p h i n _ g i t _ h e a d _ s y m b o l i c _ f i l e n a m e
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E )
set_property ( DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${dolphin_git_head_symbolic_filename}" )
2017-03-01 05:43:43 -07:00
2013-07-10 20:49:13 -06:00
# defines DOLPHIN_WC_REVISION
2018-07-06 11:13:19 -06:00
execute_process ( WORKING_DIRECTORY ${ PROJECT_SOURCE_DIR } COMMAND ${ GIT_EXECUTABLE } rev-parse HEAD
2013-07-10 20:49:13 -06:00
O U T P U T _ V A R I A B L E D O L P H I N _ W C _ R E V I S I O N
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E )
# defines DOLPHIN_WC_DESCRIBE
2018-07-06 11:13:19 -06:00
execute_process ( WORKING_DIRECTORY ${ PROJECT_SOURCE_DIR } COMMAND ${ GIT_EXECUTABLE } describe --always --long --dirty
2013-07-10 20:49:13 -06:00
O U T P U T _ V A R I A B L E D O L P H I N _ W C _ D E S C R I B E
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E )
2017-03-01 05:43:43 -07:00
2013-08-10 16:12:24 -06:00
# remove hash (and trailing "-0" if needed) from description
2018-07-06 11:13:19 -06:00
string ( REGEX REPLACE "(-0)?-[^-]+((-dirty)?)$" "\\2" DOLPHIN_WC_DESCRIBE "${DOLPHIN_WC_DESCRIBE}" )
2017-03-01 05:43:43 -07:00
2013-07-10 20:49:13 -06:00
# defines DOLPHIN_WC_BRANCH
2018-07-06 11:13:19 -06:00
execute_process ( WORKING_DIRECTORY ${ PROJECT_SOURCE_DIR } COMMAND ${ GIT_EXECUTABLE } rev-parse --abbrev-ref HEAD
2013-07-10 20:49:13 -06:00
O U T P U T _ V A R I A B L E D O L P H I N _ W C _ B R A N C H
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E )
2011-08-20 15:05:43 -06:00
endif ( )
2011-12-11 08:21:17 -07:00
# version number
2016-06-24 02:09:07 -06:00
set ( DOLPHIN_VERSION_MAJOR "5" )
2013-09-20 23:29:41 -06:00
set ( DOLPHIN_VERSION_MINOR "0" )
2015-06-09 13:06:28 -06:00
if ( DOLPHIN_WC_BRANCH STREQUAL "stable" )
2011-12-11 08:21:17 -07:00
set ( DOLPHIN_VERSION_PATCH "0" )
else ( )
set ( DOLPHIN_VERSION_PATCH ${ DOLPHIN_WC_REVISION } )
endif ( )
2014-03-02 04:21:50 -07:00
2016-05-29 10:26:53 -06:00
# If Dolphin is not built from a Git repository, default the version info to
# reasonable values.
if ( NOT DOLPHIN_WC_REVISION )
set ( DOLPHIN_WC_DESCRIBE "${DOLPHIN_VERSION_MAJOR}.${DOLPHIN_VERSION_MINOR}" )
set ( DOLPHIN_WC_REVISION "${DOLPHIN_WC_DESCRIBE} (no further info)" )
set ( DOLPHIN_WC_BRANCH "master" )
endif ( )
2014-03-02 04:21:50 -07:00
# Architecture detection and arch specific settings
2017-01-17 13:47:24 -07:00
message ( STATUS "Detected architecture: ${CMAKE_SYSTEM_PROCESSOR}" )
2014-03-02 04:21:50 -07:00
# Detect 64bit or 32bit
# CMake doesn't provide a simple way to determine 32bit or 64bit
# If we ever support a architecture that is 64bit with 32bit pointers then this'll break
# Of course the chances of that are slim(x32?) so who cares
if ( CMAKE_SIZEOF_VOID_P EQUAL 8 )
set ( _ARCH_64 1 )
add_definitions ( -D_ARCH_64=1 )
else ( )
set ( _ARCH_32 1 )
add_definitions ( -D_ARCH_32=1 )
endif ( )
2014-05-25 19:52:52 -06:00
if ( ENABLE_GENERIC )
2017-01-17 13:47:24 -07:00
message ( STATUS "Warning! Building generic build!" )
2014-03-02 04:21:50 -07:00
set ( _M_GENERIC 1 )
add_definitions ( -D_M_GENERIC=1 )
2017-01-27 01:56:38 -07:00
elseif ( _ARCH_64 AND CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64|AMD64" )
2016-06-08 11:49:46 -06:00
set ( _M_X86 1 )
set ( _M_X86_64 1 )
2017-01-24 22:02:01 -07:00
add_definitions ( -D_M_X86=1 )
add_definitions ( -D_M_X86_64=1 )
check_and_add_flag ( HAVE_SSE2 -msse2 )
2020-12-23 00:26:53 -07:00
elseif ( _ARCH_64 AND CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64" )
2016-06-08 11:49:46 -06:00
set ( _M_ARM_64 1 )
2017-01-24 22:02:01 -07:00
add_definitions ( -D_M_ARM_64=1 )
# CRC instruction set is used in the CRC32 hash function
check_and_add_flag ( HAVE_ARCH_ARMV8 -march=armv8-a+crc )
2016-06-08 11:49:46 -06:00
else ( )
2017-01-27 01:56:38 -07:00
message ( FATAL_ERROR "You're building on an unsupported platform: "
" ' $ { C M A K E _ S Y S T E M _ P R O C E S S O R } ' w i t h $ { C M A K E _ S I Z E O F _ V O I D _ P } - b y t e p o i n t e r s . "
" E n a b l e g e n e r i c b u i l d i f y o u r e a l l y w a n t a J I T - l e s s b i n a r y . " )
2013-02-26 12:49:00 -07:00
endif ( )
2011-01-09 09:36:19 -07:00
2013-01-29 20:28:55 -07:00
2017-01-17 12:00:56 -07:00
# Enforce minimum GCC version
2017-12-25 14:41:09 -07:00
if ( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0 )
message ( FATAL_ERROR "Dolphin requires at least GCC 7.0 (found ${CMAKE_CXX_COMPILER_VERSION})" )
2017-01-17 12:00:56 -07:00
endif ( )
2017-04-11 18:49:35 -06:00
if ( CMAKE_GENERATOR MATCHES "Ninja" )
check_and_add_flag ( DIAGNOSTICS_COLOR -fdiagnostics-color )
elseif ( CMAKE_GENERATOR MATCHES "Visual Studio" )
# Only MSBuild needs this, other generators will compile one file at a time
add_compile_options ( "/MP" )
endif ( )
2022-04-28 11:20:16 -06:00
if ( MSVC )
if ( POLICY CMP0091 )
# cmake is a weird language. You can't do if(not POLICY)
else ( )
# We really kind of want this policy
message ( FATAL_ERROR "please update cmake to at least 3.15" )
endif ( )
2017-01-24 22:06:25 -07:00
check_and_add_flag ( EXCEPTIONS /EHsc )
2017-03-07 22:31:02 -07:00
dolphin_compile_definitions ( _DEBUG DEBUG_ONLY )
2017-03-01 05:43:43 -07:00
2021-04-25 11:00:32 -06:00
# Enable function-level linking
add_compile_options ( /Gy )
# Generate intrinsic functions
add_compile_options ( /Oi )
# Disable buffer security check
add_compile_options ( /GS- )
2017-06-06 00:22:01 -06:00
# Enforce C++ standard conforming conversion rules to catch possible bugs
add_compile_options ( /permissive- )
# Remove unreferenced inline functions/data to reduce link time and catch bugs
add_compile_options ( /Zc:inline )
# Assume `new` (w/o std::nothrow) throws to reduce binary size
add_compile_options ( /Zc:throwingNew )
# Enforce strict volatile semantics as per ISO C++
add_compile_options ( /volatile:iso )
2020-06-25 05:11:29 -06:00
# Fix non-conformant lambda behavior (constexpr variables shouldn't need capturing)
add_compile_options ( /experimental:newLambdaProcessor )
2020-11-21 06:27:39 -07:00
# Fix various other non-conformant behaviors
2022-04-02 03:07:41 -06:00
add_compile_options ( /Zc:__cplusplus,externConstexpr,lambda,preprocessor )
2020-11-21 06:27:39 -07:00
# Temporarily disable warnings to enable /Zc:preprocessor compatibility with WinSDK headers.
add_compile_options (
/ w d 5 1 0 5 # macro expansion producing 'defined' has undefined behavior
)
2017-06-06 00:22:01 -06:00
2017-02-02 20:42:52 -07:00
string ( APPEND CMAKE_EXE_LINKER_FLAGS " /NXCOMPAT" )
2021-04-25 11:00:32 -06:00
# Generate debug data
string ( APPEND CMAKE_EXE_LINKER_FLAGS " /DEBUG" )
# Eliminate dead code and data
string ( APPEND CMAKE_EXE_LINKER_FLAGS " /OPT:REF /OPT:ICF" )
2017-01-24 22:06:25 -07:00
else ( )
2016-06-16 14:31:51 -06:00
add_definitions ( -D_DEFAULT_SOURCE )
2017-03-01 05:43:43 -07:00
2017-01-24 21:33:36 -07:00
# gcc uses some optimizations which might break stuff without this flag
check_and_add_flag ( NO_STRICT_ALIASING -fno-strict-aliasing )
check_and_add_flag ( NO_EXCEPTIONS -fno-exceptions )
2017-03-01 05:43:43 -07:00
2017-01-24 21:33:36 -07:00
check_and_add_flag ( VISIBILITY_INLINES_HIDDEN -fvisibility-inlines-hidden )
check_and_add_flag ( VISIBILITY_HIDDEN -fvisibility=hidden )
2017-03-01 05:43:43 -07:00
2017-01-25 08:19:35 -07:00
check_and_add_flag ( FOMIT_FRAME_POINTER -fomit-frame-pointer RELEASE_ONLY )
2017-03-01 05:43:43 -07:00
2017-01-25 08:20:03 -07:00
dolphin_compile_definitions ( _DEBUG DEBUG_ONLY )
2017-01-25 08:19:35 -07:00
check_and_add_flag ( GGDB -ggdb DEBUG_ONLY )
2018-06-30 09:46:46 -06:00
if ( CMAKE_SYSTEM_NAME STREQUAL "Linux" )
# GNU ar: Create thin archive files.
# Requires binutils-2.19 or later.
set ( CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> qcTP <TARGET> <LINK_FLAGS> <OBJECTS>" )
set ( CMAKE_C_ARCHIVE_APPEND "<CMAKE_AR> qTP <TARGET> <LINK_FLAGS> <OBJECTS>" )
set ( CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> qcTP <TARGET> <LINK_FLAGS> <OBJECTS>" )
set ( CMAKE_CXX_ARCHIVE_APPEND "<CMAKE_AR> qTP <TARGET> <LINK_FLAGS> <OBJECTS>" )
endif ( )
2017-01-24 22:06:25 -07:00
endif ( )
2010-11-01 09:47:02 -06:00
2017-01-27 01:58:21 -07:00
if ( CMAKE_SYSTEM_NAME MATCHES "Darwin" )
2021-01-16 21:31:48 -07:00
if ( NOT MACOS_USE_DEFAULT_SEARCH_PATH )
2014-10-28 22:11:57 -06:00
# Hack up the path to prioritize the path to built-in OS libraries to
# increase the chance of not depending on a bunch of copies of them
# installed by MacPorts, Fink, Homebrew, etc, and ending up copying
# them into the bundle. Since we optionally depend on libraries which
2016-09-28 11:32:07 -06:00
# are not part of OS X (ffmpeg, etc.), however, don't remove the default
# path entirely as was done in a previous version of this file. This is
# still kinda evil, since it defeats the user's path settings...
2014-10-28 22:11:57 -06:00
# See http://www.cmake.org/cmake/help/v3.0/command/find_program.html
2017-01-24 22:03:44 -07:00
list ( APPEND CMAKE_PREFIX_PATH "/usr" )
2014-10-28 22:11:57 -06:00
endif ( )
2017-03-01 05:43:43 -07:00
2021-04-10 22:28:10 -06:00
# Prevents Xcode from overriding the -fno-strict-aliasing flag
set ( CMAKE_XCODE_ATTRIBUTE_GCC_STRICT_ALIASING NO )
2011-12-11 13:27:06 -07:00
# Specify target CPUs.
2021-04-17 16:40:35 -06:00
if ( _ARCH_64 AND CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64|AMD64" )
check_and_add_flag ( HAVE_MSSSE3 -mssse3 )
check_and_add_flag ( HAVE_ARCH_CORE2 -march=core2 )
endif ( )
2011-12-11 13:27:06 -07:00
# Linker flags.
# Drop unreachable code and data.
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-dead_strip,-dead_strip_dylibs" )
2017-03-01 05:43:43 -07:00
2021-03-15 11:13:22 -06:00
# Set FMT_EXCEPTIONS = 0, for consistency with -fno-exceptions earlier.
2020-10-14 12:50:38 -06:00
# If we set only -fno-exceptions, fmt fails to compile when included from
# Objective-C++ because fmt tries try to use throw because __EXCEPTIONS is defined.
2021-03-15 11:13:22 -06:00
add_definitions ( -DFMT_EXCEPTIONS=0 )
2020-10-14 12:50:38 -06:00
2011-12-07 00:26:44 -07:00
find_library ( APPKIT_LIBRARY AppKit )
find_library ( APPSERV_LIBRARY ApplicationServices )
find_library ( CARBON_LIBRARY Carbon )
find_library ( COCOA_LIBRARY Cocoa )
2018-03-30 13:43:49 -06:00
find_library ( COREFOUNDATION_LIBRARY CoreFoundation )
2011-12-07 00:26:44 -07:00
find_library ( CORESERV_LIBRARY CoreServices )
2018-03-30 13:43:49 -06:00
find_library ( FORCEFEEDBACK_LIBRARY ForceFeedback )
2016-07-23 13:06:45 -06:00
find_library ( FOUNDATION_LIBRARY Foundation )
2011-12-07 00:26:44 -07:00
find_library ( IOB_LIBRARY IOBluetooth )
find_library ( IOK_LIBRARY IOKit )
2014-10-22 01:25:01 -06:00
find_library ( OPENGL_LIBRARY OpenGL )
2011-02-07 08:51:38 -07:00
endif ( )
2011-12-07 00:26:44 -07:00
2017-01-24 21:51:09 -07:00
if ( ENABLE_LTO )
2021-04-25 17:18:17 -06:00
if ( CMAKE_C_COMPILER_ID MATCHES "MSVC" )
add_compile_options ( /GL )
string ( APPEND CMAKE_EXE_LINKER_FLAGS " /LTCG" )
else ( )
check_and_add_flag ( LTO -flto )
if ( CMAKE_CXX_COMPILER_ID STREQUAL GNU )
set ( CMAKE_AR gcc-ar )
set ( CMAKE_RANLIB gcc-ranlib )
endif ( )
2017-01-24 21:51:09 -07:00
endif ( )
endif ( )
2018-04-05 06:16:08 -06:00
if ( UNIX AND LINUX_LOCAL_DEV )
add_definitions ( -DLINUX_LOCAL_DEV )
2017-01-24 22:25:52 -07:00
endif ( )
2015-11-07 11:50:47 -07:00
2017-01-16 21:41:53 -07:00
# BSDs put packages in /usr/local instead of /usr, so we need to
# force CMake to look in those directories by default, too.
# All commands and submodule commands also need to see these
# changes, so just setting them in the project scope via
# include_directories and link_directories is not sufficient
2017-01-24 22:03:44 -07:00
if ( CMAKE_SYSTEM_NAME MATCHES "FreeBSD|NetBSD" )
2017-01-16 21:41:53 -07:00
set ( CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH};/usr/local" )
set ( CMAKE_REQUIRED_INCLUDES "/usr/local/include" )
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib" )
endif ( )
2015-06-28 19:57:30 -06:00
# Dolphin requires threads.
2017-01-24 01:09:32 -07:00
find_package ( Threads )
2015-06-28 19:57:30 -06:00
2010-11-04 22:19:22 -06:00
if ( NOT CMAKE_BUILD_TYPE )
2010-11-05 17:38:37 -06:00
set ( CMAKE_BUILD_TYPE "Release" CACHE STRING
2017-01-24 19:50:39 -07:00
" B u i l d type ( Release/Debug/RelWithDebInfo/MinSizeRel ) " F O R C E )
2017-01-24 22:25:52 -07:00
endif ( )
2010-11-04 22:19:22 -06:00
2017-01-25 15:32:13 -07:00
if ( ENABLE_GPROF )
check_and_add_flag ( HAVE_PG -pg )
if ( NOT FLAG_C_HAVE_PG )
message ( FATAL_ERROR "Compiler option -pg is not supported" )
2012-12-29 21:48:22 -07:00
endif ( )
2017-01-25 15:32:13 -07:00
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg" )
2017-01-24 22:02:01 -07:00
endif ( )
2010-11-04 20:23:24 -06:00
2010-12-12 22:29:13 -07:00
if ( FASTLOG )
add_definitions ( -DDEBUGFAST )
endif ( )
2018-04-21 10:37:17 -06:00
if ( ENABLE_VTUNE )
set ( VTUNE_DIR "/opt/intel/vtune_amplifier" )
2015-02-11 17:36:29 -07:00
add_definitions ( -DUSE_VTUNE )
include_directories ( "${VTUNE_DIR}/include" )
2015-02-22 12:49:30 -07:00
set ( VTUNE_LIBRARIES
" $ { V T U N E _ D I R } / l i b 6 4 / l i b j i t p r o f i l i n g . a "
" $ { V T U N E _ D I R } / l i b 6 4 / l i b i t t n o t i f y . a "
)
2017-01-24 22:25:52 -07:00
endif ( )
2015-02-11 17:36:29 -07:00
2013-07-13 17:42:04 -06:00
if ( ANDROID )
2017-01-17 13:47:24 -07:00
message ( STATUS "Building for Android" )
2016-02-05 09:54:59 -07:00
if ( NOT ENABLE_HEADLESS )
add_definitions ( -DANDROID )
2018-10-24 02:14:50 -06:00
if ( ENABLE_NOGUI )
message ( STATUS "Building Android app, disabling NoGUI frontend." )
set ( ENABLE_NOGUI 0 )
endif ( )
2016-02-05 09:54:59 -07:00
else ( )
# Lie to cmake a bit. We are cross compiling to Android
# but not as a shared library. We want an executable.
set ( ANDROID 0 )
endif ( )
2013-07-13 17:42:04 -06:00
set ( USE_UPNP 0 )
2018-07-06 16:40:15 -06:00
set ( ENABLE_QT 0 )
2018-06-08 14:56:11 -06:00
set ( USE_DISCORD_PRESENCE 0 )
2017-03-01 05:43:43 -07:00
2016-02-05 09:54:59 -07:00
# We are cross compiling, search only the toolchain for libraries and includes
SET ( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
SET ( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
2017-01-17 13:34:18 -07:00
SET ( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
2016-06-08 11:49:46 -06:00
SET ( CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY )
2013-07-13 17:42:04 -06:00
endif ( )
2016-01-26 06:35:17 -07:00
if ( ENABLE_HEADLESS )
2018-10-03 07:03:36 -06:00
message ( STATUS "Enabling Headless! Disabling GUI." )
2018-07-06 16:40:15 -06:00
set ( ENABLE_QT 0 )
2018-06-08 14:56:11 -06:00
set ( USE_DISCORD_PRESENCE 0 )
2016-01-26 06:35:17 -07:00
endif ( )
2017-01-24 19:51:17 -07:00
# Set file offset size to 64 bits.
#
# On modern Unixes, this is typically already the case. The lone exception is
# glibc, which may default to 32 bits. glibc allows this to be configured
# by setting _FILE_OFFSET_BITS.
if ( NOT CMAKE_SYSTEM_NAME MATCHES "Windows" )
add_definitions ( -D_FILE_OFFSET_BITS=64 )
add_definitions ( -D_LARGEFILE_SOURCE )
endif ( )
2010-12-12 22:29:13 -07:00
2010-11-01 09:47:02 -06:00
########################################
# Dependency checking
#
2011-02-10 19:38:23 -07:00
# TODO: We should have options for dependencies included in the externals to
# override autodetection of system libraries and force the usage of the
# externals.
2013-08-29 04:40:16 -06:00
include ( CheckLib )
include ( CheckCXXSourceRuns )
2013-11-24 15:28:20 -07:00
2019-11-03 04:48:25 -07:00
set ( OpenGL_GL_PREFERENCE GLVND CACHE STRING "Linux-only: if GLVND, use the vendor-neutral GL libraries (default). If LEGACY, use the legacy ones (might be necessary to have optirun/primusrun work)" )
set_property ( CACHE OpenGL_GL_PREFERENCE PROPERTY STRINGS GLVND LEGACY )
2017-01-17 13:32:55 -07:00
find_package ( OpenGL )
2016-02-05 09:54:59 -07:00
if ( OPENGL_GL )
2014-01-17 21:11:59 -07:00
include_directories ( ${ OPENGL_INCLUDE_DIR } )
2016-02-05 09:54:59 -07:00
endif ( )
2014-01-17 21:11:59 -07:00
2018-10-03 07:03:36 -06:00
if ( ENABLE_X11 )
2018-10-14 07:17:31 -06:00
find_package ( X11 )
if ( X11_FOUND )
add_definitions ( -DHAVE_X11=1 )
check_lib ( XRANDR xrandr Xrandr )
if ( XRANDR_FOUND )
add_definitions ( -DHAVE_XRANDR=1 )
endif ( )
pkg_check_modules ( X11_INPUT REQUIRED xi>=1.5.0 )
message ( STATUS "X11 support enabled" )
2016-02-05 09:54:59 -07:00
else ( )
2018-10-14 07:17:31 -06:00
message ( WARNING "X11 support enabled but not found. This build will not support X11." )
2017-01-24 22:25:52 -07:00
endif ( )
2018-10-14 07:17:31 -06:00
endif ( )
2013-07-20 22:43:48 -06:00
2018-10-14 07:17:31 -06:00
if ( ENABLE_EGL )
find_package ( EGL )
if ( EGL_FOUND )
add_definitions ( -DHAVE_EGL=1 )
message ( STATUS "EGL OpenGL interface enabled" )
else ( )
message ( WARNING "EGL support enabled but not found. This build will not support EGL." )
endif ( )
2016-02-05 09:54:59 -07:00
endif ( )
2017-05-22 13:13:19 -06:00
2016-02-05 09:54:59 -07:00
if ( ENCODE_FRAMEDUMPS )
2022-03-23 13:24:35 -06:00
if ( WIN32 )
if ( _M_X86_64 )
set ( FFMPEG_DIR Externals/FFmpeg-bin/x64 )
elseif ( _M_ARM_64 )
set ( FFMPEG_DIR Externals/FFmpeg-bin/ARM64 )
endif ( )
2017-05-22 13:13:19 -06:00
endif ( )
2021-10-01 22:49:25 -06:00
find_package ( FFmpeg COMPONENTS avcodec avformat avutil swresample swscale )
2017-05-22 13:13:19 -06:00
if ( FFmpeg_FOUND )
2022-04-28 11:20:16 -06:00
if ( APPLE )
2021-10-01 22:49:25 -06:00
find_library ( COREMEDIA_LIBRARY CoreMedia )
find_library ( VIDEOTOOLBOX_LIBRARY VideoToolbox )
find_library ( COREVIDEO_LIBRARY CoreVideo )
find_library ( AUDIOTOOLBOX_LIBRARY AudioToolbox )
endif ( )
2017-05-22 13:13:19 -06:00
message ( STATUS "libav/ffmpeg found, enabling AVI frame dumps" )
2017-05-26 01:32:35 -06:00
add_definitions ( -DHAVE_FFMPEG )
2022-04-27 00:11:50 -06:00
if ( WIN32 )
# Our prebuilt binaries depend on Bcrypt
set_property ( TARGET FFmpeg::avutil APPEND PROPERTY
I N T E R F A C E _ L I N K _ L I B R A R I E S " B c r y p t . l i b "
)
endif ( )
2017-05-22 13:13:19 -06:00
else ( )
message ( STATUS "libav/ffmpeg not found, disabling AVI frame dumps" )
2013-02-26 12:49:00 -07:00
endif ( )
2016-02-05 09:54:59 -07:00
endif ( )
2010-11-14 14:14:26 -07:00
2016-02-05 09:54:59 -07:00
if ( OPROFILING )
2017-01-17 13:32:55 -07:00
find_package ( OProfile )
2016-02-05 09:54:59 -07:00
if ( OPROFILE_FOUND )
2017-01-17 13:47:24 -07:00
message ( STATUS "OProfile found, enabling profiling support" )
2016-02-05 09:54:59 -07:00
add_definitions ( -DUSE_OPROFILE=1 )
2011-01-07 22:27:18 -07:00
else ( )
2016-02-05 09:54:59 -07:00
message ( FATAL_ERROR "OProfile not found. Can't build profiling support." )
2011-01-07 22:27:18 -07:00
endif ( )
endif ( )
2012-02-18 01:46:58 -07:00
2015-06-30 05:57:54 -06:00
if ( ENABLE_EVDEV )
2020-09-08 21:24:34 -06:00
find_package ( LIBUDEV REQUIRED )
find_package ( LIBEVDEV REQUIRED )
2015-06-28 18:17:35 -06:00
if ( LIBUDEV_FOUND AND LIBEVDEV_FOUND )
2017-01-17 13:47:24 -07:00
message ( STATUS "libevdev/libudev found, enabling evdev controller backend" )
2015-06-28 18:17:35 -06:00
add_definitions ( -DHAVE_LIBUDEV=1 )
add_definitions ( -DHAVE_LIBEVDEV=1 )
else ( )
2015-06-30 05:57:54 -06:00
message ( FATAL_ERROR "Couldn't find libevdev and/or libudev. Can't build evdev controller backend.\nDisable ENABLE_EVDEV if you wish to build without controller support" )
2015-06-28 18:17:35 -06:00
endif ( )
endif ( )
2015-10-24 21:20:03 -06:00
if ( UNIX )
2017-01-17 13:47:24 -07:00
message ( STATUS "Using named pipes as controller inputs" )
2015-10-24 21:20:03 -06:00
add_definitions ( -DUSE_PIPES=1 )
2019-05-03 13:46:37 -06:00
message ( STATUS "Watching game memory for changes" )
add_definitions ( -DUSE_MEMORYWATCHER=1 )
2015-10-24 21:20:03 -06:00
endif ( )
2016-06-16 18:28:34 -06:00
if ( ENABLE_ANALYTICS )
2017-01-17 13:47:24 -07:00
message ( STATUS "Enabling analytics collection (subject to end-user opt-in)" )
2016-06-16 18:28:34 -06:00
add_definitions ( -DUSE_ANALYTICS=1 )
endif ( )
2022-03-15 16:40:13 -06:00
if ( ENABLE_AUTOUPDATE )
message ( STATUS "Enabling automatic update support" )
add_definitions ( -DAUTOUPDATE=1 )
endif ( )
2010-11-01 09:47:02 -06:00
########################################
# Setup include directories (and make sure they are preferred over the Externals)
#
2014-02-18 04:09:38 -07:00
include_directories ( Source/Core )
2016-01-06 14:35:15 -07:00
if ( ANDROID )
include_directories ( Source/Android )
endif ( )
2014-02-18 04:09:38 -07:00
2010-11-01 09:47:02 -06:00
########################################
# Process externals and setup their include directories
#
# NOTES about adding Externals:
2018-04-08 13:34:33 -06:00
# - If an external provides a target, or one can be introduced with find_package, consider using it.
# - If a target doesn't exist, consider introducing a target for it with add_library and adding all necessary
# includes, definitions, etc, to that target. This way, only libraries that need those attributes simply
# need to link that target in, as opposed to them being provided to every library
# (which is the case with the directory-based include_directories, add_definitions, etc)
#
2010-11-04 22:19:22 -06:00
# - make sure to tell cmake to link them statically or dynamically (most
# should be linked statically)
# - place the CMakeLists.txt in the first-level subdirectory, e.g.
2013-12-11 14:15:55 -07:00
# Externals/zlib/CMakeLists.txt (that is: NOT in some Src/ subdirectory)
2010-11-01 09:47:02 -06:00
#
2018-06-22 16:52:34 -06:00
if ( _M_X86 )
add_subdirectory ( Externals/Bochs_disasm )
endif ( )
2018-04-08 13:34:33 -06:00
add_subdirectory ( Externals/cpp-optparse )
2018-09-03 10:09:23 -06:00
2022-04-23 02:55:22 -06:00
find_package ( fmt 8 )
2019-06-17 08:28:44 -06:00
if ( fmt_FOUND )
message ( STATUS "Using shared fmt ${fmt_VERSION}" )
else ( )
2020-05-10 00:23:02 -06:00
check_vendoring_approved ( fmt )
2019-06-17 08:28:44 -06:00
message ( STATUS "Using static fmt from Externals" )
add_subdirectory ( Externals/fmt EXCLUDE_FROM_ALL )
endif ( )
2018-11-26 03:40:34 -07:00
add_subdirectory ( Externals/imgui )
2018-09-03 10:09:23 -06:00
add_subdirectory ( Externals/glslang )
if ( ENABLE_VULKAN )
2020-10-23 15:47:39 -06:00
add_definitions ( -DHAS_VULKAN )
2021-07-31 17:14:22 -06:00
if ( APPLE )
add_subdirectory ( Externals/MoltenVK )
endif ( )
2018-09-03 10:09:23 -06:00
endif ( )
2018-04-15 10:42:56 -06:00
2020-10-23 15:48:37 -06:00
if ( NOT WIN32 OR ( NOT ( CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" ) ) )
# OpenGL is available on all platforms except windows-arm64
add_definitions ( -DHAS_OPENGL )
endif ( )
2018-05-29 23:34:40 -06:00
find_package ( pugixml )
if ( NOT pugixml_FOUND )
2020-05-10 00:23:02 -06:00
check_vendoring_approved ( pugixml )
2018-04-15 10:42:56 -06:00
message ( STATUS "Using static pugixml from Externals" )
add_subdirectory ( Externals/pugixml )
endif ( )
2017-06-12 04:24:54 -06:00
2016-02-05 09:54:59 -07:00
if ( USE_SHARED_ENET )
2015-06-02 16:00:50 -06:00
check_lib ( ENET libenet enet enet/enet.h QUIET )
2015-06-02 16:28:11 -06:00
include ( CheckSymbolExists )
if ( ENET_FOUND )
set ( CMAKE_REQUIRED_INCLUDES ${ ENET_INCLUDE_DIRS } )
# hack: LDFLAGS already contains -lenet but all flags but the first are
# dropped; ugh, cmake
set ( CMAKE_REQUIRED_FLAGS ${ ENET_LDFLAGS } )
set ( CMAKE_REQUIRED_LIBRARIES ${ ENET_LIBRARIES } )
2018-07-06 11:13:19 -06:00
check_symbol_exists ( enet_socket_get_address enet/enet.h ENET_HAVE_SGA )
2015-06-02 16:28:11 -06:00
set ( CMAKE_REQUIRED_INCLUDES )
set ( CMAKE_REQUIRED_FLAGS )
set ( CMAKE_REQUIRED_LIBRARIES )
if ( NOT ENET_HAVE_SGA )
# enet is too old
set ( ENET_FOUND FALSE )
endif ( )
endif ( )
2015-02-28 18:45:04 -07:00
endif ( )
if ( ENET_FOUND )
2017-01-17 13:47:24 -07:00
message ( STATUS "Using shared enet" )
2015-02-28 18:45:04 -07:00
else ( )
2020-05-10 00:23:02 -06:00
check_vendoring_approved ( enet )
2017-01-17 13:47:24 -07:00
message ( STATUS "Using static enet from Externals" )
2015-02-28 18:45:04 -07:00
include_directories ( Externals/enet/include )
2015-02-15 05:34:44 -07:00
add_subdirectory ( Externals/enet )
endif ( )
2010-11-01 09:47:02 -06:00
2015-01-20 14:43:26 -07:00
if ( NOT XXHASH_FOUND )
2017-01-17 13:47:24 -07:00
message ( STATUS "Using static xxhash from Externals" )
2015-01-20 14:43:26 -07:00
add_subdirectory ( Externals/xxhash )
endif ( )
2019-12-30 06:01:05 -07:00
find_package ( BZip2 )
if ( BZIP2_FOUND )
message ( STATUS "Using shared bzip2" )
else ( )
2020-05-10 00:23:02 -06:00
check_vendoring_approved ( bzip2 )
2019-12-30 06:01:05 -07:00
message ( STATUS "Shared bzip2 not found, falling back to the static library" )
add_subdirectory ( Externals/bzip2 )
endif ( )
2019-12-30 07:07:54 -07:00
# macOS ships with liblzma.dylib but no headers, so check for the headers too
find_package ( LibLZMA )
check_include_file ( lzma.h HAVE_LZMA_H )
if ( LIBLZMA_FOUND AND HAVE_LZMA_H )
message ( STATUS "Using shared lzma" )
else ( )
2020-05-10 00:23:02 -06:00
check_vendoring_approved ( lzma )
2019-12-30 07:07:54 -07:00
if ( LIBLZMA_FOUND AND NOT HAVE_LZMA_H )
message ( STATUS "Shared lzma found but lacks headers, falling back to the static library" )
else ( )
message ( STATUS "Shared lzma not found, falling back to the static library" )
endif ( )
add_subdirectory ( Externals/liblzma )
endif ( )
2020-06-29 15:48:58 -06:00
pkg_check_modules ( ZSTD QUIET libzstd>=1.4.0 )
2021-04-02 12:11:14 -06:00
check_include_file ( zstd.h HAVE_ZSTD_H )
if ( ZSTD_FOUND AND HAVE_ZSTD_H )
2020-06-29 15:48:58 -06:00
message ( STATUS "Using shared zstd version: " ${ ZSTD_VERSION } )
2020-05-03 11:42:12 -06:00
else ( )
check_vendoring_approved ( zstd )
2021-04-02 12:11:14 -06:00
if ( ZSTD_FOUND AND NOT HAVE_ZSTD_H )
message ( STATUS "Shared zstd found but lacks headers, falling back to the static library" )
else ( )
message ( STATUS "Shared zstd not found, falling back to the static library" )
endif ( )
2020-05-03 11:42:12 -06:00
add_subdirectory ( Externals/zstd )
endif ( )
2017-01-17 13:32:55 -07:00
find_package ( ZLIB )
2013-12-23 16:01:34 -07:00
if ( ZLIB_FOUND )
2017-01-17 13:47:24 -07:00
message ( STATUS "Using shared zlib" )
2017-01-24 22:27:05 -07:00
else ( )
2020-05-10 00:23:02 -06:00
check_vendoring_approved ( zlib )
2017-01-17 13:47:24 -07:00
message ( STATUS "Shared zlib not found, falling back to the static library" )
2013-12-23 16:01:34 -07:00
add_subdirectory ( Externals/zlib )
2017-01-24 22:25:52 -07:00
endif ( )
2013-12-23 16:01:34 -07:00
2020-04-28 18:42:02 -06:00
pkg_check_modules ( MINIZIP minizip>=2.0.0 )
2020-03-11 07:57:43 -06:00
if ( MINIZIP_FOUND )
message ( STATUS "Using shared minizip" )
2022-01-16 16:20:40 -07:00
include_directories ( ${ MINIZIP_INCLUDE_DIRS } )
2020-03-11 07:57:43 -06:00
else ( )
2020-05-10 00:23:02 -06:00
check_vendoring_approved ( minizip )
2020-03-11 07:57:43 -06:00
message ( STATUS "Shared minizip not found, falling back to the static library" )
add_subdirectory ( Externals/minizip )
include_directories ( External/minizip )
endif ( )
2017-09-04 23:37:40 -06:00
2016-02-05 09:54:59 -07:00
if ( NOT APPLE )
2015-06-02 16:00:50 -06:00
check_lib ( LZO "(no .pc for lzo2)" lzo2 lzo/lzo1x.h QUIET )
2011-12-18 16:54:45 -07:00
endif ( )
2010-11-18 16:27:27 -07:00
if ( LZO_FOUND )
2017-01-17 13:47:24 -07:00
message ( STATUS "Using shared lzo" )
2010-11-03 20:01:07 -06:00
else ( )
2020-05-10 00:23:02 -06:00
check_vendoring_approved ( lzo )
2017-01-17 13:47:24 -07:00
message ( STATUS "Using static lzo from Externals" )
2010-11-03 20:01:07 -06:00
add_subdirectory ( Externals/LZO )
2011-12-04 21:33:35 -07:00
set ( LZO lzo2 )
2010-11-18 16:27:27 -07:00
endif ( )
2010-11-01 09:47:02 -06:00
2016-02-05 09:54:59 -07:00
if ( NOT APPLE )
2015-06-02 16:00:50 -06:00
check_lib ( PNG libpng png png.h QUIET )
2013-11-14 18:09:38 -07:00
endif ( )
if ( PNG_FOUND )
2017-01-17 13:47:24 -07:00
message ( STATUS "Using shared libpng" )
2013-11-14 18:09:38 -07:00
else ( )
2020-05-10 00:23:02 -06:00
check_vendoring_approved ( libpng )
2017-01-17 13:47:24 -07:00
message ( STATUS "Using static libpng from Externals" )
2013-04-13 14:09:05 -06:00
add_subdirectory ( Externals/libpng )
2013-11-14 18:09:38 -07:00
set ( PNG png )
2013-04-13 14:09:05 -06:00
endif ( )
2017-08-09 13:55:43 -06:00
# Using static FreeSurround from Externals
# There is no system FreeSurround library.
message ( STATUS "Using static FreeSurround from Externals" )
add_subdirectory ( Externals/FreeSurround )
2019-05-08 15:57:47 -06:00
if ( APPLE OR WIN32 )
2019-01-19 15:26:03 -07:00
message ( STATUS "Using ed25519 from Externals" )
add_subdirectory ( Externals/ed25519 )
2020-04-29 04:55:24 -06:00
include_directories ( Externals/ed25519 )
2019-01-19 15:26:03 -07:00
endif ( )
2017-04-10 10:44:17 -06:00
# Using static soundtouch from Externals
# Unable to use system soundtouch library: We require shorts, not floats.
add_subdirectory ( Externals/soundtouch )
2020-04-29 03:30:26 -06:00
include_directories ( Externals/soundtouch )
2013-01-09 09:26:12 -07:00
2020-09-08 21:24:34 -06:00
find_package ( CUBEB )
2018-07-22 12:01:53 -06:00
if ( CUBEB_FOUND )
message ( STATUS "Using the system cubeb" )
else ( )
2020-05-10 00:23:02 -06:00
check_vendoring_approved ( cubeb )
2018-07-22 12:01:53 -06:00
message ( STATUS "Using static cubeb from Externals" )
add_subdirectory ( Externals/cubeb EXCLUDE_FROM_ALL )
endif ( )
2017-03-22 17:09:04 -06:00
2016-09-28 11:32:17 -06:00
if ( NOT ANDROID )
2016-11-20 06:28:40 -07:00
add_definitions ( -D__LIBUSB__ )
if ( NOT APPLE )
find_package ( LibUSB )
endif ( )
if ( LIBUSB_FOUND AND NOT APPLE )
2017-01-17 13:47:24 -07:00
message ( STATUS "Using shared LibUSB" )
2016-11-20 06:28:40 -07:00
include_directories ( ${ LIBUSB_INCLUDE_DIR } )
else ( )
2020-05-10 00:23:02 -06:00
check_vendoring_approved ( libusb )
2017-01-17 13:47:24 -07:00
message ( STATUS "Using static LibUSB from Externals" )
2016-11-20 06:28:40 -07:00
add_subdirectory ( Externals/libusb )
set ( LIBUSB_LIBRARIES usb )
endif ( )
set ( LIBUSB_FOUND true )
2016-09-28 11:32:07 -06:00
endif ( )
2012-12-23 16:58:11 -07:00
2014-11-09 15:30:06 -07:00
set ( SFML_REQD_VERSION 2.1 )
2016-02-05 09:54:59 -07:00
if ( NOT APPLE )
2014-11-09 15:30:06 -07:00
find_package ( SFML ${ SFML_REQD_VERSION } COMPONENTS network system )
2011-12-18 16:54:45 -07:00
endif ( )
2014-11-09 15:30:06 -07:00
if ( SFML_FOUND )
2017-01-17 13:47:24 -07:00
message ( STATUS "Using shared SFML" )
2010-11-03 20:01:07 -06:00
else ( )
2020-05-10 00:23:02 -06:00
check_vendoring_approved ( sfml )
2017-01-17 13:47:24 -07:00
message ( STATUS "Using static SFML ${SFML_REQD_VERSION} from Externals" )
2014-11-09 15:30:06 -07:00
add_definitions ( -DSFML_STATIC )
2013-07-10 20:49:13 -06:00
add_subdirectory ( Externals/SFML )
2014-08-20 07:44:18 -06:00
include_directories ( BEFORE Externals/SFML/include )
2010-11-18 16:27:27 -07:00
endif ( )
2010-11-03 20:01:07 -06:00
2013-07-08 18:13:02 -06:00
if ( USE_UPNP )
2016-02-05 09:54:59 -07:00
if ( NOT APPLE )
2020-09-08 21:24:34 -06:00
find_package ( MINIUPNPC )
2013-07-09 21:07:27 -06:00
endif ( )
2015-10-11 18:26:35 -06:00
if ( MINIUPNPC_FOUND AND MINIUPNPC_API_VERSION GREATER 8 )
2017-01-17 13:47:24 -07:00
message ( STATUS "Using shared miniupnpc" )
2013-07-09 21:07:27 -06:00
else ( )
2020-05-10 00:23:02 -06:00
check_vendoring_approved ( miniupnpc )
2017-01-17 13:47:24 -07:00
message ( STATUS "Using static miniupnpc from Externals" )
2013-07-09 21:07:27 -06:00
add_subdirectory ( Externals/miniupnpc )
endif ( )
2013-07-08 18:13:02 -06:00
add_definitions ( -DUSE_UPNP )
2010-11-18 16:27:27 -07:00
endif ( )
2010-11-03 20:01:07 -06:00
2016-02-05 09:54:59 -07:00
if ( NOT APPLE )
2020-09-08 21:24:34 -06:00
find_package ( MBEDTLS )
2013-09-02 19:07:47 -06:00
endif ( )
2015-09-25 23:09:19 -06:00
if ( MBEDTLS_FOUND )
2017-01-17 13:47:24 -07:00
message ( STATUS "Using shared mbed TLS" )
2015-09-25 23:09:19 -06:00
include_directories ( ${ MBEDTLS_INCLUDE_DIRS } )
2013-09-02 19:07:47 -06:00
else ( )
2020-05-10 00:23:02 -06:00
check_vendoring_approved ( mbedtls )
2017-01-17 13:47:24 -07:00
message ( STATUS "Using static mbed TLS from Externals" )
2015-09-25 23:09:19 -06:00
set ( MBEDTLS_LIBRARIES mbedtls mbedcrypto mbedx509 )
2017-03-19 09:45:38 -06:00
add_subdirectory ( Externals/mbedtls/ EXCLUDE_FROM_ALL )
2015-09-25 23:09:19 -06:00
include_directories ( Externals/mbedtls/include )
2013-09-02 19:07:47 -06:00
endif ( )
2013-08-15 05:36:17 -06:00
2017-01-17 13:32:55 -07:00
find_package ( CURL )
2016-06-16 18:28:34 -06:00
if ( CURL_FOUND )
2017-01-17 13:47:24 -07:00
message ( STATUS "Using shared libcurl" )
2016-06-16 18:28:34 -06:00
include_directories ( ${ CURL_INCLUDE_DIRS } )
else ( )
2020-05-10 00:23:02 -06:00
check_vendoring_approved ( curl )
2017-01-17 13:47:24 -07:00
message ( STATUS "Using static libcurl from Externals" )
2016-06-16 18:28:34 -06:00
add_subdirectory ( Externals/curl )
set ( CURL_LIBRARIES curl )
include_directories ( BEFORE Externals/curl/include )
endif ( )
2017-11-07 08:47:54 -07:00
if ( NOT ANDROID )
2018-07-06 11:24:21 -06:00
find_library ( ICONV_LIBRARIES NAMES iconv libiconv libiconv-2 c )
find_path ( ICONV_INCLUDE_DIR NAMES iconv.h )
2017-11-07 08:47:54 -07:00
endif ( )
2016-02-05 09:54:59 -07:00
2017-11-07 08:47:54 -07:00
if ( NOT ANDROID AND ICONV_LIBRARIES AND ICONV_INCLUDE_DIR )
2016-02-05 09:54:59 -07:00
mark_as_advanced ( ICONV_INCLUDE_DIR ICONV_LIBRARIES )
else ( )
2020-05-10 00:23:02 -06:00
check_vendoring_approved ( iconv )
2017-01-17 13:47:24 -07:00
message ( STATUS "Using static iconv from Externals" )
2013-08-29 03:43:31 -06:00
include_directories ( Externals/libiconv-1.14/include )
add_subdirectory ( Externals/libiconv-1.14 )
2016-02-05 09:54:59 -07:00
set ( ICONV_LIBRARIES iconv )
endif ( )
2016-07-24 09:20:40 -06:00
if ( NOT ANDROID )
find_package ( HIDAPI )
2017-04-24 21:06:39 -06:00
if ( NOT HIDAPI_FOUND )
2020-05-10 00:23:02 -06:00
check_vendoring_approved ( hidapi )
2017-04-24 21:06:39 -06:00
message ( STATUS "Using static HIDAPI from Externals" )
add_subdirectory ( Externals/hidapi EXCLUDE_FROM_ALL )
2017-02-28 17:16:47 -07:00
endif ( )
2016-07-24 09:20:40 -06:00
endif ( )
2018-06-08 14:56:11 -06:00
if ( USE_DISCORD_PRESENCE )
message ( STATUS "Using static DiscordRPC from Externals" )
2020-12-02 20:23:28 -07:00
add_subdirectory ( Externals/discord-rpc EXCLUDE_FROM_ALL )
2020-04-29 03:45:59 -06:00
include_directories ( Externals/discord-rpc/include )
2018-07-06 11:23:26 -06:00
endif ( )
2018-06-08 14:56:11 -06:00
2021-07-04 04:41:46 -06:00
if ( NOT ENABLE_QT )
set ( USE_MGBA 0 )
endif ( )
if ( USE_MGBA )
message ( STATUS "Using static libmgba from Externals" )
add_subdirectory ( Externals/mGBA )
endif ( )
2020-09-08 21:24:34 -06:00
find_package ( SYSTEMD )
2018-03-07 23:00:40 -07:00
if ( SYSTEMD_FOUND )
message ( STATUS "libsystemd found, enabling traversal server watchdog support" )
add_definitions ( -DHAVE_LIBSYSTEMD )
else ( )
message ( STATUS "libsystemd not found, disabling traversal server watchdog support" )
endif ( )
2020-04-29 05:07:51 -06:00
if ( WIN32 )
2021-03-04 01:59:59 -07:00
include_directories ( Externals/WIL/include )
2020-04-29 05:07:51 -06:00
include_directories ( Externals/OpenAL/include )
endif ( )
2020-04-29 03:45:59 -06:00
include_directories ( Externals/picojson )
2020-05-04 16:17:06 -06:00
add_subdirectory ( Externals/rangeset )
2010-11-01 09:47:02 -06:00
########################################
2011-08-21 16:07:19 -06:00
# Pre-build events: Define configuration variables and write SCM info header
2010-11-01 09:47:02 -06:00
#
2013-10-19 18:14:00 -06:00
if ( DOLPHIN_WC_BRANCH STREQUAL "master" OR DOLPHIN_WC_BRANCH STREQUAL "stable" )
set ( DOLPHIN_WC_IS_STABLE "1" )
2011-08-21 15:30:19 -06:00
else ( )
2013-10-19 18:14:00 -06:00
set ( DOLPHIN_WC_IS_STABLE "0" )
2011-08-21 15:30:19 -06:00
endif ( )
2017-02-05 23:26:44 -07:00
configure_file (
" $ { P R O J E C T _ S O U R C E _ D I R } / S o u r c e / C o r e / C o m m o n / s c m r e v . h . i n "
" $ { P R O J E C T _ B I N A R Y _ D I R } / S o u r c e / C o r e / C o m m o n / s c m r e v . h "
)
2016-06-25 21:30:32 -06:00
include_directories ( "${PROJECT_BINARY_DIR}/Source/Core" )
2010-12-19 07:02:43 -07:00
2014-03-02 19:38:46 -07:00
########################################
# Unit testing.
#
2018-12-08 15:06:23 -07:00
if ( ENABLE_TESTS )
message ( STATUS "Using static gtest from Externals" )
2021-04-24 15:12:30 -06:00
# Force gtest to link the C runtime dynamically on Windows in order to avoid runtime mismatches.
set ( gtest_force_shared_crt ON CACHE BOOL "" FORCE )
2018-12-08 15:06:23 -07:00
add_subdirectory ( Externals/gtest EXCLUDE_FROM_ALL )
else ( )
message ( STATUS "Unit tests are disabled" )
endif ( )
2014-03-02 19:38:46 -07:00
2017-05-20 17:21:59 -06:00
########################################
# Process Dolphin source now that all setup is complete
#
2010-11-01 09:47:02 -06:00
add_subdirectory ( Source )
########################################
2010-11-04 07:47:17 -06:00
# Install shared data files
2010-11-01 09:47:02 -06:00
#
2017-02-05 12:16:27 -07:00
if ( NOT CMAKE_SYSTEM_NAME MATCHES "Darwin|Windows" )
install ( DIRECTORY Data/Sys/ DESTINATION ${ datadir } /sys PATTERN )
endif ( )
if ( NOT CMAKE_SYSTEM_NAME MATCHES "Linux|FreeBSD|OpenBSD|Darwin" )
2010-12-12 08:25:03 -07:00
install ( FILES Data/license.txt DESTINATION ${ datadir } )
endif ( )
2017-02-05 12:16:27 -07:00
if ( CMAKE_SYSTEM_NAME MATCHES "Linux|FreeBSD|OpenBSD" )
2013-01-07 15:50:48 -07:00
# Install the application icon and menu item
2016-03-09 08:54:17 -07:00
install ( FILES Data/dolphin-emu.svg
2016-02-18 10:02:54 -07:00
D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ P R E F I X } / 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 )
2016-03-09 08:54:17 -07:00
install ( FILES Data/dolphin-emu.png
2018-03-26 00:13:15 -06:00
D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ P R E F I X } / s h a r e / i c o n s / h i c o l o r / 2 5 6 x 2 5 6 / a p p s )
2016-03-09 08:54:17 -07:00
install ( FILES Data/dolphin-emu.desktop
2013-01-07 15:50:48 -07:00
D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ P R E F I X } / s h a r e / a p p l i c a t i o n s )
2016-03-03 21:21:39 -07:00
# Install manpages
install ( FILES Data/dolphin-emu.6
2016-04-02 14:16:29 -06:00
D E S T I N A T I O N $ { m a n d i r } / m a n 6 )
2016-03-03 21:21:39 -07:00
install ( FILES Data/dolphin-emu-nogui.6
2016-04-02 14:16:29 -06:00
D E S T I N A T I O N $ { m a n d i r } / m a n 6 )
2013-01-07 15:50:48 -07:00
endif ( )
2010-11-01 09:47:02 -06:00
# packaging information
set ( CPACK_PACKAGE_NAME "dolphin-emu" )
set ( CPACK_PACKAGE_VENDOR "Dolphin Team" )
2011-12-11 08:21:17 -07:00
set ( CPACK_PACKAGE_VERSION_MAJOR ${ DOLPHIN_VERSION_MAJOR } )
set ( CPACK_PACKAGE_VERSION_MINOR ${ DOLPHIN_VERSION_MINOR } )
set ( CPACK_PACKAGE_VERSION_PATCH ${ DOLPHIN_VERSION_PATCH } )
2012-12-22 04:51:01 -07:00
set ( CPACK_PACKAGE_DESCRIPTION_FILE ${ PROJECT_SOURCE_DIR } /Data/cpack_package_description.txt )
2016-08-10 11:23:21 -06:00
set ( CPACK_PACKAGE_DESCRIPTION_SUMMARY "A GameCube and Wii emulator" )
2010-11-01 09:47:02 -06:00
2012-12-22 04:51:01 -07:00
set ( CPACK_RPM_PACKAGE_GROUP System/Emulators/Other )
set ( CPACK_RPM_PACKAGE_LICENSE GPL-2.0 )
2010-11-01 09:47:02 -06:00
# TODO: CPACK_RESOURCE_FILE_README
# TODO: CPACK_RESOURCE_FILE_WELCOME
# TODO: CPACK_PACKAGE_ICON
# TODO: CPACK_NSIS_*
# TODO: Use CPack components for DSPSpy, etc => cpack_add_component
2010-11-11 08:50:52 -07:00
2021-10-15 18:29:49 -06:00
# Debian Specific. Install dpkg-dev for automatic deps generation
set ( CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON )
set ( CPACK_DEBIAN_PACKAGE_SECTION "Games" )
2010-12-15 07:47:13 -07:00
set ( CPACK_SET_DESTDIR ON )
set ( CPACK_SOURCE_GENERATOR "TGZ;TBZ2;ZIP" )
2012-12-22 04:51:01 -07:00
set ( CPACK_SOURCE_IGNORE_FILES "\\\\.#;/#;.*~;\\\\.swp;/\\\\.git" )
2010-12-15 07:47:13 -07:00
list ( APPEND CPACK_SOURCE_IGNORE_FILES "${CMAKE_BINARY_DIR}" )
2010-11-11 08:50:52 -07:00
# CPack must be included after the CPACK_* variables are set in order for those
# variables to take effect.
2013-02-26 12:49:00 -07:00
Include ( CPack )