######################################## # General setup # cmake_minimum_required(VERSION 3.5.0) project(dolphin-emu) option(USE_EGL "Enables EGL OpenGL Interface" OFF) option(TRY_X11 "Enables X11 Support" ON) option(USE_SHARED_ENET "Use shared libenet if found rather than Dolphin's soon-to-compatibly-diverge version" OFF) option(USE_SHARED_GTEST "Use shared gtest library if found" OFF) option(USE_UPNP "Enables UPnP port mapping support" ON) option(DISABLE_WX "Disable wxWidgets (use Qt or CLI interface)" OFF) option(ENABLE_QT2 "Enable Qt2 (use the other experimental Qt interface)" OFF) option(ENABLE_PCH "Use PCH to speed up compilation" ON) option(ENABLE_LTO "Enables Link Time Optimization" OFF) option(ENABLE_GENERIC "Enables generic build that should run on any little-endian host" OFF) option(ENABLE_HEADLESS "Enables running Dolphin as a headless variant" OFF) option(ENABLE_ALSA "Enables ALSA sound backend" ON) option(ENABLE_AO "Enables libao sound backend" ON) option(ENABLE_PULSEAUDIO "Enables PulseAudio sound backend" ON) option(ENABLE_OPENAL "Enables OpenAL sound backend" ON) option(ENABLE_LLVM "Enables LLVM support, for disassembly" ON) option(ENABLE_BLUEZ "Enables bluetooth support" ON) # 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) # 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.") # Enable SDL for default on operating systems that aren't OSX, Android, Linux or Windows. if(NOT APPLE AND NOT ANDROID AND NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Linux" AND NOT MSVC) option(ENABLE_SDL "Enables SDL as a generic controller backend" ON) else() option(ENABLE_SDL "Enables SDL as a generic controller backend" OFF) endif() if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux" AND NOT ANDROID) option(ENABLE_EVDEV "Enables the evdev controller backend" ON) endif() if(APPLE) option(OSX_USE_DEFAULT_SEARCH_PATH "Don't prioritize system library paths" OFF) endif() option(ENCODE_FRAMEDUMPS "Encode framedumps in AVI format" ON) option(FASTLOG "Enable all logs" OFF) option(OPROFILING "Enable profiling" OFF) option(GDBSTUB "Enable gdb stub for remote debugging." OFF) if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") option(VTUNE "Enable Intel VTune integration for JIT symbols." OFF) endif() if(APPLE) option(SKIP_POSTPROCESS_BUNDLE "Skip postprocessing bundle for redistributability" OFF) endif() ######################################## # Optional Targets # TODO: Add DSPSpy option(DSPTOOL "Build dsptool" OFF) # Update compiler before calling project() if (APPLE) # Use clang compiler if (NOT DEFINED CMAKE_CXX_COMPILER) set(CMAKE_CXX_COMPILER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++") if (NOT EXISTS "${CMAKE_CXX_COMPILER}") set(CMAKE_CXX_COMPILER "clang++") endif() endif() if (NOT DEFINED CMAKE_C_COMPILER) set(CMAKE_C_COMPILER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang") if (NOT EXISTS "${CMAKE_C_COMPILER}") set(CMAKE_C_COMPILER "clang") endif() endif() # This doesn't play with with the packaging script that doesn't understand @rpath set(CMAKE_MACOSX_RPATH OFF) endif() set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/CMakeTests) # Libraries to link set(LIBS) # Set up paths if(APPLE) # The gettext module will install the translations unconditionally. # Redirect the installation to a build directory where it does no harm. set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/install-dummy) else() set(bindir ${CMAKE_INSTALL_PREFIX}/bin CACHE PATH "bindir") set(datadir ${CMAKE_INSTALL_PREFIX}/share/dolphin-emu CACHE PATH "datadir") set(mandir ${CMAKE_INSTALL_PREFIX}/share/man CACHE PATH "mandir") add_definitions(-DDATA_DIR="${datadir}/") endif() # 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(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") add_definitions(-D_FILE_OFFSET_BITS=64) endif() 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() # 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. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Binaries) # Precompiled header support for MSVC: # Call this after setting the source list (and don't add the source file used # to generate the pch file, this will be done here automatically) function(enable_precompiled_headers PRECOMPILED_HEADER SOURCE_FILE SOURCE_VARIABLE_NAME) if(MSVC) set(files ${${SOURCE_VARIABLE_NAME}}) # Generate precompiled header translation unit get_filename_component(pch_basename ${PRECOMPILED_HEADER} NAME_WE) set(pch_abs ${CMAKE_CURRENT_SOURCE_DIR}/${PRECOMPILED_HEADER}) set(pch_unity ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE_FILE}) set_source_files_properties(${pch_unity} PROPERTIES COMPILE_FLAGS "/Yc\"${pch_abs}\"") # Update properties of source files to use the precompiled header. # Additionally, force the inclusion of the precompiled header at # beginning of each source file. foreach(source_file ${files} ) set_source_files_properties(${source_file} PROPERTIES COMPILE_FLAGS "/Yu\"${pch_abs}\" /FI\"${pch_abs}\"") endforeach(source_file) # Finally, update the source file collection to contain the # precompiled header translation unit set(${SOURCE_VARIABLE_NAME} ${pch_unity} ${${SOURCE_VARIABLE_NAME}} PARENT_SCOPE) endif(MSVC) endfunction(enable_precompiled_headers) # setup CCache include(CCache) # for revision info find_package(Git) if(GIT_FOUND AND NOT DOLPHIN_WC_REVISION) # defines DOLPHIN_WC_REVISION EXECUTE_PROCESS(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse HEAD OUTPUT_VARIABLE DOLPHIN_WC_REVISION OUTPUT_STRIP_TRAILING_WHITESPACE) # defines DOLPHIN_WC_DESCRIBE EXECUTE_PROCESS(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} describe --always --long --dirty OUTPUT_VARIABLE DOLPHIN_WC_DESCRIBE OUTPUT_STRIP_TRAILING_WHITESPACE) # remove hash (and trailing "-0" if needed) from description STRING(REGEX REPLACE "(-0)?-[^-]+((-dirty)?)$" "\\2" DOLPHIN_WC_DESCRIBE "${DOLPHIN_WC_DESCRIBE}") # defines DOLPHIN_WC_BRANCH EXECUTE_PROCESS(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD OUTPUT_VARIABLE DOLPHIN_WC_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE) endif() # version number set(DOLPHIN_VERSION_MAJOR "5") set(DOLPHIN_VERSION_MINOR "0") if(DOLPHIN_WC_BRANCH STREQUAL "stable") set(DOLPHIN_VERSION_PATCH "0") else() set(DOLPHIN_VERSION_PATCH ${DOLPHIN_WC_REVISION}) endif() # 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() # Architecture detection and arch specific settings message(STATUS "Detected architecture: ${CMAKE_SYSTEM_PROCESSOR}") # 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() include(CheckCCompilerFlag) if(ENABLE_GENERIC) message(STATUS "Warning! Building generic build!") set(_M_GENERIC 1) add_definitions(-D_M_GENERIC=1) elseif(_ARCH_64 AND ( ${CMAKE_SYSTEM_PROCESSOR} MATCHES "^x86" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "i.86" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "amd64" OR APPLE )) set(_M_X86 1) set(_M_X86_64 1) add_definitions(-D_M_X86=1 -D_M_X86_64=1 -msse2) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fno-pie") if(CMAKE_CXX_COMPILER_ID STREQUAL GNU) CHECK_C_COMPILER_FLAG("-no-pie" NO_PIE_UPSTREAM) if(NO_PIE_UPSTREAM) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -no-pie") endif() CHECK_C_COMPILER_FLAG("-nopie" NO_PIE_PATCHED) if(NO_PIE_PATCHED) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -nopie") endif() endif() elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") set(_M_ARM 1) set(_M_ARM_64 1) add_definitions(-D_M_ARM=1 -D_M_ARM_64=1) add_definitions(-march=armv8-a+crc) else() message(FATAL_ERROR "You're building on an unsupported platform. Enable generic build if you really want a JIT-less binary.") endif() include(CheckCXXCompilerFlag) macro(check_and_add_flag var flag) CHECK_CXX_COMPILER_FLAG(${flag} FLAG_${var}) if(FLAG_${var}) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") endif() endmacro() # Enforce minimum GCC version if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0) message(FATAL_ERROR "Dolphin requires at least GCC 5.0 (found ${CMAKE_CXX_COMPILER_VERSION})") endif() # Enabling all warnings in MSVC spams too much if(NOT MSVC) add_definitions(-Wall) add_definitions(-D_DEFAULT_SOURCE) # TODO: would like these but they produce overwhelming amounts of warnings #check_and_add_flag(EXTRA -Wextra) #check_and_add_flag(MISSING_FIELD_INITIALIZERS -Wmissing-field-initializers) #check_and_add_flag(SWITCH_DEFAULT -Wswitch-default) #check_and_add_flag(FLOAT_EQUAL -Wfloat-equal) #check_and_add_flag(CONVERSION -Wconversion) #check_and_add_flag(ZERO_AS_NULL_POINTER_CONSTANT -Wzero-as-null-pointer-constant) check_and_add_flag(TYPE_LIMITS -Wtype-limits) check_and_add_flag(SIGN_COMPARE -Wsign-compare) check_and_add_flag(IGNORED_QUALIFIERS -Wignored-qualifiers) check_and_add_flag(UNINITIALIZED -Wuninitialized) check_and_add_flag(LOGICAL_OP -Wlogical-op) check_and_add_flag(SHADOW -Wshadow) check_and_add_flag(INIT_SELF -Winit-self) check_and_add_flag(MISSING_DECLARATIONS -Wmissing-declarations) check_and_add_flag(MISSING_VARIABLE_DECLARATIONS -Wmissing-variable-declarations) endif(NOT MSVC) # gcc uses some optimizations which might break stuff without this flag add_definitions(-fno-strict-aliasing -fno-exceptions) check_and_add_flag(VISIBILITY_INLINES_HIDDEN -fvisibility-inlines-hidden) if(UNIX AND NOT APPLE) check_and_add_flag(VISIBILITY_HIDDEN -fvisibility=hidden) endif() if(ENABLE_LTO) check_and_add_flag(LTO -flto) if(CMAKE_CXX_COMPILER_ID STREQUAL GNU) set(CMAKE_AR gcc-ar) set(CMAKE_RANLIB gcc-ranlib) endif() endif() if(APPLE) if(NOT OSX_USE_DEFAULT_SEARCH_PATH) # 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 # 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... # See http://www.cmake.org/cmake/help/v3.0/command/find_program.html set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH};/usr") endif() # Identify the target system: # Ask for 64-bit binary. set(TARGET_FLAGS "-arch x86_64") # Minimum OS X version. # This is inserted into the Info.plist as well. # Note that the SDK determines the maximum version of which optional # features can be used, not the minimum required version to run. set(OSX_MIN_VERSION "10.9") set(TARGET_FLAGS "${TARGET_FLAGS} -mmacosx-version-min=${OSX_MIN_VERSION}") # Do not warn about frameworks that are not available on all architectures. # This avoids a warning when linking with QuickTime. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-no_arch_warnings") # Specify target CPUs. set(TARGET_FLAGS "${TARGET_FLAGS} -mssse3") set(TARGET_FLAGS "${TARGET_FLAGS} -march=core2") # Target flags apply to both C and C++ compilation. # CMake passes these to the compiler on the link command line as well. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${TARGET_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TARGET_FLAGS}") # Linker flags. # Drop unreachable code and data. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-dead_strip,-dead_strip_dylibs") # Reserve the minimum size for the zero page. # Our JIT requires virtual memory space below 2GB, while the default zero # page on x86_64 is 4GB in size. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-pagezero_size,0x1000") find_library(APPKIT_LIBRARY AppKit) find_library(APPSERV_LIBRARY ApplicationServices) find_library(ATB_LIBRARY AudioToolbox) find_library(AU_LIBRARY AudioUnit) find_library(CARBON_LIBRARY Carbon) find_library(COCOA_LIBRARY Cocoa) find_library(COREAUDIO_LIBRARY CoreAudio) find_library(COREFUND_LIBRARY CoreFoundation) find_library(CORESERV_LIBRARY CoreServices) find_library(FOUNDATION_LIBRARY Foundation) find_library(IOB_LIBRARY IOBluetooth) find_library(IOK_LIBRARY IOKit) find_library(QUICKTIME_LIBRARY QuickTime) find_library(WEBKIT_LIBRARY WebKit) find_library(FORCEFEEDBACK ForceFeedback) find_library(OPENGL_LIBRARY OpenGL) endif() if(WIN32) add_definitions(-D_SECURE_SCL=0) add_definitions(-D_CRT_SECURE_NO_WARNINGS) add_definitions(-D_CRT_SECURE_NO_DEPRECATE) endif(WIN32) # Add an option to build relocatable binaries on Linux # The Sys folder will need to be copied to the Binaries folder. if(UNIX) option(LINUX_LOCAL_DEV "Enable relocatable binary" OFF) if(LINUX_LOCAL_DEV) add_definitions('-DLINUX_LOCAL_DEV') endif(LINUX_LOCAL_DEV) endif(UNIX) # 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 if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD|NetBSD") 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() # Dolphin requires threads. # The Apple build may not need an explicit flag because one of the # frameworks may already provide it. # But for non-OSX systems, we will use the CMake Threads package. IF(NOT APPLE) FIND_PACKAGE(Threads) ENDIF(NOT APPLE) if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type (Release/Debug/RelWithDebInfo/MinSizeRe)" FORCE) endif(NOT CMAKE_BUILD_TYPE) if(CMAKE_BUILD_TYPE STREQUAL Debug) add_definitions(-D_DEBUG -ggdb) set(wxWidgets_USE_DEBUG ON CACHE BOOL "Use wxWidgets Debugging") option(ENABLE_GPROF "Enable gprof profiling (must be using Debug build)" OFF) if(ENABLE_GPROF) add_definitions(-pg) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg") endif() endif(CMAKE_BUILD_TYPE STREQUAL Debug) if(CMAKE_BUILD_TYPE STREQUAL Release AND NOT APPLE) add_definitions(-fomit-frame-pointer) endif() if(FASTLOG) add_definitions(-DDEBUGFAST) endif() if(GDBSTUB) add_definitions(-DUSE_GDBSTUB) endif(GDBSTUB) if(VTUNE) if(EXISTS "$ENV{VTUNE_AMPLIFIER_XE_2015_DIR}") set(VTUNE_DIR "$ENV{VTUNE_AMPLIFIER_XE_2015_DIR}") elseif(EXISTS "$ENV{VTUNE_AMPLIFIER_XE_2013_DIR}") set(VTUNE_DIR "$ENV{VTUNE_AMPLIFIER_XE_2013_DIR}") else() message(ERROR "Could find neither VTUNE_AMPLIFIER_XE_2015_DIR nor VTUNE_AMPLIFIER_XE_2013_DIR.") endif() add_definitions(-DUSE_VTUNE) include_directories("${VTUNE_DIR}/include") set(VTUNE_LIBRARIES "${VTUNE_DIR}/lib64/libjitprofiling.a" "${VTUNE_DIR}/lib64/libittnotify.a" ) endif(VTUNE) if(ANDROID) message(STATUS "Building for Android") if(NOT ENABLE_HEADLESS) add_definitions(-DANDROID) 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() set(USE_X11 0) set(USE_UPNP 0) set(USE_EGL 1) set(DISABLE_WX 1) set(ENABLE_QT2 0) # 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) SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) elseif(NOT APPLE AND NOT CMAKE_SYSTEM_NAME MATCHES OpenBSD) list(APPEND LIBS rt) endif() if(ENABLE_HEADLESS) message(STATUS "Enabling Headless! Disabling GUI, force enabling EGL!") set(USE_X11 0) set(USE_EGL 1) set(DISABLE_WX 1) set(ENABLE_QT2 0) add_definitions(-DUSE_HEADLESS) endif() add_definitions(-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE) ######################################## # Dependency checking # # TODO: We should have options for dependencies included in the externals to # override autodetection of system libraries and force the usage of the # externals. include(CheckLib) include(CheckCXXSourceRuns) find_package(OpenGL) if (OPENGL_GL) include_directories(${OPENGL_INCLUDE_DIR}) endif() if(ENABLE_ALSA) find_package(ALSA) if(ALSA_FOUND) add_definitions(-DHAVE_ALSA=1) message(STATUS "ALSA found, enabling ALSA sound backend") else() add_definitions(-DHAVE_ALSA=0) message(STATUS "ALSA NOT found, disabling ALSA sound backend") endif() else() message(STATUS "ALSA explicitly disabled, disabling ALSA sound backend") endif() if(ENABLE_AO) check_lib(AO ao ao QUIET) if(AO_FOUND) add_definitions(-DHAVE_AO=1) message(STATUS "ao found, enabling ao sound backend") else() add_definitions(-DHAVE_AO=0) message(STATUS "ao NOT found, disabling ao sound backend") endif() else() message(STATUS "ao explicitly disabled, disabling ao sound backend") endif() if(ENABLE_BLUEZ) check_lib(BLUEZ bluez bluez QUIET) if(BLUEZ_FOUND) add_definitions(-DHAVE_BLUEZ=1) message(STATUS "bluez found, enabling bluetooth support") else() add_definitions(-DHAVE_BLUEZ=0) message(STATUS "bluez NOT found, disabling bluetooth support") endif() else() message(STATUS "bluez explicitly disabled, disabling bluetooth support") endif() if(ENABLE_PULSEAUDIO) check_lib(PULSEAUDIO libpulse pulse QUIET) if(PULSEAUDIO_FOUND) add_definitions(-DHAVE_PULSEAUDIO=1) message(STATUS "PulseAudio found, enabling PulseAudio sound backend") else() add_definitions(-DHAVE_PULSEAUDIO=0) message(STATUS "PulseAudio NOT found, disabling PulseAudio sound backend") endif() else() message(STATUS "PulseAudio explicitly disabled, disabling PulseAudio sound backend") endif() if(ENABLE_OPENAL) find_package(OpenAL) if(OPENAL_FOUND) add_definitions(-DHAVE_OPENAL=1) include_directories(${OPENAL_INCLUDE_DIR}) message(STATUS "OpenAL found, enabling OpenAL sound backend") else() add_definitions(-DHAVE_OPENAL=0) message(STATUS "OpenAL NOT found, disabling OpenAL sound backend") endif() else() message(STATUS "OpenAL explicitly disabled, disabling OpenAL sound backend") endif() if(ENABLE_LLVM) find_package(LLVM) if (LLVM_FOUND) add_definitions(-DHAS_LLVM=1) set(HAS_LLVM 1) include_directories(${LLVM_INCLUDE_DIRS}) list(APPEND LIBS ${LLVM_LIBRARIES}) message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") endif() endif() set(USE_X11 0) if(UNIX AND NOT APPLE AND NOT ANDROID AND NOT ENABLE_HEADLESS) find_package(X11) if(TRY_X11 AND X11_FOUND) set(USE_X11 1) add_definitions(-DHAVE_X11=1) include_directories(${X11_INCLUDE_DIR}) message(STATUS "X11 support enabled") else() set(USE_X11 0) SET(X11_FOUND "") message(STATUS "X11 support disabled") add_definitions(-DHAVE_X11=0) endif(TRY_X11 AND X11_FOUND) if (NOT USE_X11) message(FATAL_ERROR "\n" "No suitable display platform found\n" "Requires x11 to run") endif() endif() if(USE_X11) check_lib(XRANDR xrandr Xrandr) if(XRANDR_FOUND) add_definitions(-DHAVE_XRANDR=1) else() add_definitions(-DHAVE_XRANDR=0) endif(XRANDR_FOUND) pkg_check_modules(XINPUT2 REQUIRED xi>=1.5.0) endif() if(ENCODE_FRAMEDUMPS) check_libav() if(LIBAV_FOUND) LIST(APPEND LIBS ${LIBAV_LDFLAGS}) endif() endif() if(NOT ANDROID) set(PORTAUDIO_FOUND TRUE) add_definitions(-DHAVE_PORTAUDIO=1) if(NOT APPLE) set(CMAKE_REQUIRED_LIBRARIES portaudio) CHECK_CXX_SOURCE_RUNS( "#include int main(int argc, char **argv) { if(Pa_GetVersion() >= 1890) return 0; else return 1; }" SYSTEM_PORTAUDIO) unset(CMAKE_REQUIRED_LIBRARIES) endif() if(SYSTEM_PORTAUDIO AND NOT APPLE) message(STATUS "Using shared PortAudio for mic support") set(PORTAUDIO_LIBRARIES portaudio) else() message(STATUS "Using static PortAudio from Externals for mic support") add_subdirectory(Externals/portaudio) set(PORTAUDIO_LIBRARIES portaudio_static) endif() endif() if(OPROFILING) find_package(OProfile) if(OPROFILE_FOUND) message(STATUS "OProfile found, enabling profiling support") add_definitions(-DUSE_OPROFILE=1) include_directories(${OPROFILE_INCLUDE_DIRS}) else() message(FATAL_ERROR "OProfile not found. Can't build profiling support.") endif() endif() if(USE_EGL) message(STATUS "EGL OpenGL interface enabled") add_definitions(-DUSE_EGL=1) endif() if(ENABLE_EVDEV) find_package(Libudev REQUIRED) find_package(Libevdev REQUIRED) if(LIBUDEV_FOUND AND LIBEVDEV_FOUND) message(STATUS "libevdev/libudev found, enabling evdev controller backend") add_definitions(-DHAVE_LIBUDEV=1) add_definitions(-DHAVE_LIBEVDEV=1) include_directories(${LIBUDEV_INCLUDE_DIR} ${LIBEVDEV_INCLUDE_DIR}) else() 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") endif() endif() if(UNIX) message(STATUS "Using named pipes as controller inputs") add_definitions(-DUSE_PIPES=1) message(STATUS "Watching game memory for changes") add_definitions(-DUSE_MEMORYWATCHER=1) endif() if(ENABLE_ANALYTICS) message(STATUS "Enabling analytics collection (subject to end-user opt-in)") add_definitions(-DUSE_ANALYTICS=1) endif() ######################################## # Setup include directories (and make sure they are preferred over the Externals) # include_directories(Source/Core) if(ANDROID) include_directories(Source/Android) endif() ######################################## # Process externals and setup their include directories # # NOTES about adding Externals: # - add the include directory here # - 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. # Externals/zlib/CMakeLists.txt (that is: NOT in some Src/ subdirectory) # add_subdirectory(Externals/Bochs_disasm) include_directories(Externals/Bochs_disasm) add_subdirectory(Externals/glslang) if(USE_SHARED_ENET) check_lib(ENET libenet enet enet/enet.h QUIET) 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}) CHECK_SYMBOL_EXISTS(enet_socket_get_address enet/enet.h ENET_HAVE_SGA) 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() endif() if (ENET_FOUND) message(STATUS "Using shared enet") else() message(STATUS "Using static enet from Externals") include_directories(Externals/enet/include) add_subdirectory(Externals/enet) endif() LIST(APPEND LIBS enet) if(NOT XXHASH_FOUND) message(STATUS "Using static xxhash from Externals") add_subdirectory(Externals/xxhash) include_directories(Externals/xxhash) endif() LIST(APPEND LIBS xxhash) find_package(ZLIB) if(ZLIB_FOUND) message(STATUS "Using shared zlib") include_directories(${ZLIB_INCLUDE_DIRS}) else(ZLIB_FOUND) message(STATUS "Shared zlib not found, falling back to the static library") add_subdirectory(Externals/zlib) include_directories(Externals/zlib) endif(ZLIB_FOUND) if(NOT APPLE) check_lib(LZO "(no .pc for lzo2)" lzo2 lzo/lzo1x.h QUIET) endif() if(LZO_FOUND) message(STATUS "Using shared lzo") else() message(STATUS "Using static lzo from Externals") add_subdirectory(Externals/LZO) include_directories(Externals/LZO) set(LZO lzo2) endif() list(APPEND LIBS ${LZO}) if(NOT APPLE) check_lib(PNG libpng png png.h QUIET) endif() if (PNG_FOUND) message(STATUS "Using shared libpng") else() message(STATUS "Using static libpng from Externals") add_subdirectory(Externals/libpng) include_directories(Externals/libpng) set(PNG png) endif() if(OPENAL_FOUND) if(NOT APPLE) check_lib(SOUNDTOUCH soundtouch SoundTouch soundtouch/SoundTouch.h QUIET) endif() if (SOUNDTOUCH_FOUND) message(STATUS "Using shared soundtouch") else() message(STATUS "Using static soundtouch from Externals") add_subdirectory(Externals/soundtouch) include_directories(Externals) endif() endif() if(ENABLE_SDL) find_package(SDL2) if(SDL2_FOUND) message(STATUS "Using shared SDL2") add_definitions(-DHAVE_SDL=1) include_directories(${SDL2_INCLUDE_DIR}) else(SDL2_FOUND) # SDL2 not found, try SDL find_package(SDL OPTIONAL) if(SDL_FOUND) message(STATUS "Using shared SDL") add_definitions(-DHAVE_SDL=1) include_directories(${SDL_INCLUDE_DIR}) else(SDL_FOUND) message(STATUS "SDL NOT found, disabling SDL input") endif(SDL_FOUND) endif(SDL2_FOUND) endif() if(NOT ANDROID) add_definitions(-D__LIBUSB__) if(NOT APPLE) find_package(LibUSB) endif() if(LIBUSB_FOUND AND NOT APPLE) message(STATUS "Using shared LibUSB") include_directories(${LIBUSB_INCLUDE_DIR}) else() message(STATUS "Using static LibUSB from Externals") add_subdirectory(Externals/libusb) set(LIBUSB_LIBRARIES usb) endif() set(LIBUSB_FOUND true) endif() set(SFML_REQD_VERSION 2.1) if(NOT APPLE) find_package(SFML ${SFML_REQD_VERSION} COMPONENTS network system) endif() if(SFML_FOUND) message(STATUS "Using shared SFML") else() message(STATUS "Using static SFML ${SFML_REQD_VERSION} from Externals") add_definitions(-DSFML_STATIC) add_subdirectory(Externals/SFML) include_directories(BEFORE Externals/SFML/include) endif() if(USE_UPNP) if(NOT APPLE) find_package(Miniupnpc) endif() if(MINIUPNPC_FOUND AND MINIUPNPC_API_VERSION GREATER 8) message(STATUS "Using shared miniupnpc") else() message(STATUS "Using static miniupnpc from Externals") add_subdirectory(Externals/miniupnpc) set(MINIUPNPC_INCLUDE_DIRS Externals/miniupnpc/src) set(MINIUPNPC_LIBRARIES miniupnpc) endif() add_definitions(-DUSE_UPNP) include_directories(${MINIUPNPC_INCLUDE_DIRS}) list(APPEND LIBS ${MINIUPNPC_LIBRARIES}) endif() if(NOT APPLE) find_package(MbedTLS) endif() if(MBEDTLS_FOUND) message(STATUS "Using shared mbed TLS") include_directories(${MBEDTLS_INCLUDE_DIRS}) else() message(STATUS "Using static mbed TLS from Externals") set(MBEDTLS_LIBRARIES mbedtls mbedcrypto mbedx509) add_subdirectory(Externals/mbedtls/) include_directories(Externals/mbedtls/include) endif() find_package(CURL) if(CURL_FOUND) message(STATUS "Using shared libcurl") include_directories(${CURL_INCLUDE_DIRS}) else() message(STATUS "Using static libcurl from Externals") add_subdirectory(Externals/curl) set(CURL_LIBRARIES curl) include_directories(BEFORE Externals/curl/include) endif() if(NOT APPLE) check_lib(SOIL "(no .pc for SOIL)" SOIL SOIL/SOIL.h QUIET) endif() if(SOIL_FOUND) message(STATUS "Using shared SOIL") else() message(STATUS "Using static SOIL from Externals") add_subdirectory(Externals/SOIL) include_directories(Externals/SOIL) endif() find_library(ICONV_LIBRARIES NAMES iconv libiconv libiconv-2 c) find_path(ICONV_INCLUDE_DIR NAMES iconv.h) if (ICONV_LIBRARIES AND ICONV_INCLUDE_DIR) mark_as_advanced(ICONV_INCLUDE_DIR ICONV_LIBRARIES) else() message(STATUS "Using static iconv from Externals") include_directories(Externals/libiconv-1.14/include) add_subdirectory(Externals/libiconv-1.14) set(ICONV_LIBRARIES iconv) endif() list(APPEND LIBS ${ICONV_LIBRARIES}) if(NOT ANDROID) find_package(HIDAPI) if(HIDAPI_FOUND) message(STATUS "Using shared ${HIDAPI_LIBRARIES} ${HIDAPI_VERSION}") include_directories(${HIDAPI_INCLUDE_DIRS}) list(APPEND LIBS ${HIDAPI_LIBRARIES}) else() include_directories(Externals/hidapi/hidapi) if(APPLE) message(STATUS "Using static hidapi from Externals") add_subdirectory(Externals/hidapi/mac) list(APPEND LIBS hidapi) elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") message(STATUS "Using static hidapi-hidraw from Externals") add_subdirectory(Externals/hidapi/linux) list(APPEND LIBS hidapi-hidraw udev) else() message(STATUS "Using static hidapi-libusb from Externals") add_subdirectory(Externals/hidapi/libusb) list(APPEND LIBS hidapi-libusb) endif() endif() set(HIDAPI_FOUND 1) add_definitions(-DHAVE_HIDAPI=1) endif() find_library(OPENSLES_LIBRARIES NAMES OpenSLES) find_path(OPENSLES_INCLUDE_DIR NAMES SLES/OpenSLES.h) if (OPENSLES_LIBRARIES AND OPENSLES_INCLUDE_DIR) set(OPENSLES_FOUND 1) add_definitions(-DHAVE_OPENSLES=1) include_directories(${OPENSLES_INCLUDE_DIR}) message(STATUS "OpenSLES found, enabling OpenSLES sound backend") endif() if(ENABLE_QT2) find_package(Qt5Widgets REQUIRED) message(STATUS "Found Qt version ${Qt5Core_VERSION}, enabling the Qt backend") endif() if(NOT DISABLE_WX) find_package(wxWidgets COMPONENTS core aui adv) if(_ARCH_32) add_definitions(-DwxSIZE_T_IS_UINT) endif() if(wxWidgets_FOUND) EXECUTE_PROCESS(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}" ${wxWidgets_CONFIG_OPTIONS} --version OUTPUT_VARIABLE wxWidgets_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET ) message(STATUS "Found wxWidgets version ${wxWidgets_VERSION}") set(wxMIN_VERSION "3.1.0") if(${wxWidgets_VERSION} VERSION_LESS ${wxMIN_VERSION}) message(STATUS "At least ${wxMIN_VERSION} is required; ignoring found version") unset(wxWidgets_FOUND) endif() endif(wxWidgets_FOUND) if(UNIX AND NOT APPLE) # There is a bug in the FindGTK module in cmake version 2.8.2 that # does not find gdk-pixbuf-2.0. On the other hand some 2.8.3 # users have complained that pkg-config does not find # gdk-pixbuf-2.0. On yet another hand, cmake version 2.8.3 in # Ubuntu Natty does not find the glib libraries correctly. # Ugly!!! execute_process(COMMAND lsb_release -c -s OUTPUT_VARIABLE DIST_NAME ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) if(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} VERSION_EQUAL 2.8.2 OR "${DIST_NAME}" STREQUAL "natty") check_lib(GTK2 gtk+-2.0 gtk+-2.0 gtk.h REQUIRED) else() find_package(GTK2) if(GTK2_FOUND) include_directories(${GTK2_INCLUDE_DIRS}) list(APPEND LIBS ${GTK2_LIBRARIES}) else() message(FATAL_ERROR "GTK is required to build the WX UI. Please install the GTK development libraries.") endif() endif() endif() if(wxWidgets_FOUND) include(${wxWidgets_USE_FILE}) message(STATUS "wxWidgets found, enabling GUI build") else(wxWidgets_FOUND) message(STATUS "Using static wxWidgets from Externals") # These definitions and includes are used when building dolphin against wx, # not when building wx itself (see wxw3 CMakeLists.txt for that) if(APPLE) add_definitions(-D__WXOSX_COCOA__) elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux|FreeBSD") add_definitions(-D__WXGTK__) # Check for required libs check_lib(GTHREAD2 gthread-2.0 gthread-2.0 glib/gthread.h REQUIRED) check_lib(PANGOCAIRO pangocairo pangocairo pango/pangocairo.h REQUIRED) # On Linux "backtrace" is part of glibc. FreeBSD has a separate library. # Required for wxUSE_STACKWALKER in Externals/wxWidgets3/wx/wxgtk.h find_package(Backtrace REQUIRED) elseif(WIN32) add_definitions(-D__WXMSW__) else() message(FATAL_ERROR "wxWidgets in Externals is not compatible with your platform") endif() include_directories(SYSTEM Externals/wxWidgets3 Externals/wxWidgets3/include) add_subdirectory(Externals/wxWidgets3) set(wxWidgets_FOUND TRUE) set(wxWidgets_LIBRARIES "wx") endif(wxWidgets_FOUND) add_definitions(-DHAVE_WX=1) endif(NOT DISABLE_WX) if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD|NetBSD") set(LIBS ${LIBS} usbhid) endif() if(APPLE) # Link against OS X system frameworks. list(APPEND LIBS ${APPKIT_LIBRARY} ${AU_LIBRARY} ${COREAUDIO_LIBRARY} ${COREFUND_LIBRARY} ${CORESERV_LIBRARY} ${IOK_LIBRARY} ${FORCEFEEDBACK} ) endif() ######################################## # Pre-build events: Define configuration variables and write SCM info header # if(DOLPHIN_WC_BRANCH STREQUAL "master" OR DOLPHIN_WC_BRANCH STREQUAL "stable") set(DOLPHIN_WC_IS_STABLE "1") else() set(DOLPHIN_WC_IS_STABLE "0") endif() file(WRITE ${PROJECT_BINARY_DIR}/Source/Core/Common/scmrev.h "#define SCM_REV_STR \"" ${DOLPHIN_WC_REVISION} "\"\n" "#define SCM_DESC_STR \"" ${DOLPHIN_WC_DESCRIBE} "\"\n" "#define SCM_BRANCH_STR \"" ${DOLPHIN_WC_BRANCH} "\"\n" "#define SCM_IS_MASTER " ${DOLPHIN_WC_IS_STABLE} "\n" "#define SCM_DISTRIBUTOR_STR \"" ${DISTRIBUTOR} "\"\n" ) include_directories("${PROJECT_BINARY_DIR}/Source/Core") ######################################## # Unit testing. # find_package(GTest) if(GTEST_FOUND AND USE_SHARED_GTEST) message(STATUS "Using shared gtest") include_directories(${GTEST_INCLUDE_DIRS}) else() message(STATUS "Using static gtest from Externals") include_directories(Externals/gtest/include) add_subdirectory(Externals/gtest) endif() enable_testing() add_custom_target(unittests) add_custom_command(TARGET unittests POST_BUILD COMMAND ${CMAKE_CTEST_COMMAND}) ######################################## # Start compiling our code # add_definitions(-std=c++1y) # These aren't actually needed for C11/C++11 # but some dependencies require them (LLVM, libav). add_definitions(-D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS) add_subdirectory(Source) ######################################## # Install shared data files # if(NOT APPLE) install(DIRECTORY Data/Sys/ DESTINATION ${datadir}/sys PATTERN) endif() if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Linux|FreeBSD|OpenBSD|Darwin") install(FILES Data/license.txt DESTINATION ${datadir}) endif() if(${CMAKE_SYSTEM_NAME} MATCHES "Linux|FreeBSD|OpenBSD") # Install the application icon and menu item install(FILES Data/dolphin-emu.svg DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps) install(FILES Data/dolphin-emu.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/48x48/apps) install(FILES Data/dolphin-emu.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications) # Install manpages install(FILES Data/dolphin-emu.6 DESTINATION ${mandir}/man6) install(FILES Data/dolphin-emu-nogui.6 DESTINATION ${mandir}/man6) endif() # packaging information set(CPACK_PACKAGE_NAME "dolphin-emu") set(CPACK_PACKAGE_VENDOR "Dolphin Team") set(CPACK_PACKAGE_VERSION_MAJOR ${DOLPHIN_VERSION_MAJOR}) set(CPACK_PACKAGE_VERSION_MINOR ${DOLPHIN_VERSION_MINOR}) set(CPACK_PACKAGE_VERSION_PATCH ${DOLPHIN_VERSION_PATCH}) set(CPACK_PACKAGE_DESCRIPTION_FILE ${PROJECT_SOURCE_DIR}/Data/cpack_package_description.txt) set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A GameCube and Wii emulator") set(CPACK_RPM_PACKAGE_GROUP System/Emulators/Other) set(CPACK_RPM_PACKAGE_LICENSE GPL-2.0) # 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 set(CPACK_SET_DESTDIR ON) set(CPACK_SOURCE_GENERATOR "TGZ;TBZ2;ZIP") set(CPACK_SOURCE_IGNORE_FILES "\\\\.#;/#;.*~;\\\\.swp;/\\\\.git") list(APPEND CPACK_SOURCE_IGNORE_FILES "${CMAKE_BINARY_DIR}") # CPack must be included after the CPACK_* variables are set in order for those # variables to take effect. Include(CPack)