mirror of
https://github.com/RetroDECK/ES-DE.git
synced 2024-11-29 09:35:39 +00:00
11e98042f4
a95e013b9 Stringify NaN, Inf as null if needs 973dc9c06 Avoid ptrdiff between pointers to different allocations 2a1f586ba Check for __GNUC__ definition 0e88d5e40 Eliminate missing prototypes warning 949c771b0 Resolve conflict with Windows header about max macro 083f359f5 CMakeLists: fix optflags for ppc 012be8528 Use passed in allocator. 1ce516e50 Suppress uritest 778dc8b03 fix #1 76281ff38 fix a typo in error.h: literial -> literal a98e99992 do not define operator!= in C++20 b08672d46 review comment updates 55eca66f3 code & tests for openapi 2.0 & 3.0 suppprt 80b6d1c83 small corrections for schema.h 97fd83017 attempt to fix SEH 7cad78e23 tidy up after merge from master 794248ee6 fix build break 2d87923e9 remove unnecessary templating from schema tests aa1f22251 correct address.json so tests pass ecb8d9e3a add dump of unexpected schema errors in schematest.cpp 89f6717f0 corrections 338d8defd initial 06d58b9e8 Update dtoa.h 22a62fcc2 Update allocators.h 27c3a8dc0 docs: fix simple typo, perecent -> percent 232389d4f delete unused variable 64faab2e9 gate definition of symmetric equality operators on impl, not lib 719304b11 fixes for natvis dd3f730d7 Make schema dtor robust against exceptions 781a4e667 Try to fix MSVC build. 88f8ddd70 Include conceptual change from PR 2001. 469595356 Avoid exit-time destructors. 0390b1ad5 Avoid exit-time destructors. 2b2c80450 encdedstreamtest: fix use-after-free compile error with gcc-12 1f59c69cd valuetest: fix potential write of terminating nul past the end of the destination fcb23c2db Merge pull request #2008 from agate-pris/access-to-allocator-types bdc49ad80 Merge pull request #2014 from lazydroid/dev/lenik/fix_shadowed_variables 6b500986c fix shadowed variable, take 2 3988c5e25 fix shadowed variable 386d31ab6 Allow access to the template parameter StackAllocator in the GenericDocument 79d7a448e Allow the macro RAPIDJSON_DEFAULT_STACK_ALLOCATOR to be used in any namespace 9965ab37f Allow the macro RAPIDJSON_DEFAULT_ALLOCATOR to be used in any namespace 8261c1ddf Merge pull request #1969 from MalcolmTyrrell/MalcolmTyrrell/sanitizeSchemaCode 0d78b1ce9 Merge pull request #1989 from adamcalhoon/really-fix-placement-new-alignment 1dff2abff Fix the alignment of placement new buffer for GenericValue. e4bde9774 Merge pull request #1988 from Tencent/revert-1987-fix-placement-new-alignment 88bbd87dd Revert "Fix the alignment of placement new buffer for GenericValue." bf8ca5da8 Merge pull request #1987 from adamcalhoon/fix-placement-new-alignment 5b242b6b2 Fix the alignment of placement new buffer for GenericValue. fd3dc29a5 Merge pull request #1944 from ilelann/patch-1 53602ec6b Sanitize the code in schema.h 0d4517f15 Merge pull request #1961 from jedwardsol/issue1960_arm64ec_intrinsic 060c348ea use softintrin on arm64ec 4d6cb0818 Merge pull request #1949 from ardb-uk/master 033bef3c6 Merge pull request #1 from ardb-uk/ardb-uk-patch-1 befba39af Merge pull request #2 from ardb-uk/ardb-uk-patch-1-1 4bbaf28ff Add files via upload 14f1e37f8 Resolve issue 1948 e6736d1ba Support CMake none targets git-subtree-dir: external/rapidjson git-subtree-split: a95e013b97ca6523f32da23f5095fcc9dd6067e5
630 lines
26 KiB
CMake
630 lines
26 KiB
CMake
# SPDX-License-Identifier: MIT
|
|
#
|
|
# EmulationStation Desktop Edition
|
|
# CMakeLists.txt
|
|
#
|
|
# Main CMake configuration file.
|
|
# Sets up the overall build environment including dependencies detection, build options,
|
|
# compiler and linker flags and preprocessor directives.
|
|
#
|
|
|
|
cmake_minimum_required(VERSION 3.13)
|
|
if(APPLE)
|
|
# Set this to the minimum supported macOS version, and also update
|
|
# es-app/assets/EmulationStation-DE_Info.plist accordingly.
|
|
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.15 CACHE STRING "macOS deployment target")
|
|
# This optional variable is used for code signing the DMG installer.
|
|
set(MACOS_CODESIGN_IDENTITY "" CACHE STRING "macOS code signing certificate identity")
|
|
endif()
|
|
project(emulationstation-de)
|
|
|
|
# Application version, update this when making a new release.
|
|
set(ES_VERSION 2.2.0-alpha)
|
|
|
|
# Set this to ON to show verbose compiler output (e.g. compiler flags, include directories etc.)
|
|
set(CMAKE_VERBOSE_MAKEFILE OFF CACHE BOOL "Show verbose compiler output" FORCE)
|
|
|
|
# Package type to use for CPack on Linux.
|
|
set(LINUX_CPACK_GENERATOR DEB CACHE STRING "CPack generator, DEB or RPM")
|
|
|
|
# Add local find modules to the CMake path.
|
|
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/CMake/Utils
|
|
${CMAKE_CURRENT_SOURCE_DIR}/CMake/Packages)
|
|
|
|
# Define the options.
|
|
option(GL "Set to ON if targeting Desktop OpenGL" ON)
|
|
option(GLES "Set to ON if targeting OpenGL ES" OFF)
|
|
option(APPLICATION_UPDATER "Set to OFF to build without the application updater" ON)
|
|
option(APPIMAGE_BUILD "Set to ON when building as an AppImage" OFF)
|
|
option(AUR_BUILD "Set to ON when building for the AUR" OFF)
|
|
option(FLATPAK_BUILD "Set to ON when building as a Flatpak" OFF)
|
|
option(STEAM_DECK "Set to ON to enable a Valve Steam Deck specific build" OFF)
|
|
option(RETRODECK "Set to ON to enable a RetroDECK specific build" OFF)
|
|
option(RPI "Set to ON to enable a Raspberry Pi specific build" OFF)
|
|
option(BUNDLED_CERTS "Set to ON to use bundled TLS/SSL certificates" OFF)
|
|
option(CEC "Set to ON to enable CEC" OFF)
|
|
option(VIDEO_HW_DECODING "Set to ON to enable FFmpeg HW decoding" OFF)
|
|
option(CLANG_TIDY "Set to ON to build using the clang-tidy static analyzer" OFF)
|
|
option(ASAN "Set to ON to build with AddressSanitizer" OFF)
|
|
option(TSAN "Set to ON to build with ThreadSanitizer" OFF)
|
|
option(UBSAN "Set to ON to build with UndefinedBehaviorSanitizer" OFF)
|
|
|
|
if(CLANG_TIDY)
|
|
find_program(CLANG_TIDY_BINARY NAMES clang-tidy)
|
|
if(CLANG_TIDY_BINARY MATCHES CLANG_TIDY_BINARY-NOTFOUND)
|
|
message("-- CLANG_TIDY was set but the clang-tidy binary was not found")
|
|
else()
|
|
message("-- Building with the clang-tidy static analyzer")
|
|
set(CMAKE_CXX_CLANG_TIDY "clang-tidy;-checks=*,\
|
|
-fuchsia-*,\
|
|
-hicpp-*,\
|
|
-llvm-*,\
|
|
-readability-braces-*,\
|
|
-google-readability-braces-*,\
|
|
-readability-uppercase-literal-suffix,\
|
|
-modernize-use-trailing-return-type,\
|
|
-cppcoreguidelines-avoid-magic-numbers,\
|
|
-readability-magic-numbers")
|
|
endif()
|
|
endif()
|
|
|
|
#---------------------------------------------------------------------------------------------------
|
|
# Raspberry Pi setup.
|
|
|
|
# Raspberry Pi OS 32-bit (armv7l).
|
|
if(EXISTS ${CMAKE_FIND_ROOT_PATH}/opt/vc/include/bcm_host.h)
|
|
set(RPI ON)
|
|
set(RPI_32 ON)
|
|
set(GLES ON)
|
|
set(BCMHOST ON)
|
|
message("-- Building on a Raspberry Pi (32-bit OS)")
|
|
endif()
|
|
|
|
# Raspberry Pi OS 64-bit (aarch64).
|
|
if(EXISTS /usr/include/bcm_host.h)
|
|
set(RPI ON)
|
|
set(RPI_64 ON)
|
|
set(GLES ON)
|
|
set(BCMHOST ON)
|
|
message("-- Building on a Raspberry Pi (64-bit OS)")
|
|
endif()
|
|
|
|
#---------------------------------------------------------------------------------------------------
|
|
# Emscripten WebAssembly build.
|
|
|
|
if(EMSCRIPTEN)
|
|
set(GLES ON)
|
|
set(CMAKE_EXECUTABLE_SUFFIX .html)
|
|
endif()
|
|
|
|
#---------------------------------------------------------------------------------------------------
|
|
# OpenGL setup.
|
|
|
|
if(GLES)
|
|
set(GLSYSTEM "Embedded OpenGL" CACHE STRING "The OpenGL system to be used")
|
|
else()
|
|
set(GLSYSTEM "Desktop OpenGL" CACHE STRING "The OpenGL system to be used")
|
|
endif()
|
|
|
|
set_property(CACHE GLSYSTEM PROPERTY STRINGS "Desktop OpenGL" "Embedded OpenGL")
|
|
|
|
#---------------------------------------------------------------------------------------------------
|
|
# Package dependencies.
|
|
|
|
if(GLSYSTEM MATCHES "Desktop OpenGL")
|
|
set(OpenGL_GL_PREFERENCE GLVND)
|
|
find_package(OpenGL REQUIRED)
|
|
elseif(GLES AND NOT EMSCRIPTEN)
|
|
find_package(OpenGLES2 REQUIRED)
|
|
endif()
|
|
|
|
# On macOS and Windows all dependencies are kept in-tree in the "external" directory.
|
|
if(APPLE)
|
|
if(NOT EXISTS ${PROJECT_SOURCE_DIR}/external/FFmpeg)
|
|
message(FATAL_ERROR "-- You need to build the dependencies in ./external first")
|
|
endif()
|
|
find_package(CURL REQUIRED)
|
|
elseif(WIN32)
|
|
if(NOT EXISTS ${PROJECT_SOURCE_DIR}/external/pugixml/libpugixml.dll AND # MinGW
|
|
NOT EXISTS ${PROJECT_SOURCE_DIR}/external/pugixml/pugixml.dll) # MSVC
|
|
message(FATAL_ERROR "-- You need to build the dependencies in ./external first")
|
|
endif()
|
|
elseif(NOT EMSCRIPTEN)
|
|
find_package(CURL REQUIRED)
|
|
find_package(FFmpeg REQUIRED)
|
|
find_package(FreeImage REQUIRED)
|
|
find_package(Freetype REQUIRED)
|
|
find_package(Libgit2 REQUIRED)
|
|
find_package(Pugixml REQUIRED)
|
|
find_package(SDL2 REQUIRED)
|
|
endif()
|
|
|
|
# Add libCEC support.
|
|
if(CEC)
|
|
find_package(libCEC REQUIRED)
|
|
endif()
|
|
|
|
# Add ALSA for Linux.
|
|
if(CMAKE_SYSTEM_NAME MATCHES Linux)
|
|
find_package(ALSA REQUIRED)
|
|
endif()
|
|
|
|
#---------------------------------------------------------------------------------------------------
|
|
# Compiler and linker settings.
|
|
|
|
if(CMAKE_CXX_COMPILER_ID MATCHES Clang)
|
|
message("-- Compiler is Clang/LLVM")
|
|
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0.0)
|
|
message(SEND_ERROR "You need at least Clang 5.0.0 to compile EmulationStation-DE")
|
|
endif()
|
|
elseif(CMAKE_CXX_COMPILER_ID MATCHES GNU)
|
|
message("-- Compiler is GNU/GCC")
|
|
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.1)
|
|
message(SEND_ERROR "You need at least GCC 7.1 to compile EmulationStation-DE")
|
|
endif()
|
|
if(WIN32)
|
|
set(CMAKE_CXX_FLAGS "-mwindows ${CMAKE_CXX_FLAGS}")
|
|
endif()
|
|
elseif(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
|
message("-- Compiler is MSVC")
|
|
# If using the MSVC compiler on Windows, disable the built-in min() and max() macros.
|
|
add_compile_definitions(NOMINMAX)
|
|
endif()
|
|
|
|
if(CMAKE_BUILD_TYPE)
|
|
message("-- Build type is ${CMAKE_BUILD_TYPE}")
|
|
endif()
|
|
|
|
# Set up compiler and linker flags for debug, profiling or release builds.
|
|
if(CMAKE_BUILD_TYPE MATCHES Debug)
|
|
# Enable the C++17 standard and disable optimizations as it's a debug build.
|
|
if(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17 /Od /DEBUG:FULL")
|
|
else()
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -O0 -g3 -Wall -Wpedantic -Wsign-compare -Wnarrowing -Wmissing-field-initializers -Wunused-macros")
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -O0")
|
|
endif()
|
|
# If using Clang, then add additional debug data needed by GDB.
|
|
# Comment this out if you're using LLDB for debugging as this flag makes the binary
|
|
# much larger and the application much slower. On macOS this setting is never enabled
|
|
# as LLDB is the default debugger on this OS.
|
|
if(NOT APPLE AND CMAKE_CXX_COMPILER_ID MATCHES Clang)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GLIBCXX_DEBUG")
|
|
endif()
|
|
elseif(CMAKE_BUILD_TYPE MATCHES Profiling)
|
|
# For the profiling build, we enable optimizations and supply the required profiler flags.
|
|
if(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17 /O2 /DEBUG:FULL")
|
|
else()
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -O2 -g3 -Wall -Wpedantic -Wsign-compare -Wnarrowing -Wmissing-field-initializers -Wunused-macros")
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -O2")
|
|
endif()
|
|
else()
|
|
# Enable the C++17 standard and enable optimizations as it's a release build.
|
|
# This will also disable all assert() macros. Strip the binary too.
|
|
if(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNDEBUG /std:c++17 /O2 /DEBUG:NONE")
|
|
else()
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -O2 -DNDEBUG -Wall -Wpedantic -Wsign-compare -Wnarrowing -Wmissing-field-initializers -Wunused-macros")
|
|
if(APPLE)
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -O2")
|
|
else()
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -O2 -s")
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
if(EMSCRIPTEN)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s USE_SDL=2 -pthread")
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s INITIAL_MEMORY=33554432 -s ALLOW_MEMORY_GROWTH=1 -s WASM=1 -s ASSERTIONS=1 -s EXIT_RUNTIME=1 -s USE_SDL=2 \
|
|
-pthread -s PTHREAD_POOL_SIZE=4 -s DEMANGLE_SUPPORT=1 -s USE_WEBGL2=1 -s FULL_ES3=1 -s ERROR_ON_UNDEFINED_SYMBOLS=1 -s ASYNCIFY \
|
|
--preload-file ${PROJECT_SOURCE_DIR}/resources@/home/web_user/.emulationstation/resources/ \
|
|
--preload-file ${PROJECT_SOURCE_DIR}/themes/rbsimple-DE@/home/web_user/.emulationstation/themes/rbsimple-DE/ \
|
|
--preload-file ${PROJECT_SOURCE_DIR}/ROMs@/home/web_user/ROMs/")
|
|
endif()
|
|
|
|
# Raspberry Pi model 3 and higher (ARM Cortex-A53 minimum).
|
|
if(RPI_32)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -latomic -mcpu=cortex-a53 -mfpu=neon-fp-armv8")
|
|
elseif(RPI_64)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -latomic -mcpu=cortex-a53")
|
|
endif()
|
|
|
|
if(ASAN AND TSAN)
|
|
message(FATAL_ERROR "-- AddressSanitizer and ThreadSanitizer can't be combined")
|
|
endif()
|
|
|
|
if(ASAN)
|
|
message("-- Building with AddressSanitizer")
|
|
if(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fsanitize=address")
|
|
else()
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
|
|
endif()
|
|
endif()
|
|
|
|
if(TSAN)
|
|
message("-- Building with ThreadSanitizer")
|
|
if(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
|
message(FATAL_ERROR "-- ThreadSanitizer not available for MSVC")
|
|
else()
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -fno-omit-frame-pointer")
|
|
endif()
|
|
endif()
|
|
|
|
if(UBSAN)
|
|
message("-- Building with UndefinedBehaviorSanitizer")
|
|
if(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
|
message(FATAL_ERROR "-- UndefinedBehaviorSanitizer not available for MSVC")
|
|
else()
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined -fno-omit-frame-pointer")
|
|
endif()
|
|
endif()
|
|
|
|
# The following removes half of the ranlib warnings on macOS regarding no symbols for files
|
|
# that are #ifdef'ed away. There must be a way to remove the other half as well?
|
|
if(APPLE)
|
|
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>")
|
|
endif()
|
|
|
|
if(APPLE)
|
|
if(MACOS_CODESIGN_IDENTITY)
|
|
message("-- Code signing certificate identity: " ${MACOS_CODESIGN_IDENTITY})
|
|
endif()
|
|
endif()
|
|
|
|
if(WIN32)
|
|
set(BUNDLED_CERTS ON)
|
|
endif()
|
|
|
|
#---------------------------------------------------------------------------------------------------
|
|
# Preprocessor directives.
|
|
|
|
if(GLES)
|
|
add_compile_definitions(USE_OPENGLES)
|
|
message("-- Building with OpenGL ES renderer")
|
|
endif()
|
|
|
|
if(APPIMAGE_BUILD AND FLATPAK_BUILD)
|
|
message(FATAL_ERROR "-- APPIMAGE_BUILD and FLATPAK_BUILD can't be combined")
|
|
endif()
|
|
|
|
if(APPIMAGE_BUILD)
|
|
if(NOT CMAKE_SYSTEM_NAME MATCHES Linux)
|
|
message(FATAL_ERROR "-- APPIMAGE_BUILD can only be used when building on Linux")
|
|
endif()
|
|
add_compile_definitions(APPIMAGE_BUILD)
|
|
message("-- Building as an AppImage")
|
|
endif()
|
|
|
|
if(FLATPAK_BUILD)
|
|
if(NOT CMAKE_SYSTEM_NAME MATCHES Linux)
|
|
message(FATAL_ERROR "-- FLATPAK_BUILD can only be used when building on Linux")
|
|
endif()
|
|
add_compile_definitions(FLATPAK_BUILD)
|
|
message("-- Building as a Flatpak")
|
|
endif()
|
|
|
|
if(AUR_BUILD)
|
|
message("-- Building for the AUR")
|
|
endif()
|
|
|
|
if(STEAM_DECK AND RETRODECK)
|
|
message(FATAL_ERROR "-- STEAM_DECK and RETRODECK can't be combined")
|
|
endif()
|
|
|
|
if(STEAM_DECK)
|
|
add_compile_definitions(STEAM_DECK)
|
|
message("-- Building for the Valve Steam Deck")
|
|
endif()
|
|
|
|
if(RETRODECK)
|
|
add_compile_definitions(RETRODECK)
|
|
message("-- Building for RetroDECK")
|
|
endif()
|
|
|
|
if(RPI)
|
|
add_compile_definitions(RASPBERRY_PI)
|
|
endif()
|
|
|
|
if(BUNDLED_CERTS)
|
|
add_compile_definitions(USE_BUNDLED_CERTIFICATES)
|
|
message("-- Building with bundled TLS/SSL certificates")
|
|
endif()
|
|
|
|
if(DEFINED libCEC_FOUND)
|
|
add_compile_definitions(HAVE_LIBCEC)
|
|
endif()
|
|
|
|
if(VIDEO_HW_DECODING)
|
|
add_compile_definitions(VIDEO_HW_DECODING)
|
|
message("-- Building with FFmpeg HW decoding")
|
|
endif()
|
|
|
|
if(AUR_BUILD OR FLATPAK_BUILD OR RETRODECK OR RPI)
|
|
set(APPLICATION_UPDATER OFF)
|
|
endif()
|
|
|
|
if(CMAKE_SYSTEM_NAME MATCHES FreeBSD OR CMAKE_SYSTEM_NAME MATCHES NetBSD OR CMAKE_SYSTEM_NAME MATCHES OpenBSD)
|
|
set(APPLICATION_UPDATER OFF)
|
|
endif()
|
|
|
|
if(APPLICATION_UPDATER)
|
|
add_compile_definitions(APPLICATION_UPDATER)
|
|
else()
|
|
message("-- Building without application updater")
|
|
endif()
|
|
|
|
# This is needed by the application updater to identify the package type.
|
|
if(CMAKE_SYSTEM_NAME MATCHES Linux)
|
|
if(LINUX_CPACK_GENERATOR MATCHES DEB)
|
|
add_compile_definitions(LINUX_DEB_PACKAGE)
|
|
elseif(LINUX_CPACK_GENERATOR MATCHES RPM)
|
|
add_compile_definitions(LINUX_RPM_PACKAGE)
|
|
endif()
|
|
endif()
|
|
|
|
if(APPLE)
|
|
if(CMAKE_SYSTEM_PROCESSOR MATCHES arm)
|
|
add_compile_definitions(MACOS_APPLE_CPU)
|
|
else()
|
|
add_compile_definitions(MACOS_INTEL_CPU)
|
|
endif()
|
|
endif()
|
|
|
|
# Affects the application updater and is used for displaying version info in the main menu.
|
|
if(ES_VERSION MATCHES alpha OR ES_VERSION MATCHES beta OR ES_VERSION MATCHES dev)
|
|
add_compile_definitions(IS_PRERELEASE)
|
|
endif()
|
|
|
|
# GLM library options.
|
|
add_compile_definitions(GLM_FORCE_CXX17)
|
|
add_compile_definitions(GLM_FORCE_XYZW_ONLY)
|
|
|
|
# For Unix systems, assign the installation prefix. If it's not explicitly set,
|
|
# we use /usr on Linux, /usr/pkg on NetBSD and /usr/local on FreeBSD and OpenBSD.
|
|
if(NOT WIN32 AND NOT APPLE)
|
|
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
|
|
if(CMAKE_SYSTEM_NAME MATCHES Linux)
|
|
set(CMAKE_INSTALL_PREFIX /usr CACHE INTERNAL CMAKE_INSTALL_PREFIX)
|
|
elseif(CMAKE_SYSTEM_NAME MATCHES NetBSD)
|
|
set(CMAKE_INSTALL_PREFIX /usr/pkg CACHE INTERNAL CMAKE_INSTALL_PREFIX)
|
|
else()
|
|
set(CMAKE_INSTALL_PREFIX /usr/local CACHE INTERNAL CMAKE_INSTALL_PREFIX)
|
|
endif()
|
|
endif()
|
|
message("-- Installation prefix is set to " ${CMAKE_INSTALL_PREFIX})
|
|
add_compile_definitions(ES_INSTALL_PREFIX="${CMAKE_INSTALL_PREFIX}")
|
|
endif()
|
|
|
|
# For Windows, set the minimum OS version to Windows 7.
|
|
if(WIN32)
|
|
add_compile_definitions(_WIN32_WINNT=0x0601)
|
|
add_compile_definitions(WINVER=0x0601)
|
|
endif()
|
|
|
|
#---------------------------------------------------------------------------------------------------
|
|
# Include files.
|
|
|
|
set(COMMON_INCLUDE_DIRS ${CURL_INCLUDE_DIR}
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/CImg
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/glm
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/lunasvg/include
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/rapidjson/include
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/rlottie/inc
|
|
${CMAKE_CURRENT_SOURCE_DIR}/es-core/src)
|
|
|
|
if(APPLE)
|
|
set(COMMON_INCLUDE_DIRS ${COMMON_INCLUDE_DIRS}
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/FFmpeg
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/freeimage/FreeImage/Source
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/freetype/include
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/libgit2/include
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/pugixml/src
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/SDL)
|
|
elseif(WIN32)
|
|
set(COMMON_INCLUDE_DIRS ${COMMON_INCLUDE_DIRS}
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/curl/include
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/glew/include
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/ffmpeg/include
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/FreeImage/Dist/x64
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/freetype/include
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/libgit2/include
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/pugixml/src
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/SDL2)
|
|
elseif(EMSCRIPTEN)
|
|
set(COMMON_INCLUDE_DIRS ${COMMON_INCLUDE_DIRS}
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/curl/include
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/ffmpeg.wasm-core
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/FreeImage-CMake/FreeImage/Source
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/freetype/include
|
|
${CMAKE_CURRENT_SOURCE_DIR}/external/pugixml/src)
|
|
else()
|
|
set(COMMON_INCLUDE_DIRS ${COMMON_INCLUDE_DIRS}
|
|
${FFMPEG_INCLUDE_DIRS}
|
|
${FreeImage_INCLUDE_DIRS}
|
|
${FREETYPE_INCLUDE_DIRS}
|
|
${GIT2_INCLUDE_PATH}
|
|
${PUGIXML_INCLUDE_DIRS}
|
|
${SDL2_INCLUDE_DIR})
|
|
endif()
|
|
|
|
# Add libCEC include directory.
|
|
if(DEFINED libCEC_FOUND)
|
|
list(APPEND COMMON_INCLUDE_DIRS ${libCEC_INCLUDE_DIR})
|
|
endif()
|
|
|
|
# For Linux, add the ALSA include directory.
|
|
if(CMAKE_SYSTEM_NAME MATCHES Linux)
|
|
list(APPEND COMMON_INCLUDE_DIRS ${ALSA_INCLUDE_DIRS})
|
|
endif()
|
|
|
|
if(RPI_32)
|
|
list(APPEND COMMON_INCLUDE_DIRS ${CMAKE_FIND_ROOT_PATH}/opt/vc/include
|
|
${CMAKE_FIND_ROOT_PATH}/opt/vc/include/interface/vcos
|
|
${CMAKE_FIND_ROOT_PATH}/opt/vc/include/interface/vmcs_host/linux
|
|
${CMAKE_FIND_ROOT_PATH}/opt/vc/include/interface/vcos/pthreads)
|
|
endif()
|
|
|
|
#---------------------------------------------------------------------------------------------------
|
|
# Dependency libraries.
|
|
|
|
if(APPLE)
|
|
set(COMMON_LIBRARIES ${COMMON_LIBRARIES}
|
|
${CURL_LIBRARIES}
|
|
${PROJECT_SOURCE_DIR}/libavcodec.60.dylib
|
|
${PROJECT_SOURCE_DIR}/libavfilter.9.dylib
|
|
${PROJECT_SOURCE_DIR}/libavformat.60.dylib
|
|
${PROJECT_SOURCE_DIR}/libavutil.58.dylib
|
|
${PROJECT_SOURCE_DIR}/libswresample.4.dylib
|
|
${PROJECT_SOURCE_DIR}/libswscale.7.dylib
|
|
${PROJECT_SOURCE_DIR}/libfreeimage.a
|
|
${PROJECT_SOURCE_DIR}/libfreetype.6.dylib
|
|
${PROJECT_SOURCE_DIR}/libgit2.1.6.dylib
|
|
${PROJECT_SOURCE_DIR}/libpugixml.a
|
|
${PROJECT_SOURCE_DIR}/libSDL2-2.0.0.dylib)
|
|
elseif(WIN32)
|
|
if(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
|
set(COMMON_LIBRARIES ${PROJECT_SOURCE_DIR}/avcodec.lib
|
|
${PROJECT_SOURCE_DIR}/avfilter.lib
|
|
${PROJECT_SOURCE_DIR}/avformat.lib
|
|
${PROJECT_SOURCE_DIR}/avutil.lib
|
|
${PROJECT_SOURCE_DIR}/swresample.lib
|
|
${PROJECT_SOURCE_DIR}/swscale.lib
|
|
${PROJECT_SOURCE_DIR}/FreeImage.lib
|
|
${PROJECT_SOURCE_DIR}/git2.lib
|
|
${PROJECT_SOURCE_DIR}/glew32.lib
|
|
${PROJECT_SOURCE_DIR}/libcurl-x64.lib
|
|
${PROJECT_SOURCE_DIR}/freetype.lib
|
|
${PROJECT_SOURCE_DIR}/lunasvg.lib
|
|
${PROJECT_SOURCE_DIR}/pugixml.lib
|
|
${PROJECT_SOURCE_DIR}/rlottie.lib
|
|
${PROJECT_SOURCE_DIR}/SDL2main.lib
|
|
${PROJECT_SOURCE_DIR}/SDL2.lib
|
|
Winmm.dll)
|
|
else()
|
|
set(COMMON_LIBRARIES ${PROJECT_SOURCE_DIR}/avcodec-60.dll
|
|
${PROJECT_SOURCE_DIR}/avfilter-9.dll
|
|
${PROJECT_SOURCE_DIR}/avformat-60.dll
|
|
${PROJECT_SOURCE_DIR}/avutil-58.dll
|
|
${PROJECT_SOURCE_DIR}/swresample-4.dll
|
|
${PROJECT_SOURCE_DIR}/swscale-7.dll
|
|
${PROJECT_SOURCE_DIR}/FreeImage.dll
|
|
${PROJECT_SOURCE_DIR}/libgit2.dll
|
|
${PROJECT_SOURCE_DIR}/glew32.dll
|
|
${PROJECT_SOURCE_DIR}/libcurl-x64.dll
|
|
${PROJECT_SOURCE_DIR}/libfreetype.dll
|
|
${PROJECT_SOURCE_DIR}/liblunasvg.dll
|
|
${PROJECT_SOURCE_DIR}/libpugixml.dll
|
|
${PROJECT_SOURCE_DIR}/libSDL2main.a
|
|
${PROJECT_SOURCE_DIR}/librlottie.dll
|
|
${PROJECT_SOURCE_DIR}/SDL2.dll
|
|
mingw32
|
|
Winmm.dll)
|
|
endif()
|
|
elseif(EMSCRIPTEN)
|
|
set(COMMON_LIBRARIES ${COMMON_LIBRARIES}
|
|
# FFmpeg core libraries.
|
|
${PROJECT_SOURCE_DIR}/libavcodec.a
|
|
${PROJECT_SOURCE_DIR}/libavfilter.a
|
|
${PROJECT_SOURCE_DIR}/libavformat.a
|
|
${PROJECT_SOURCE_DIR}/libavutil.a
|
|
${PROJECT_SOURCE_DIR}/libpostproc.a
|
|
${PROJECT_SOURCE_DIR}/libswresample.a
|
|
${PROJECT_SOURCE_DIR}/libswscale.a
|
|
# FFmpeg third party libraries.
|
|
${PROJECT_SOURCE_DIR}/libx264.a
|
|
${PROJECT_SOURCE_DIR}/libx265.a
|
|
${PROJECT_SOURCE_DIR}/libass.a
|
|
${PROJECT_SOURCE_DIR}/libfdk-aac.a
|
|
${PROJECT_SOURCE_DIR}/libfribidi.a
|
|
${PROJECT_SOURCE_DIR}/libharfbuzz.a
|
|
${PROJECT_SOURCE_DIR}/libmp3lame.a
|
|
${PROJECT_SOURCE_DIR}/libogg.a
|
|
${PROJECT_SOURCE_DIR}/libopus.a
|
|
${PROJECT_SOURCE_DIR}/libtheoradec.a
|
|
${PROJECT_SOURCE_DIR}/libtheoraenc.a
|
|
${PROJECT_SOURCE_DIR}/libvorbis.a
|
|
${PROJECT_SOURCE_DIR}/libvorbisenc.a
|
|
${PROJECT_SOURCE_DIR}/libvorbisfile.a
|
|
${PROJECT_SOURCE_DIR}/libvpx.a
|
|
${PROJECT_SOURCE_DIR}/libwavpack.a
|
|
${PROJECT_SOURCE_DIR}/libz.a
|
|
# Other dependencies.
|
|
${PROJECT_SOURCE_DIR}/libcurl.a
|
|
${PROJECT_SOURCE_DIR}/libFreeImage.a
|
|
${PROJECT_SOURCE_DIR}/libfreetype.a
|
|
${PROJECT_SOURCE_DIR}/libpugixml.a)
|
|
else()
|
|
set(COMMON_LIBRARIES ${CURL_LIBRARIES}
|
|
${FFMPEG_LIBRARIES}
|
|
${FreeImage_LIBRARIES}
|
|
${FREETYPE_LIBRARIES}
|
|
${GIT2_LIBRARY}
|
|
${PUGIXML_LIBRARIES}
|
|
${SDL2_LIBRARY})
|
|
endif()
|
|
|
|
if(NOT WIN32)
|
|
# SVG rendering library LunaSVG.
|
|
set(COMMON_LIBRARIES ${COMMON_LIBRARIES} ${PROJECT_SOURCE_DIR}/liblunasvg.a)
|
|
# Lottie animation library rlottie.
|
|
set(COMMON_LIBRARIES ${COMMON_LIBRARIES} ${PROJECT_SOURCE_DIR}/librlottie.a)
|
|
endif()
|
|
|
|
if(APPLE)
|
|
# See es-app/CMakeLists.txt for an explation for why an extra "Resources" directory
|
|
# has been added to the install prefix.
|
|
set(CMAKE_INSTALL_PREFIX "/Applications/EmulationStation Desktop Edition.app/Contents/Resources")
|
|
|
|
# Set the same rpath links for the install executable as for the build executable.
|
|
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
|
|
|
|
set(CMAKE_INSTALL_RPATH @executable_path)
|
|
endif()
|
|
|
|
# Add libCEC libraries.
|
|
if(DEFINED libCEC_FOUND)
|
|
list(APPEND COMMON_LIBRARIES dl ${libCEC_LIBRARIES})
|
|
endif()
|
|
|
|
# Add ALSA for Linux libraries.
|
|
if(CMAKE_SYSTEM_NAME MATCHES Linux)
|
|
list(APPEND COMMON_LIBRARIES ${ALSA_LIBRARY})
|
|
endif()
|
|
|
|
# Raspberry Pi.
|
|
if(BCMHOST)
|
|
list(APPEND COMMON_LIBRARIES bcm_host vchiq_arm)
|
|
if(RPI_32)
|
|
link_directories(${CMAKE_FIND_ROOT_PATH}/opt/vc/lib)
|
|
endif()
|
|
endif()
|
|
|
|
# OpenGL.
|
|
if(GLSYSTEM MATCHES "Desktop OpenGL")
|
|
list(APPEND COMMON_LIBRARIES ${OPENGL_LIBRARIES})
|
|
elseif(GLES)
|
|
list(APPEND COMMON_LIBRARIES ${OPENGLES2_LIBRARIES})
|
|
endif()
|
|
|
|
#---------------------------------------------------------------------------------------------------
|
|
# Build directories.
|
|
|
|
set(dir ${CMAKE_CURRENT_SOURCE_DIR})
|
|
set(EXECUTABLE_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE)
|
|
set(LIBRARY_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE)
|
|
|
|
# Add each component.
|
|
add_subdirectory(es-pdf-converter)
|
|
add_subdirectory(external)
|
|
add_subdirectory(es-core)
|
|
add_subdirectory(es-app)
|
|
|
|
# Make sure that es-pdf-convert is built first, and then that rlottie is built before es-core.
|
|
# Also set lottie2gif to not be built.
|
|
add_dependencies(lunasvg es-pdf-convert)
|
|
add_dependencies(es-core rlottie)
|
|
set_target_properties(lottie2gif PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1)
|