cmake_minimum_required(VERSION 3.25...4.0) find_program(CCACHE_PROGRAM ccache) if(CCACHE_PROGRAM) set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_PROGRAM} CACHE STRING "Compiler launcher for C.") set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_PROGRAM} CACHE STRING "Compiler launcher for CXX.") endif() set(SENTRY_UPLOAD_URL "" CACHE STRING "Sentry upload URL") set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/shell/cmake") if(APPLE) if(CMAKE_SYSTEM_NAME STREQUAL iOS) set(CMAKE_OSX_DEPLOYMENT_TARGET "12.0" CACHE STRING "Minimum iOS deployment version") set(CMAKE_OSX_ARCHITECTURES "arm64" CACHE STRING "") elseif(CMAKE_SYSTEM_NAME STREQUAL tvOS) set(CMAKE_OSX_DEPLOYMENT_TARGET "12.0" CACHE STRING "Minimum tvOS deployment version") set(CMAKE_OSX_ARCHITECTURES "arm64" CACHE STRING "") else() set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum macOS deployment version") set(CMAKE_OSX_ARCHITECTURES "x86_64;arm64" CACHE STRING "") endif() set(ZLIB_LIBRARY "-lz" CACHE STRING "Use generic linker flag for Xcode to support multiple SDKs") endif() if(LIBRETRO) project(flycast_libretro) else() project(flycast) endif() set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) if(CMAKE_SYSTEM_NAME STREQUAL "NetBSD" OR NINTENDO_SWITCH) set(CMAKE_CXX_EXTENSIONS ON) else() set(CMAKE_CXX_EXTENSIONS OFF) endif() include(DetectArchitecture) if(NOT DEFINED ARCHITECTURE) message(FATAL_ERROR "Unsupported architecture encountered. Ending CMake generation.") endif() message(STATUS "Target architecture: ${ARCHITECTURE}") set(USE_HOST_SDL_DEFAULT OFF) if(NOT APPLE AND (NOT UNIX OR CMAKE_SYSTEM_NAME MATCHES "(FreeBSD|OpenBSD|NetBSD)")) set(USE_HOST_SDL_DEFAULT ON) endif() option(ENABLE_CTEST "Enables unit tests" OFF) option(ENABLE_OPROFILE "Enable OProfile" OFF) option(TEST_AUTOMATION "Enable test automation" OFF) option(ENABLE_LOG "Enable full logging" OFF) option(ASAN "Enable address sanitizer" OFF) option(USE_GLES "Use GLES[3] API" OFF) option(USE_GLES2 "Use GLES2 API" OFF) option(USE_HOST_GLSLANG "Use host glslang" OFF) option(USE_HOST_LIBZIP "Use host libzip" ON) option(USE_HOST_SDL "Use host SDL library" ${USE_HOST_SDL_DEFAULT}) option(USE_HOST_LIBCHDR "Use host libchdr" OFF) option(USE_OPENMP "Use OpenMP if available" ON) option(USE_VULKAN "Build with Vulkan support" ON) option(USE_DX9 "Build with Direct3D 9 support" ON) option(USE_DX11 "Build with Direct3D 11 support" ON) option(LIBRETRO "Build libretro core" OFF) option(USE_OPENGL "Use OpenGL API" ON) option(USE_VIDEOCORE "RPI: use the legacy Broadcom GLES libraries" OFF) option(USE_ALSA "Build with ALSA support" ON) option(USE_LIBAO "Build with AO support" ON) option(USE_OSS "Build with OSS support" OFF) option(USE_PULSEAUDIO "Build with PulseAudio support" ON) option(USE_BREAKPAD "Build and link with breakpad library" ON) option(USE_LUA "Build with Lua support" ON) option(ENABLE_GDB_SERVER "Build with GDB debugging support" OFF) option(ENABLE_DC_PROFILER "Build with support for target machine (SH4) profiler" OFF) option(ENABLE_FC_PROFILER "Build with support for host app (Flycast) profiler" OFF) option(USE_DISCORD "Use Discord Presence API" OFF) option(USE_LIBCDIO "Use libcdio for CDROM access" OFF) if(IOS AND NOT LIBRETRO) set(USE_VULKAN OFF CACHE BOOL "Force vulkan off" FORCE) endif() include(GNUInstallDirs) include(CMakeRC) if(ENABLE_CTEST) include(CTest) endif() if(IOS AND NOT LIBRETRO) set(CMAKE_Swift_LANGUAGE_VERSION 5.0) enable_language(Swift) endif() find_package(Git) if(GIT_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git") execute_process( COMMAND ${GIT_EXECUTABLE} describe --tags --always WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} OUTPUT_VARIABLE GIT_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE ) execute_process( COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} OUTPUT_VARIABLE GIT_HASH OUTPUT_STRIP_TRAILING_WHITESPACE ) else() set(GIT_VERSION "v0.0.0-0-g000000000") set(GIT_HASH "000000000") endif() if(WINDOWS_STORE) string(REGEX REPLACE "[Vv]" "" MS_VERSION ${GIT_VERSION}) string(REPLACE "-" "." MS_VERSION ${MS_VERSION}) string(REGEX REPLACE "\.g[0-9a-f]+" "" MS_VERSION ${MS_VERSION}) string(REGEX MATCHALL "[0-9]+" VERSION_PARTS ${MS_VERSION}) list(LENGTH VERSION_PARTS VERSION_PARTS_LENGTH) if(VERSION_PARTS_LENGTH EQUAL 2) string(APPEND MS_VERSION ".0.0") elseif(VERSION_PARTS_LENGTH EQUAL 3) string(APPEND MS_VERSION ".0") endif() endif() string(TIMESTAMP BUILD_TIMESTAMP UTC) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/core/version.h.in" "${CMAKE_CURRENT_SOURCE_DIR}/core/version.h" @ONLY) if(NINTENDO_SWITCH) set(USE_VULKAN OFF) enable_language(ASM) if(LIBRETRO) add_library(${PROJECT_NAME} STATIC core/emulator.cpp) target_compile_definitions(${PROJECT_NAME} PRIVATE LIBRETRO HAVE_LIBNX HAVE_OPENGL HAVE_OIT) find_path(GLEXT_H_INCLUDE_DIR NAMES GL/glext.h REQUIRED) target_include_directories(${PROJECT_NAME} PRIVATE ${GLEXT_H_INCLUDE_DIR}) set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "flycast_libretro_libnx") set(CMAKE_STATIC_LIBRARY_PREFIX "") else() add_executable(${PROJECT_NAME} core/emulator.cpp) endif() if(USE_GLES) target_compile_definitions(${PROJECT_NAME} PRIVATE GLES) endif() # asio target_compile_definitions(${PROJECT_NAME} PRIVATE ASIO_DISABLE_LOCAL_SOCKETS ASIO_DISABLE_SERIAL_PORT ESHUTDOWN=110 SA_RESTART=0 SA_NOCLDWAIT=0 IMGUI_DISABLE_DEFAULT_SHELL_FUNCTIONS) elseif(LIBRETRO) add_library(${PROJECT_NAME} SHARED core/emulator.cpp) if(APPLE) if(NOT IOS) set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-undefined,error") endif() set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-exported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/shell/libretro/libretro.osx.def") else() set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined") endif() set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "flycast_libretro" XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "NO" XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "" ) set(CMAKE_SHARED_LIBRARY_PREFIX "") set(CMAKE_POSITION_INDEPENDENT_CODE ON) target_compile_definitions(${PROJECT_NAME} PRIVATE LIBRETRO) if(APPLE) find_library(FOUNDATION Foundation) target_link_libraries(${PROJECT_NAME} PRIVATE ${FOUNDATION}) endif() if(ANDROID OR USE_GLES) target_compile_definitions(${PROJECT_NAME} PRIVATE GLES GLES3 HAVE_OPENGLES HAVE_OPENGLES3) elseif(IOS) target_compile_definitions(${PROJECT_NAME} PRIVATE GLES GLES3 HAVE_OPENGLES HAVE_OPENGLES3) find_library(OPENGLES OpenGLES) find_library(GLKIT GLKit) target_link_libraries(${PROJECT_NAME} PRIVATE ${OPENGLES} ${GLKIT}) elseif(USE_GLES2) target_compile_definitions(${PROJECT_NAME} PRIVATE GLES GLES2 HAVE_OPENGLES HAVE_OPENGLES2) if(USE_VIDEOCORE) target_compile_definitions(${PROJECT_NAME} PRIVATE TARGET_NO_STENCIL) target_link_libraries(${PROJECT_NAME} PRIVATE "-lbrcmGLESv2") target_link_directories(${PROJECT_NAME} PRIVATE "/opt/vc/lib") else() target_link_libraries(${PROJECT_NAME} PRIVATE "-lGLESv2") endif() elseif(USE_OPENGL) target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_OPENGL) if(APPLE) set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-framework,OpenGL") else() target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_OIT) endif() endif() elseif(ANDROID) add_library(${PROJECT_NAME} SHARED core/emulator.cpp) set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_RELEASE} -O3") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_RELEASE} -O3") target_compile_options(${PROJECT_NAME} PRIVATE -fno-stack-protector) set(CMAKE_ANDROID_STL_TYPE "c++_static") elseif(WIN32) if(BUILD_TESTING) add_executable(${PROJECT_NAME} core/emulator.cpp) else() add_executable(${PROJECT_NAME} WIN32 core/emulator.cpp) endif() if(CMAKE_GENERATOR MATCHES "Visual Studio") if(NOT CMAKE_VS_GLOBALS MATCHES "(^|;)UseMultiToolTask=") list(APPEND CMAKE_VS_GLOBALS UseMultiToolTask=true) endif() if(NOT CMAKE_VS_GLOBALS MATCHES "(^|;)EnforceProcessCountAcrossBuilds=") list(APPEND CMAKE_VS_GLOBALS EnforceProcessCountAcrossBuilds=true) endif() set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT ${PROJECT_NAME}) endif() elseif(APPLE) add_executable(${PROJECT_NAME} MACOSX_BUNDLE core/emulator.cpp) else() add_executable(${PROJECT_NAME} core/emulator.cpp) endif() set_target_properties(${PROJECT_NAME} PROPERTIES CMAKE_CXX_STANDARD 20 CMAKE_CXX_STANDARD_REQUIRED ON) if(WINDOWS_STORE) set(USE_OPENGL OFF) set(USE_VULKAN OFF) endif() set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS_RELEASE -s) if(MSVC) target_compile_options(${PROJECT_NAME} PRIVATE /GR /GS-) if(WINDOWS_STORE) target_compile_options(${PROJECT_NAME} PRIVATE /ZW) endif() else() target_compile_options(${PROJECT_NAME} PRIVATE $<$:-fno-strict-aliasing> $<$:-Wall>) endif() if(APPLE AND NOT IOS) set(TARGET_MAC ON) endif() target_compile_definitions(${PROJECT_NAME} PRIVATE $<$:GL_SILENCE_DEPRECATION> $<$:DEBUGFAST> $<$:TARGET_IPHONE> $<$:TARGET_MAC> $<$:GLES> $<$:GLES3> $<$:GLES_SILENCE_DEPRECATION> $<$:_CRT_NONSTDC_NO_WARNINGS> $<$:_CRT_SECURE_NO_WARNINGS> $<$:_WINSOCK_DEPRECATED_NO_WARNING> $<$:NOMINMAX> $<$:TEST_AUTOMATION> $<$:NOCRYPT> $<$:_WIN32_WINNT=0x0A00> $<$,$>:_USE_MATH_DEFINES>) if(UNIX AND NOT ANDROID AND NOT APPLE) execute_process(COMMAND getconf PAGESIZE OUTPUT_VARIABLE PAGE_SIZE OUTPUT_STRIP_TRAILING_WHITESPACE) target_compile_definitions(${PROJECT_NAME} PRIVATE PAGE_SIZE=${PAGE_SIZE}) endif() if(NOT "${SENTRY_UPLOAD_URL}" STREQUAL "") target_compile_definitions(${PROJECT_NAME} PRIVATE SENTRY_UPLOAD="${SENTRY_UPLOAD_URL}") endif() target_include_directories(${PROJECT_NAME} PRIVATE core core/deps core/deps/stb core/deps/json core/deps/asio/asio/include) if(LIBRETRO) target_include_directories(${PROJECT_NAME} PRIVATE shell/libretro) endif() if(NINTENDO_SWITCH) target_include_directories(${PROJECT_NAME} PRIVATE shell/switch) endif() if(CMAKE_SYSTEM_NAME STREQUAL "OpenBSD") target_link_options(${PROJECT_NAME} PRIVATE "-Wl,--no-execute-only") endif() if(USE_BREAKPAD AND NOT LIBRETRO) find_program(SH_EXECUTABLE sh) if((ANDROID AND NOT CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") OR (MINGW AND SH_EXECUTABLE) OR (CMAKE_SYSTEM_NAME STREQUAL "Linux")) add_subdirectory(core/deps/breakpad) if(WIN32) target_link_options(${PROJECT_NAME} PRIVATE "-Wl,--build-id") endif() target_link_libraries(${PROJECT_NAME} PUBLIC breakpad_client) target_compile_definitions(${PROJECT_NAME} PRIVATE USE_BREAKPAD) elseif(APPLE AND NOT IOS) target_sources(${PROJECT_NAME} PRIVATE core/deps/breakpad/src/client/minidump_file_writer-inl.h core/deps/breakpad/src/client/minidump_file_writer.cc core/deps/breakpad/src/client/minidump_file_writer.h core/deps/breakpad/src/client/mac/handler/breakpad_nlist_64.cc core/deps/breakpad/src/client/mac/handler/breakpad_nlist_64.h core/deps/breakpad/src/client/mac/handler/dynamic_images.cc core/deps/breakpad/src/client/mac/handler/dynamic_images.h core/deps/breakpad/src/client/mac/handler/exception_handler.cc core/deps/breakpad/src/client/mac/handler/exception_handler.h core/deps/breakpad/src/client/mac/handler/minidump_generator.cc core/deps/breakpad/src/client/mac/handler/minidump_generator.h core/deps/breakpad/src/client/mac/handler/protected_memory_allocator.cc core/deps/breakpad/src/client/mac/handler/protected_memory_allocator.h core/deps/breakpad/src/client/mac/crash_generation/ConfigFile.h core/deps/breakpad/src/client/mac/crash_generation/ConfigFile.mm core/deps/breakpad/src/client/mac/crash_generation/client_info.h core/deps/breakpad/src/client/mac/crash_generation/crash_generation_client.h core/deps/breakpad/src/client/mac/crash_generation/crash_generation_client.cc core/deps/breakpad/src/common/convert_UTF.cc core/deps/breakpad/src/common/convert_UTF.h core/deps/breakpad/src/common/md5.cc core/deps/breakpad/src/common/string_conversion.cc core/deps/breakpad/src/common/string_conversion.h core/deps/breakpad/src/common/mac/file_id.cc core/deps/breakpad/src/common/mac/file_id.h core/deps/breakpad/src/common/mac/MachIPC.mm core/deps/breakpad/src/common/mac/MachIPC.h core/deps/breakpad/src/common/mac/bootstrap_compat.cc core/deps/breakpad/src/common/mac/bootstrap_compat.h core/deps/breakpad/src/common/mac/macho_id.cc core/deps/breakpad/src/common/mac/macho_id.h core/deps/breakpad/src/common/mac/macho_utilities.cc core/deps/breakpad/src/common/mac/macho_utilities.h core/deps/breakpad/src/common/mac/macho_walker.cc core/deps/breakpad/src/common/mac/macho_walker.h core/deps/breakpad/src/common/mac/string_utilities.cc core/deps/breakpad/src/common/mac/string_utilities.h ) target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/core/deps/breakpad/src) target_compile_definitions(${PROJECT_NAME} PRIVATE USE_BREAKPAD) add_custom_target(dump_syms COMMAND xcodebuild -project ${CMAKE_CURRENT_SOURCE_DIR}/core/deps/breakpad/src/tools/mac/dump_syms/dump_syms.xcodeproj -target dump_syms -configuration Release CONFIGURATION_BUILD_DIR=${CMAKE_CURRENT_SOURCE_DIR}/build/breakpad) ADD_DEPENDENCIES(${PROJECT_NAME} dump_syms) if(${CMAKE_GENERATOR} MATCHES "^Xcode.*") add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND sleep 20 COMMAND mkdir -p ../symbols COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build/breakpad/dump_syms -a x86_64 -g ${CMAKE_CURRENT_BINARY_DIR}/$/Flycast.app.dSYM $ > ../symbols/Flycast-x64.sym COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build/breakpad/dump_syms -a arm64 -g ${CMAKE_CURRENT_BINARY_DIR}/$/Flycast.app.dSYM $ > ../symbols/Flycast-arm64.sym ) else() add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND sleep 20 COMMAND mkdir -p ../symbols COMMAND dsymutil $ -o ${CMAKE_CURRENT_BINARY_DIR}/Flycast.app.dSYM COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build/breakpad/dump_syms -a x86_64 -g ${CMAKE_CURRENT_BINARY_DIR}/Flycast.app.dSYM $ > ../symbols/Flycast-x64.sym COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build/breakpad/dump_syms -a arm64 -g ${CMAKE_CURRENT_BINARY_DIR}/Flycast.app.dSYM $ > ../symbols/Flycast-arm64.sym ) endif() endif() endif() if(USE_OPENMP) find_package(OpenMP) if(OpenMP_CXX_FOUND) if(MINGW) target_link_libraries(${PROJECT_NAME} PRIVATE -lpthread) target_link_options(${PROJECT_NAME} PRIVATE -fopenmp -static) target_compile_options(${PROJECT_NAME} PRIVATE -fopenmp) elseif(ANDROID) # Reference: https://android.googlesource.com/platform/ndk/+/refs/heads/master/tests/device/openmp/CMakeLists.txt set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_OPTIONS -fopenmp) target_link_libraries(${PROJECT_NAME} PRIVATE -fopenmp -static-openmp) else() target_link_libraries(${PROJECT_NAME} PRIVATE OpenMP::OpenMP_CXX) endif() endif() if(IOS) message("-- Finding OpenMP.xcframework for iOS") set(OPENMP_XCFRAMEWORK "${CMAKE_CURRENT_SOURCE_DIR}/shell/apple/emulator-ios/OpenMP/OpenMP.xcframework") if(IS_DIRECTORY ${OPENMP_XCFRAMEWORK}) # CMake does not support linking xcframework directly atm. (see https://gitlab.kitware.com/cmake/cmake/-/issues/21752) set(OPENMP_FRAMEWORK ${OPENMP_XCFRAMEWORK}/ios-arm64_arm64e/OpenMP.framework/Versions/A/libomp.a) if(EXISTS ${OPENMP_FRAMEWORK}) message("-- Found OpenMP.xcframework: ${OPENMP_FRAMEWORK} (Linking static library before CMake support linking xcframework)") target_link_libraries(${PROJECT_NAME} PRIVATE ${OPENMP_FRAMEWORK}) target_include_directories(${PROJECT_NAME} PRIVATE ${OPENMP_XCFRAMEWORK}/ios-arm64_arm64e/OpenMP.framework/Versions/A/Headers) target_compile_options(${PROJECT_NAME} PRIVATE $<$:-Xclang -fopenmp>) endif() else() message("-- Could NOT find OpenMP.xcframework, compile it using shell/apple/emulator-ios/OpenMP/build_ios_openmp.sh") endif() endif() endif() option(BUILD_SHARED_LIBS "Build shared library" OFF) set(XXHASH_BUILD_XXHSUM OFF CACHE BOOL "Build the xxhsum binary") add_subdirectory(core/deps/xxHash/cmake_unofficial) target_link_libraries(${PROJECT_NAME} PRIVATE xxHash::xxhash) option(BUILD_SHARED_LIBS "Build shared library" OFF) add_subdirectory(core/deps/glm) target_link_libraries(${PROJECT_NAME} PRIVATE glm::glm) if(USE_VULKAN) if(USE_HOST_GLSLANG) find_package(glslang REQUIRED) else() option(BUILD_EXTERNAL "Build external dependencies in /External" OFF) option(ENABLE_SPVREMAPPER "Enables building of SPVRemapper" OFF) option(ENABLE_GLSLANG_BINARIES "Builds glslang and spirv-remap" OFF) option(ENABLE_HLSL "Enables HLSL input support" OFF) option(ENABLE_OPT "Enables spirv-opt capability if present" OFF) option(ENABLE_PCH "Enables Precompiled header" OFF) add_subdirectory(core/deps/glslang EXCLUDE_FROM_ALL) endif() target_link_libraries(${PROJECT_NAME} PRIVATE glslang::glslang-default-resource-limits glslang::SPIRV) endif() if(NOT LIBRETRO) if(USE_OSS) target_compile_definitions(${PROJECT_NAME} PRIVATE USE_OSS) endif() if(USE_ALSA) find_package(ALSA) if(ALSA_FOUND AND NOT ANDROID) target_compile_definitions(${PROJECT_NAME} PRIVATE USE_ALSA) target_include_directories(${PROJECT_NAME} PRIVATE ${ALSA_INCLUDE_DIRS}) target_link_libraries(${PROJECT_NAME} PRIVATE ${ALSA_LIBRARIES}) endif() endif() if(MINGW) target_link_libraries(${PROJECT_NAME} PRIVATE "-static-libgcc -static-libstdc++") endif() if(NOT ANDROID AND NOT IOS) if(USE_HOST_SDL) find_package(SDL2 2.0.9) endif() if(NOT SDL2_FOUND) set(SDL_TEST_ENABLED_BY_DEFAULT OFF) add_subdirectory(core/deps/SDL EXCLUDE_FROM_ALL) set(SDL2_FOUND 1) endif() # SDL2::SDL2main may or may not be available. It is e.g. required by Windows GUI applications if(TARGET SDL2::SDL2main AND NOT BUILD_TESTING) # It has an implicit dependency on SDL2 functions, so it MUST be added before SDL2::SDL2 (or SDL2::SDL2-static) target_link_libraries(${PROJECT_NAME} PRIVATE SDL2::SDL2main) endif() if((APPLE OR WIN32) AND TARGET SDL2::SDL2-static) target_link_libraries(${PROJECT_NAME} PRIVATE SDL2::SDL2-static) elseif(TARGET SDL2::SDL2) target_link_libraries(${PROJECT_NAME} PRIVATE SDL2::SDL2) else() target_include_directories(${PROJECT_NAME} PRIVATE ${SDL2_INCLUDE_DIRS}) target_link_libraries(${PROJECT_NAME} PRIVATE ${SDL2_LIBRARIES}) endif() target_compile_definitions(${PROJECT_NAME} PRIVATE USE_SDL USE_SDL_AUDIO) add_subdirectory(core/sdl) if((UNIX AND NOT APPLE) OR NINTENDO_SWITCH) find_package(CURL REQUIRED) target_link_libraries(${PROJECT_NAME} PRIVATE CURL::libcurl) endif() endif() find_package(ZLIB) if(TARGET ZLIB::ZLIB AND NOT ANDROID AND (NOT WIN32 OR WINDOWS_STORE)) set(WITH_SYSTEM_ZLIB ON CACHE BOOL "Use system provided zlib library") target_link_libraries(${PROJECT_NAME} PRIVATE ZLIB::ZLIB) endif() if(USE_LUA) find_package(Lua 5.2) if(NOT APPLE AND LUA_FOUND) target_compile_definitions(${PROJECT_NAME} PRIVATE USE_LUA) target_include_directories(${PROJECT_NAME} PRIVATE ${LUA_INCLUDE_DIR} core/deps/luabridge/Source) list(TRANSFORM LUA_LIBRARIES REPLACE "\.dll" "") target_link_libraries(${PROJECT_NAME} PRIVATE ${LUA_LIBRARIES}) endif() endif() endif() find_package(PkgConfig) if(NOT WITH_SYSTEM_ZLIB) option(ZLIB_BUILD_EXAMPLES "Enable Zlib Examples" OFF) add_subdirectory("core/deps/libchdr/deps/zlib-1.3.1" EXCLUDE_FROM_ALL) set_target_properties(zlibstatic PROPERTIES POSITION_INDEPENDENT_CODE ON) target_link_libraries(${PROJECT_NAME} PRIVATE zlibstatic) # help libzip find the package set(ZLIB_RELATIVE_PATH "core/deps/libchdr/deps/zlib-1.3.1") set(ZLIB_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${ZLIB_RELATIVE_PATH}" "${CMAKE_CURRENT_BINARY_DIR}/${ZLIB_RELATIVE_PATH}") endif() if(PKG_CONFIG_FOUND AND USE_HOST_LIBCHDR) pkg_check_modules(LIBCHDR IMPORTED_TARGET libchdr) target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::LIBCHDR) else() option(ZSTD_BUILD_SHARED "BUILD SHARED LIBRARIES" OFF) option(ZSTD_BUILD_PROGRAMS "BUILD PROGRAMS" OFF) option(ZSTD_LEGACY_SUPPORT "LEGACY SUPPORT" OFF) add_subdirectory(core/deps/libchdr/deps/zstd-1.5.6/build/cmake EXCLUDE_FROM_ALL) target_link_libraries(${PROJECT_NAME} PRIVATE libzstd_static) option(WITH_SYSTEM_ZSTD "Use system provided zstd library" ON) add_subdirectory(core/deps/libchdr EXCLUDE_FROM_ALL) target_link_libraries(${PROJECT_NAME} PRIVATE chdr-static) target_include_directories(${PROJECT_NAME} PRIVATE core/deps/libchdr/include) endif() if(PKG_CONFIG_FOUND AND NOT ANDROID AND NOT APPLE AND NOT LIBRETRO) if(USE_LIBAO) pkg_check_modules(AO IMPORTED_TARGET ao) if(AO_FOUND) target_compile_definitions(${PROJECT_NAME} PRIVATE USE_LIBAO) target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::AO) endif() endif() if(NOT SDL2_FOUND) pkg_check_modules(LIBEVDEV IMPORTED_TARGET libevdev) if(LIBEVDEV_FOUND) target_compile_definitions(${PROJECT_NAME} PRIVATE USE_EVDEV) target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::LIBEVDEV) pkg_check_modules(LIBUDEV IMPORTED_TARGET libudev) if(LIBUDEV_FOUND) target_compile_definitions(${PROJECT_NAME} PRIVATE USE_UDEV) target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::LIBUDEV) endif() endif() endif() if(USE_PULSEAUDIO) pkg_check_modules(LIBPULSE IMPORTED_TARGET libpulse) if(LIBPULSE_FOUND) target_compile_definitions(${PROJECT_NAME} PRIVATE USE_PULSEAUDIO) target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::LIBPULSE) endif() endif() if(USE_HOST_LIBZIP) pkg_check_modules(LIBZIP IMPORTED_TARGET libzip) if(LIBZIP_FOUND) target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::LIBZIP) endif() endif() if(ENABLE_OPROFILE) target_compile_definitions(${PROJECT_NAME} PRIVATE DYNA_OPROF) target_link_libraries(${PROJECT_NAME} PRIVATE opagent) endif() find_package(MiniUPnPc) if(MINIUPNP_FOUND) target_include_directories(${PROJECT_NAME} PRIVATE ${MINIUPNP_INCLUDE_DIRS}) target_link_libraries(${PROJECT_NAME} PRIVATE ${MINIUPNP_LIBRARIES}) endif() endif() if(UNIX AND NOT APPLE AND NOT ANDROID) add_definitions( -DFLYCAST_DATADIR="${CMAKE_INSTALL_FULL_DATADIR}/${PROJECT_NAME}/" -DFLYCAST_SYSCONFDIR="${CMAKE_INSTALL_FULL_SYSCONFDIR}/${PROJECT_NAME}/" ) if(USE_GLES2) target_compile_definitions(${PROJECT_NAME} PRIVATE GLES GLES2) if(USE_VIDEOCORE) target_compile_definitions(${PROJECT_NAME} PRIVATE TARGET_VIDEOCORE USE_OMX) target_link_libraries(${PROJECT_NAME} PRIVATE "-lbrcmGLESv2") target_link_directories(${PROJECT_NAME} PRIVATE "/opt/vc/lib") endif() elseif(USE_GLES) target_compile_definitions(${PROJECT_NAME} PRIVATE GLES GLES3) endif() find_package(Threads REQUIRED) target_link_libraries(${PROJECT_NAME} PRIVATE Threads::Threads) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND "x86_64" IN_LIST ARCHITECTURE AND NOT LIBRETRO) set_target_properties(${PROJECT_NAME} PROPERTIES POSITION_INDEPENDENT_CODE False) if(${CMAKE_VERSION} VERSION_LESS "3.14.0") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -no-pie") endif() endif() if(NOT SDL2_FOUND AND NOT LIBRETRO) find_package(X11 REQUIRED) if(X11_FOUND) target_compile_definitions(${PROJECT_NAME} PRIVATE SUPPORT_X11) target_include_directories(${PROJECT_NAME} PRIVATE ${X11_INCLUDE_DIR}) target_link_libraries(${PROJECT_NAME} PRIVATE ${X11_LIBRARIES}) endif() endif() find_library(LIBRT rt) if(LIBRT) target_link_libraries(${PROJECT_NAME} PRIVATE ${LIBRT}) endif() target_link_libraries(${PROJECT_NAME} PRIVATE ${CMAKE_DL_LIBS}) endif() if(ASAN) if(ANDROID) target_compile_options(${PROJECT_NAME} PRIVATE -fsanitize=address -fno-omit-frame-pointer) set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS -fsanitize=address) else() target_compile_options(${PROJECT_NAME} PRIVATE -fsanitize=address -static-libasan) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address -static-libasan") endif() endif() if(ANDROID AND "arm" IN_LIST ARCHITECTURE) enable_language(ASM) option(LIBUNWIND_ENABLE_SHARED "Build libunwind as a shared library." OFF) add_subdirectory(core/deps/libunwind/libunwind) target_link_libraries(${PROJECT_NAME} PRIVATE unwind_static) endif() if(ANDROID AND NOT LIBRETRO) set(BUILD_SHARED_LIBS OFF) add_subdirectory(core/deps/oboe) target_compile_definitions(${PROJECT_NAME} PRIVATE USE_OBOE) target_link_libraries(${PROJECT_NAME} PRIVATE oboe) endif() target_sources(${PROJECT_NAME} PRIVATE core/deps/chdpsr/cdipsr.cpp core/deps/chdpsr/cdipsr.h) add_subdirectory(core/deps/nowide EXCLUDE_FROM_ALL) target_link_libraries(${PROJECT_NAME} PRIVATE nowide::nowide) if(NOT MINIUPNP_FOUND) if(NINTENDO_SWITCH) target_compile_definitions(${PROJECT_NAME} PRIVATE FEAT_NO_MINIUPNPC) else() option(UPNPC_BUILD_SHARED "Build shared library" OFF) option(UPNPC_BUILD_TESTS "Build test executables" OFF) option(UPNPC_BUILD_SAMPLE "Build sample executables" OFF) option(UPNPC_NO_INSTALL "Disable installation" ON) add_subdirectory(core/deps/miniupnpc) if(WINDOWS_STORE) get_target_property(miniupnpc-private-defs miniupnpc-private INTERFACE_COMPILE_DEFINITIONS) list(REMOVE_ITEM miniupnpc-private-defs "_WIN32_WINNT=0x0501") set_property(TARGET miniupnpc-private PROPERTY INTERFACE_COMPILE_DEFINITIONS ${miniupnpc-private-defs}) endif() target_link_libraries(${PROJECT_NAME} PRIVATE miniupnpc::miniupnpc) endif() endif() if(NOT LIBZIP_FOUND OR NINTENDO_SWITCH) option(ENABLE_COMMONCRYPTO "Enable use of CommonCrypto" OFF) option(ENABLE_GNUTLS "Enable use of GnuTLS" OFF) option(ENABLE_MBEDTLS "Enable use of mbed TLS" OFF) option(ENABLE_OPENSSL "Enable use of OpenSSL" OFF) option(ENABLE_WINDOWS_CRYPTO "Enable use of Windows cryptography libraries" OFF) option(ENABLE_BZIP2 "Enable use of BZip2" OFF) option(ENABLE_LZMA "Enable use of LZMA" OFF) option(ENABLE_ZSTD "Enable use of Zstandard" ON) option(BUILD_TOOLS "Build tools in the src directory (zipcmp, zipmerge, ziptool)" OFF) option(BUILD_REGRESS "Build regression tests" OFF) option(BUILD_EXAMPLES "Build examples" OFF) option(BUILD_DOC "Build documentation" OFF) option(BUILD_SHARED_LIBS "Build shared libraries" OFF) option(LIBZIP_DO_INSTALL "Install libzip and the related files" OFF) add_subdirectory(core/deps/libzip EXCLUDE_FROM_ALL) target_link_libraries(${PROJECT_NAME} PRIVATE libzip::zip) endif() if(USE_LIBCDIO) if(PKG_CONFIG_FOUND) pkg_check_modules(CDIO IMPORTED_TARGET libcdio) if(CDIO_FOUND) target_compile_definitions(${PROJECT_NAME} PRIVATE USE_LIBCDIO) if(MINGW) # Force static link target_link_libraries(${PROJECT_NAME} PRIVATE "-l:libcdio.a -l:libiconv.a -lwinmm") else() target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::CDIO) endif() endif() endif() if(NOT CDIO_FOUND) find_package(libcdio) if(TARGET libcdio::libcdio) target_compile_definitions(${PROJECT_NAME} PRIVATE USE_LIBCDIO) target_link_libraries(${PROJECT_NAME} PRIVATE libcdio::libcdio) endif() endif() endif() if(WIN32) target_include_directories(${PROJECT_NAME} PRIVATE core/deps/dirent) endif() if(NOT LIBRETRO AND NOT NINTENDO_SWITCH) target_compile_definitions(${PROJECT_NAME} PRIVATE USE_ICE) # libjuice option(BUILD_SHARED_LIBS "Build shared libraries" OFF) option(NO_SERVER "Disable server support" ON) option(NO_TESTS "Disable tests build" ON) add_subdirectory(core/deps/libjuice EXCLUDE_FROM_ALL) target_link_libraries(${PROJECT_NAME} PRIVATE LibJuice::LibJuiceStatic) # websocket++ target_include_directories(${PROJECT_NAME} PRIVATE core/deps/websocketpp) target_compile_definitions(${PROJECT_NAME} PRIVATE ASIO_STANDALONE) if (MSVC) target_compile_definitions(${PROJECT_NAME} PRIVATE _WEBSOCKETPP_CPP11_FUNCTIONAL_ _WEBSOCKETPP_CPP11_SYSTEM_ERROR_ _WEBSOCKETPP_CPP11_RANDOM_DEVICE_ _WEBSOCKETPP_CPP11_MEMORY_ _WEBSOCKETPP_CPP11_TYPE_TRAITS_) elseif(MINGW) target_compile_definitions(${PROJECT_NAME} PRIVATE _WEBSOCKETPP_CPP11_THREAD_) else() target_compile_definitions(${PROJECT_NAME} PRIVATE _WEBSOCKETPP_CPP11_STL_) endif() endif() target_include_directories(${PROJECT_NAME} PRIVATE core/deps/picotcp/include core/deps/picotcp/modules) target_sources(${PROJECT_NAME} PRIVATE core/deps/picotcp/include/arch/pico_arm9.h core/deps/picotcp/include/arch/pico_atsamd21j18.h core/deps/picotcp/include/arch/pico_avr.h core/deps/picotcp/include/arch/pico_cortex_m.h core/deps/picotcp/include/arch/pico_dos.h core/deps/picotcp/include/arch/pico_esp8266.h core/deps/picotcp/include/arch/pico_generic_gcc.h core/deps/picotcp/include/arch/pico_linux.h core/deps/picotcp/include/arch/pico_mbed.h core/deps/picotcp/include/arch/pico_msp430.h core/deps/picotcp/include/arch/pico_msvc.h core/deps/picotcp/include/arch/pico_none.h core/deps/picotcp/include/arch/pico_pic24.h core/deps/picotcp/include/arch/pico_pic32.h core/deps/picotcp/include/arch/pico_posix.h core/deps/picotcp/include/heap.h core/deps/picotcp/include/pico_addressing.h core/deps/picotcp/include/pico_config.h core/deps/picotcp/include/pico_constants.h core/deps/picotcp/include/pico_defines.h core/deps/picotcp/include/pico_defines_msvc.h core/deps/picotcp/include/pico_device.h core/deps/picotcp/include/pico_eth.h core/deps/picotcp/include/pico_frame.h core/deps/picotcp/include/pico_md5.h core/deps/picotcp/include/pico_module_eth.h core/deps/picotcp/include/pico_protocol.h core/deps/picotcp/include/pico_queue.h core/deps/picotcp/include/pico_socket.h core/deps/picotcp/include/pico_socket_multicast.h core/deps/picotcp/include/pico_stack.h core/deps/picotcp/include/pico_tree.h core/deps/picotcp/modules/pico_arp.c core/deps/picotcp/modules/pico_dev_ppp.c core/deps/picotcp/modules/pico_dhcp_common.c core/deps/picotcp/modules/pico_dhcp_common.h core/deps/picotcp/modules/pico_dhcp_server.c core/deps/picotcp/modules/pico_dhcp_server.h core/deps/picotcp/modules/pico_dns_client.c core/deps/picotcp/modules/pico_dns_common.c core/deps/picotcp/modules/pico_ethernet.c core/deps/picotcp/modules/pico_fragments.c core/deps/picotcp/modules/pico_icmp4.c core/deps/picotcp/modules/pico_ipv4.c core/deps/picotcp/modules/pico_socket_tcp.c core/deps/picotcp/modules/pico_socket_udp.c core/deps/picotcp/modules/pico_strings.c core/deps/picotcp/modules/pico_tcp.c core/deps/picotcp/modules/pico_udp.c core/deps/picotcp/stack/pico_device.c core/deps/picotcp/stack/pico_frame.c core/deps/picotcp/stack/pico_md5.c core/deps/picotcp/stack/pico_protocol.c core/deps/picotcp/stack/pico_socket.c core/deps/picotcp/stack/pico_socket_multicast.c core/deps/picotcp/stack/pico_stack.c core/deps/picotcp/stack/pico_tree.c) target_compile_definitions(${PROJECT_NAME} PRIVATE _7ZIP_ST) target_sources(${PROJECT_NAME} PRIVATE core/deps/lzma/7zArcIn.c core/deps/lzma/7zBuf.c core/deps/lzma/7zCrc.c core/deps/lzma/7zCrcOpt.c core/deps/lzma/7zDec.c core/deps/lzma/7zFile.c core/deps/lzma/7zStream.c core/deps/lzma/Alloc.c core/deps/lzma/Bcj2.c core/deps/lzma/Bra86.c core/deps/lzma/Bra.c core/deps/lzma/BraIA64.c core/deps/lzma/CpuArch.c core/deps/lzma/Delta.c core/deps/lzma/LzFind.c core/deps/lzma/Lzma2Dec.c core/deps/lzma/Lzma86Dec.c core/deps/lzma/Lzma86Enc.c core/deps/lzma/LzmaDec.c core/deps/lzma/LzmaEnc.c core/deps/lzma/LzmaLib.c core/deps/lzma/Sort.c) add_subdirectory(core/deps/libelf) target_link_libraries(${PROJECT_NAME} PRIVATE elf) if(NOT LIBRETRO) target_compile_definitions(${PROJECT_NAME} PRIVATE IMGUI_DISABLE_DEMO_WINDOWS IMGUI_DEFINE_MATH_OPERATORS) target_include_directories(${PROJECT_NAME} PRIVATE core/deps/imgui core/deps/imgui/backends) target_sources(${PROJECT_NAME} PRIVATE core/deps/imgui/imgui.cpp core/deps/imgui/imgui_demo.cpp core/deps/imgui/imgui_draw.cpp core/deps/imgui/imgui_stdlib.cpp core/deps/imgui/imgui_tables.cpp core/deps/imgui/imgui_widgets.cpp) if(ENABLE_FC_PROFILER) target_include_directories(${PROJECT_NAME} PRIVATE core/deps/implot) target_sources(${PROJECT_NAME} PRIVATE core/deps/implot/implot.h core/deps/implot/implot.cpp core/deps/implot/implot_internal.h core/deps/implot/implot_items.cpp) endif() endif() target_sources(${PROJECT_NAME} PRIVATE core/deps/xbrz/xbrz.cpp) target_sources(${PROJECT_NAME} PRIVATE core/deps/md5/md5.cpp) if(USE_DISCORD AND NOT LIBRETRO) option(BUILD_EXAMPLES "Build example apps" OFF) add_subdirectory(core/deps/discord-rpc EXCLUDE_FROM_ALL) target_include_directories(${PROJECT_NAME} PRIVATE core/deps/discord-rpc/include) target_link_libraries(${PROJECT_NAME} PRIVATE discord-rpc) target_compile_definitions(${PROJECT_NAME} PRIVATE USE_DISCORD) endif() target_link_libraries(${PROJECT_NAME} PRIVATE flycast::res) if(LIBRETRO) target_include_directories(${PROJECT_NAME} PRIVATE core/deps/libretro-common/include) target_sources(${PROJECT_NAME} PRIVATE core/deps/libretro-common/memmap/memalign.c core/deps/libretro-common/file/file_path.c core/deps/libretro-common/vfs/vfs_implementation.c core/deps/libretro-common/encodings/encoding_utf.c core/deps/libretro-common/compat/compat_strl.c core/deps/libretro-common/compat/fopen_utf8.c core/deps/libretro-common/compat/compat_strcasestr.c core/deps/libretro-common/file/retro_dirent.c core/deps/libretro-common/string/stdstring.c) if(USE_OPENGL) target_sources(${PROJECT_NAME} PRIVATE core/deps/libretro-common/glsm/glsm.c core/deps/libretro-common/glsym/rglgen.c) if(ANDROID OR IOS OR USE_GLES) target_sources(${PROJECT_NAME} PRIVATE core/deps/libretro-common/glsym/glsym_es3.c) elseif(USE_GLES2) target_sources(${PROJECT_NAME} PRIVATE core/deps/libretro-common/glsym/glsym_es2.c) else() target_sources(${PROJECT_NAME} PRIVATE core/deps/libretro-common/glsym/glsym_gl.c) endif() endif() target_sources(${PROJECT_NAME} PRIVATE shell/libretro/audiostream.cpp shell/libretro/keyboard_map.h shell/libretro/libretro_core_option_defines.h shell/libretro/libretro_core_options_intl.h shell/libretro/libretro_core_options.h shell/libretro/libretro.cpp shell/libretro/LogManager.cpp shell/libretro/LogManager.h shell/libretro/option.cpp shell/libretro/oslib.cpp shell/libretro/vmu_xhair.cpp) if(APPLE) target_sources(${PROJECT_NAME} PRIVATE shell/libretro/oslib_apple.mm) endif() if(WIN32) target_link_libraries(${PROJECT_NAME} PRIVATE mswsock) endif() endif() add_subdirectory(core/archive) add_subdirectory(core/cfg) add_subdirectory(core/hw) add_subdirectory(core/imgread) add_subdirectory(core/input) add_subdirectory(core/log) add_subdirectory(core/network) add_subdirectory(core/oslib) add_subdirectory(core/audio) add_subdirectory(core/reios) add_subdirectory(core/achievements) add_subdirectory(core/ui) add_subdirectory(core/lua) add_subdirectory(core/profiler) add_subdirectory(core/wsi) include(cmake/resources.cmake) if(WIN32) target_sources(${PROJECT_NAME} PRIVATE core/windows/comptr.h core/windows/fault_handler.cpp core/windows/unwind_info.cpp core/windows/win_vmem.cpp) else() target_sources(${PROJECT_NAME} PRIVATE core/linux/common.cpp core/linux/context.cpp core/linux/posix_vmem.cpp core/linux/unwind_info.cpp) if(NINTENDO_SWITCH) target_sources(${PROJECT_NAME} PRIVATE shell/switch/libnx_vmem.cpp shell/switch/stubs.c shell/switch/context_switch.S shell/switch/nswitch.h shell/switch/switch_gamepad.h shell/switch/switch_main.cpp shell/switch/ucontext.h) endif() endif() if(NOT LIBRETRO) target_sources(${PROJECT_NAME} PRIVATE core/linux-dist/evdev.cpp core/linux-dist/evdev.h core/linux-dist/icon.h core/linux-dist/x11.cpp core/linux-dist/x11.h core/linux-dist/x11_keyboard.h) endif() if(NOT LIBRETRO) target_sources(${PROJECT_NAME} PRIVATE core/deps/rcheevos/src/rc_client_raintegration.c core/deps/rcheevos/src/rc_client.c core/deps/rcheevos/src/rc_compat.c core/deps/rcheevos/src/rc_util.c core/deps/rcheevos/src/rc_version.c core/deps/rcheevos/src/rapi/rc_api_common.c core/deps/rcheevos/src/rapi/rc_api_editor.c core/deps/rcheevos/src/rapi/rc_api_info.c core/deps/rcheevos/src/rapi/rc_api_runtime.c core/deps/rcheevos/src/rapi/rc_api_user.c core/deps/rcheevos/src/rcheevos/alloc.c core/deps/rcheevos/src/rcheevos/condition.c core/deps/rcheevos/src/rcheevos/condset.c core/deps/rcheevos/src/rcheevos/consoleinfo.c core/deps/rcheevos/src/rcheevos/format.c core/deps/rcheevos/src/rcheevos/lboard.c core/deps/rcheevos/src/rcheevos/memref.c core/deps/rcheevos/src/rcheevos/operand.c core/deps/rcheevos/src/rcheevos/rc_validate.c core/deps/rcheevos/src/rcheevos/richpresence.c core/deps/rcheevos/src/rcheevos/runtime_progress.c core/deps/rcheevos/src/rcheevos/runtime.c core/deps/rcheevos/src/rcheevos/trigger.c core/deps/rcheevos/src/rcheevos/value.c core/deps/rcheevos/src/rhash/aes.c core/deps/rcheevos/src/rhash/cdreader.c core/deps/rcheevos/src/rhash/hash.c core/deps/rcheevos/src/rhash/md5.c core/deps/rcheevos/src/rurl/url.c) target_include_directories(${PROJECT_NAME} PRIVATE core/deps/rcheevos/include) target_compile_definitions(${PROJECT_NAME} PRIVATE USE_RACHIEVEMENTS RC_DISABLE_LUA) endif() if(USE_OPENGL) target_compile_definitions(${PROJECT_NAME} PRIVATE USE_OPENGL) target_sources(${PROJECT_NAME} PRIVATE core/rend/gles/glcache.h core/rend/gles/gldraw.cpp core/rend/gles/gles.cpp core/rend/gles/gles.h core/rend/gles/gltex.cpp core/rend/gles/quad.cpp core/rend/gles/postprocess.cpp core/rend/gles/postprocess.h core/rend/gles/naomi2.cpp core/rend/gles/naomi2.h) if(NOT LIBRETRO) target_sources(${PROJECT_NAME} PRIVATE core/deps/imgui/backends/imgui_impl_opengl3.cpp core/deps/imgui/backends/imgui_impl_opengl3.h core/rend/gles/opengl_driver.cpp core/rend/gles/opengl_driver.h) endif() if(NOT (APPLE OR ANDROID OR USE_GLES OR USE_GLES2)) target_sources(${PROJECT_NAME} PRIVATE core/rend/gl4/abuffer.cpp core/rend/gl4/gl4.h core/rend/gl4/gldraw.cpp core/rend/gl4/gles.cpp core/rend/gl4/gl4naomi2.cpp core/rend/gl4/gl4naomi2.h) endif() endif() target_sources(${PROJECT_NAME} PRIVATE core/build.h core/cheats.cpp core/cheats.h core/emulator.h core/nullDC.cpp core/serialize.cpp core/serialize.h core/stdclass.cpp core/stdclass.h core/types.h core/debug/gdb_server.h) target_sources(${PROJECT_NAME} PRIVATE core/rend/CustomTexture.cpp core/rend/CustomTexture.h core/rend/osd.cpp core/rend/osd.h core/rend/sorter.cpp core/rend/sorter.h core/rend/tileclip.h core/rend/TexCache.cpp core/rend/TexCache.h core/rend/texconv.cpp core/rend/texconv.h core/rend/norend/norend.cpp) if(USE_VULKAN) target_compile_definitions(${PROJECT_NAME} PUBLIC VK_ENABLE_BETA_EXTENSIONS VK_NO_PROTOTYPES) if(ANDROID) target_compile_definitions(${PROJECT_NAME} PUBLIC VK_USE_PLATFORM_ANDROID_KHR) elseif(X11_FOUND) target_compile_definitions(${PROJECT_NAME} PUBLIC VK_USE_PLATFORM_XLIB_KHR) elseif(WIN32) target_compile_definitions(${PROJECT_NAME} PUBLIC VK_USE_PLATFORM_WIN32_KHR) elseif(APPLE) target_compile_definitions(${PROJECT_NAME} PUBLIC VK_USE_PLATFORM_METAL_EXT) endif() add_subdirectory(core/deps/Vulkan-Headers) target_link_libraries(${PROJECT_NAME} PRIVATE Vulkan::Headers) add_subdirectory(core/deps/VulkanMemoryAllocator) target_compile_options(VulkanMemoryAllocator INTERFACE $<$,$>:-Wno-nullability-completeness>) target_link_libraries(${PROJECT_NAME} PRIVATE GPUOpen::VulkanMemoryAllocator) if(ANDROID AND NOT LIBRETRO AND "arm64" IN_LIST ARCHITECTURE) add_subdirectory(core/deps/libadrenotools) target_link_libraries(${PROJECT_NAME} PRIVATE adrenotools) endif() target_compile_definitions(${PROJECT_NAME} PRIVATE USE_VULKAN HAVE_VULKAN) target_sources(${PROJECT_NAME} PRIVATE core/rend/vulkan/oit/oit_buffer.h core/rend/vulkan/oit/oit_drawer.cpp core/rend/vulkan/oit/oit_drawer.h core/rend/vulkan/oit/oit_pipeline.cpp core/rend/vulkan/oit/oit_pipeline.h core/rend/vulkan/oit/oit_renderer.cpp core/rend/vulkan/oit/oit_renderpass.cpp core/rend/vulkan/oit/oit_renderpass.h core/rend/vulkan/oit/oit_shaders.cpp core/rend/vulkan/oit/oit_shaders.h core/rend/vulkan/adreno.cpp core/rend/vulkan/buffer.cpp core/rend/vulkan/buffer.h core/rend/vulkan/commandpool.cpp core/rend/vulkan/commandpool.h core/rend/vulkan/compiler.cpp core/rend/vulkan/compiler.h core/rend/vulkan/drawer.cpp core/rend/vulkan/drawer.h core/rend/vulkan/pipeline.cpp core/rend/vulkan/pipeline.h core/rend/vulkan/quad.cpp core/rend/vulkan/quad.h core/rend/vulkan/shaders.cpp core/rend/vulkan/shaders.h core/rend/vulkan/texture.cpp core/rend/vulkan/texture.h core/rend/vulkan/utils.h core/rend/vulkan/vmallocator.cpp core/rend/vulkan/vmallocator.h core/rend/vulkan/overlay.cpp core/rend/vulkan/overlay.h core/rend/vulkan/vulkan_context.h core/rend/vulkan/vulkan.h core/rend/vulkan/vulkan_renderer.cpp) if(LIBRETRO) target_sources(${PROJECT_NAME} PRIVATE core/rend/vulkan/vk_context_lr.cpp core/rend/vulkan/vk_context_lr.h) else() target_compile_definitions(${PROJECT_NAME} PUBLIC IMGUI_IMPL_VULKAN_NO_PROTOTYPES) target_sources(${PROJECT_NAME} PRIVATE core/rend/vulkan/vulkan_driver.h core/rend/vulkan/vulkan_context.cpp core/deps/imgui/backends/imgui_impl_vulkan.cpp core/deps/imgui/backends/imgui_impl_vulkan.h) if(CMAKE_SIZEOF_VOID_P EQUAL 4) target_compile_definitions(${PROJECT_NAME} PRIVATE ImTextureID=ImU64) endif() endif() endif() if(WIN32 AND USE_DX9 AND NOT LIBRETRO AND NOT WINDOWS_STORE AND ("x86" IN_LIST ARCHITECTURE OR "x86_64" IN_LIST ARCHITECTURE)) set(REND_DX9_FILES core/rend/dx9/d3d_overlay.h core/rend/dx9/d3d_overlay.cpp core/rend/dx9/d3d_renderer.h core/rend/dx9/d3d_renderer.cpp core/rend/dx9/d3d_shaders.h core/rend/dx9/d3d_shaders.cpp core/rend/dx9/d3d_texture.h core/rend/dx9/d3d_texture.cpp core/rend/dx9/dx9_driver.h core/rend/dx9/dxcontext.cpp core/rend/dx9/dxcontext.h core/deps/imgui/backends/imgui_impl_dx9.h core/deps/imgui/backends/imgui_impl_dx9.cpp) target_sources(${PROJECT_NAME} PRIVATE ${REND_DX9_FILES}) if(NOT MINGW) set_source_files_properties(${REND_DX9_FILES} PROPERTIES INCLUDE_DIRECTORIES "$ENV{DXSDK_DIR}/Include") endif() target_compile_definitions(${PROJECT_NAME} PRIVATE USE_DX9) endif() if(WIN32 AND USE_DX11) if(NOT LIBRETRO) target_sources(${PROJECT_NAME} PRIVATE core/deps/imgui/backends/imgui_impl_dx11.cpp core/deps/imgui/backends/imgui_impl_dx11.h) endif() target_sources(${PROJECT_NAME} PRIVATE core/rend/dx11/dx11_driver.h core/rend/dx11/dx11_overlay.cpp core/rend/dx11/dx11_overlay.h core/rend/dx11/dx11_renderer.cpp core/rend/dx11/dx11_renderer.h core/rend/dx11/dx11_renderstate.h core/rend/dx11/dx11_renderstate.cpp core/rend/dx11/dx11_shaders.cpp core/rend/dx11/dx11_shaders.h core/rend/dx11/dx11_texture.cpp core/rend/dx11/dx11_texture.h core/rend/dx11/dx11context.cpp core/rend/dx11/dx11context.h core/rend/dx11/dx11context_lr.cpp core/rend/dx11/dx11context_lr.h core/rend/dx11/dx11_driver.h core/rend/dx11/dx11_naomi2.cpp core/rend/dx11/dx11_naomi2.h core/rend/dx11/oit/dx11_oitbuffers.h core/rend/dx11/oit/dx11_oitrenderer.cpp core/rend/dx11/oit/dx11_oitshaders.cpp core/rend/dx11/oit/dx11_oitshaders.h) target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_D3D11) target_link_libraries(${PROJECT_NAME} PRIVATE d3d11 d3dcompiler dxgi) endif() if(ENABLE_GDB_SERVER) target_sources(${PROJECT_NAME} PRIVATE core/debug/gdb_server.cpp) target_compile_definitions(${PROJECT_NAME} PRIVATE GDB_SERVER) endif() if("arm" IN_LIST ARCHITECTURE AND NOT APPLE) if(MSVC) target_compile_options(${PROJECT_NAME} PRIVATE "/Zc:__cplusplus") endif() target_include_directories(${PROJECT_NAME} PRIVATE core/deps/vixl) target_sources(${PROJECT_NAME} PRIVATE core/rec-ARM/rec_arm.cpp core/deps/vixl/aarch32/location-aarch32.cc core/deps/vixl/aarch32/location-aarch32.h core/deps/vixl/aarch32/assembler-aarch32.cc core/deps/vixl/aarch32/assembler-aarch32.h core/deps/vixl/aarch32/instructions-aarch32.cc core/deps/vixl/aarch32/instructions-aarch32.h core/deps/vixl/aarch32/constants-aarch32.cc core/deps/vixl/aarch32/constants-aarch32.h core/deps/vixl/aarch32/macro-assembler-aarch32.cc core/deps/vixl/aarch32/macro-assembler-aarch32.h core/deps/vixl/aarch32/operands-aarch32.cc core/deps/vixl/aarch32/operands-aarch32.h core/deps/vixl/assembler-base-vixl.h core/deps/vixl/code-buffer-vixl.cc core/deps/vixl/code-buffer-vixl.h core/deps/vixl/code-generation-scopes-vixl.h core/deps/vixl/compiler-intrinsics-vixl.cc core/deps/vixl/compiler-intrinsics-vixl.h core/deps/vixl/cpu-features.cc core/deps/vixl/cpu-features.h core/deps/vixl/globals-vixl.h core/deps/vixl/invalset-vixl.h core/deps/vixl/macro-assembler-interface.h core/deps/vixl/platform-vixl.h core/deps/vixl/pool-manager.h core/deps/vixl/pool-manager-impl.h core/deps/vixl/utils-vixl.cc core/deps/vixl/utils-vixl.h) endif() if("arm64" IN_LIST ARCHITECTURE) if(MSVC) target_compile_options(${PROJECT_NAME} PRIVATE "/Zc:__cplusplus") endif() target_include_directories(${PROJECT_NAME} PRIVATE core/deps/vixl) target_sources(${PROJECT_NAME} PRIVATE core/deps/vixl/aarch64/abi-aarch64.h core/deps/vixl/aarch64/assembler-aarch64.cc core/deps/vixl/aarch64/assembler-aarch64.h core/deps/vixl/aarch64/assembler-sve-aarch64.cc core/deps/vixl/aarch64/constants-aarch64.h core/deps/vixl/aarch64/instructions-aarch64.cc core/deps/vixl/aarch64/instructions-aarch64.h core/deps/vixl/aarch64/macro-assembler-aarch64.cc core/deps/vixl/aarch64/macro-assembler-aarch64.h core/deps/vixl/aarch64/macro-assembler-sve-aarch64.cc core/deps/vixl/aarch64/operands-aarch64.cc core/deps/vixl/aarch64/operands-aarch64.h core/deps/vixl/aarch64/registers-aarch64.cc core/deps/vixl/aarch64/registers-aarch64.h core/deps/vixl/aarch64/pointer-auth-aarch64.cc core/deps/vixl/aarch64/simulator-constants-aarch64.h core/deps/vixl/assembler-base-vixl.h core/deps/vixl/code-buffer-vixl.cc core/deps/vixl/code-buffer-vixl.h core/deps/vixl/code-generation-scopes-vixl.h core/deps/vixl/compiler-intrinsics-vixl.cc core/deps/vixl/compiler-intrinsics-vixl.h core/deps/vixl/cpu-features.cc core/deps/vixl/cpu-features.h core/deps/vixl/globals-vixl.h core/deps/vixl/invalset-vixl.h core/deps/vixl/macro-assembler-interface.h core/deps/vixl/platform-vixl.h core/deps/vixl/pool-manager.h core/deps/vixl/pool-manager-impl.h core/deps/vixl/utils-vixl.cc core/deps/vixl/utils-vixl.h) target_sources(${PROJECT_NAME} PRIVATE core/rec-ARM64/rec_arm64.cpp core/rec-ARM64/arm64_regalloc.h) endif() if("x86" IN_LIST ARCHITECTURE OR "x86_64" IN_LIST ARCHITECTURE) add_subdirectory(core/deps/xbyak EXCLUDE_FROM_ALL) target_link_libraries(${PROJECT_NAME} PRIVATE xbyak::xbyak) if(CMAKE_SIZEOF_VOID_P EQUAL 4) target_sources(${PROJECT_NAME} PRIVATE core/rec-x64/xbyak_base.h core/rec-x86/rec_x86.h core/rec-x86/x86_regalloc.h core/rec-x86/rec_x86.cpp core/rec-x86/x86_ops.cpp) elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) target_sources(${PROJECT_NAME} PRIVATE core/rec-x64/xbyak_base.h core/rec-x64/rec_x64.cpp core/rec-x64/x64_regalloc.h) endif() endif() if((USE_OPENGL OR USE_GLES2 OR USE_GLES) AND NOT LIBRETRO) add_library(glad STATIC core/deps/glad/src/gl.c) if(NOT APPLE AND NOT WIN32 AND NOT SDL2_FOUND) # When SDL2 is not found, we can use EGL with ANativeWindow (Android) or X11 target_sources(glad PRIVATE core/deps/glad/src/egl.c) endif() target_include_directories(glad PUBLIC core/deps/glad/include) target_link_libraries(${PROJECT_NAME} PRIVATE glad) endif() if(NOT LIBRETRO) target_include_directories(${PROJECT_NAME} PRIVATE core/deps/ggpo/include core/deps/ggpo/lib/ggpo) target_sources(${PROJECT_NAME} PRIVATE core/deps/ggpo/lib/ggpo/bitvector.cpp core/deps/ggpo/lib/ggpo/bitvector.h core/deps/ggpo/lib/ggpo/game_input.cpp core/deps/ggpo/lib/ggpo/game_input.h core/deps/ggpo/lib/ggpo/input_queue.cpp core/deps/ggpo/lib/ggpo/input_queue.h core/deps/ggpo/lib/ggpo/main.cpp core/deps/ggpo/lib/ggpo/platform_linux.cpp core/deps/ggpo/lib/ggpo/platform_linux.h core/deps/ggpo/lib/ggpo/platform_windows.cpp core/deps/ggpo/lib/ggpo/platform_windows.h core/deps/ggpo/lib/ggpo/poll.cpp core/deps/ggpo/lib/ggpo/ggpo_poll.h core/deps/ggpo/lib/ggpo/ring_buffer.h core/deps/ggpo/lib/ggpo/static_buffer.h core/deps/ggpo/lib/ggpo/sync.cpp core/deps/ggpo/lib/ggpo/sync.h core/deps/ggpo/lib/ggpo/timesync.cpp core/deps/ggpo/lib/ggpo/timesync.h core/deps/ggpo/lib/ggpo/ggpo_types.h core/deps/ggpo/lib/ggpo/backends/backend.h core/deps/ggpo/lib/ggpo/backends/p2p.cpp core/deps/ggpo/lib/ggpo/backends/p2p.h core/deps/ggpo/lib/ggpo/backends/spectator.cpp core/deps/ggpo/lib/ggpo/backends/spectator.h core/deps/ggpo/lib/ggpo/backends/synctest.cpp core/deps/ggpo/lib/ggpo/backends/synctest.h core/deps/ggpo/lib/ggpo/network/udp_msg.h core/deps/ggpo/lib/ggpo/network/udp_proto.cpp core/deps/ggpo/lib/ggpo/network/udp_proto.h core/deps/ggpo/lib/ggpo/network/udp.cpp core/deps/ggpo/lib/ggpo/network/udp.h) if(ANDROID) target_compile_definitions(${PROJECT_NAME} PRIVATE GLES GLES3) target_sources(${PROJECT_NAME} PRIVATE shell/android-studio/flycast/src/main/jni/src/Android.cpp shell/android-studio/flycast/src/main/jni/src/android_gamepad.h shell/android-studio/flycast/src/main/jni/src/android_storage.h shell/android-studio/flycast/src/main/jni/src/http_client.h shell/android-studio/flycast/src/main/jni/src/jni_util.h shell/android-studio/flycast/src/main/jni/src/android_input.cpp shell/android-studio/flycast/src/main/jni/src/android_keyboard.h) target_link_libraries(${PROJECT_NAME} PRIVATE android log) target_link_options(${PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384") elseif(APPLE) string(TIMESTAMP YEAR "%Y") string(REGEX MATCH "^[^-]+" TAG_VERSION ${GIT_VERSION}) if(IOS) set_property(TARGET ${PROJECT_NAME} PROPERTY XCODE_ATTRIBUTE_SWIFT_VERSION "5.0") add_subdirectory(shell/apple/emulator-ios/AltKit) target_link_libraries(${PROJECT_NAME} PRIVATE AltKit) target_sources(${PROJECT_NAME} PRIVATE shell/apple/common/http_client.mm shell/apple/common/util.mm shell/apple/emulator-ios/emulator/AppDelegate.h shell/apple/emulator-ios/emulator/AppDelegate.mm shell/apple/emulator-ios/emulator/ios_main.mm shell/apple/emulator-ios/emulator/ios_gamepad.h shell/apple/emulator-ios/emulator/ios_keyboard.h shell/apple/emulator-ios/emulator/ios_mouse.h shell/apple/emulator-ios/emulator/FlycastViewController.h shell/apple/emulator-ios/emulator/FlycastViewController.mm shell/apple/emulator-ios/emulator/PadViewController.h shell/apple/emulator-ios/emulator/PadViewController.mm shell/apple/emulator-ios/emulator/EditPadViewController.h shell/apple/emulator-ios/emulator/EditPadViewController.mm shell/apple/emulator-ios/emulator/EmulatorView.h shell/apple/emulator-ios/emulator/EmulatorView.mm shell/apple/emulator-ios/emulator/main.m shell/apple/emulator-ios/emulator/iCade-iOS/iCadeReaderView.h shell/apple/emulator-ios/emulator/iCade-iOS/iCadeReaderView.m shell/apple/emulator-ios/emulator/iCade-iOS/iCadeState.h) target_compile_options(${PROJECT_NAME} PRIVATE $<$:-fobjc-arc -fmodules>) set_source_files_properties(shell/apple/emulator-ios/emulator/FlycastViewController.mm PROPERTIES COMPILE_OPTIONS -fcxx-modules) set_source_files_properties(shell/apple/emulator-ios/emulator/iCade-iOS/iCadeReaderView.m PROPERTIES COMPILE_OPTIONS -fno-objc-arc) set(IOS_RESOURCES shell/apple/emulator-ios/emulator/Images.xcassets shell/apple/emulator-ios/emulator/FlycastStoryboard.storyboard shell/apple/emulator-ios/emulator/LaunchScreen.storyboard shell/apple/emulator-ios/emulator/PadViewController.xib shell/apple/emulator-ios/emulator/EditPadViewController.xib) target_sources(${PROJECT_NAME} PRIVATE ${IOS_RESOURCES}) source_group("Resources" FILES ${IOS_RESOURCES}) set_source_files_properties(${IOS_RESOURCES} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "Flycast" MACOSX_BUNDLE YES MACOSX_BUNDLE_EXECUTABLE_NAME "Flycast" MACOSX_BUNDLE_INFO_STRING "" MACOSX_BUNDLE_GUI_IDENTIFIER "com.flyinghead.Flycast" MACOSX_BUNDLE_BUNDLE_NAME "com.flyinghead.Flycast" MACOSX_BUNDLE_LONG_VERSION_STRING "${GIT_VERSION}" MACOSX_BUNDLE_SHORT_VERSION_STRING "${TAG_VERSION}" MACOSX_BUNDLE_BUNDLE_VERSION "${GIT_HASH}" MACOSX_BUNDLE_COPYRIGHT "Copyright © ${YEAR} Flycast contributors. All rights reserved." MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/shell/apple/emulator-ios/plist.in XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "dwarf-with-dsym" XCODE_ATTRIBUTE_GCC_PREFIX_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/shell/apple/emulator-ios/emulator/flycast-ios-Prefix.pch" XCODE_ATTRIBUTE_GCC_PRECOMPILE_PREFIX_HEADER "YES" XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "NO" XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "" XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2" XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES XCODE_ATTRIBUTE_COMBINE_HIDPI_IMAGES NO XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon" XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.flyinghead.Flycast") find_library(UIKIT UIKit) find_library(FOUNDATION Foundation) find_library(GLKIT GLKit) find_library(GAMECONTROLLER GameController) find_library(AUDIOTOOLBOX AudioToolbox) find_library(AVFOUNDATION AVFoundation) target_link_libraries(${PROJECT_NAME} PRIVATE ${UIKIT} ${FOUNDATION} ${GLKIT} ${GAMECONTROLLER} ${AUDIOTOOLBOX} ${AVFOUNDATION}) add_custom_target(Flycast.IPA ALL DEPENDS ${PROJECT_NAME} COMMENT "Building IPA" COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/Payload COMMAND rm -rf ${CMAKE_CURRENT_BINARY_DIR}/Payload/* COMMAND cp -r ${CMAKE_CURRENT_BINARY_DIR}/$-${CMAKE_OSX_SYSROOT}/Flycast.app ${CMAKE_CURRENT_BINARY_DIR}/Payload COMMAND for lib in ${CMAKE_CURRENT_BINARY_DIR}/Payload/Flycast.app/Frameworks/*.dylib COMMAND do xcrun bitcode_strip -r $lib -o $lib COMMAND done COMMAND ldid -S${CMAKE_CURRENT_SOURCE_DIR}/shell/apple/emulator-ios/emulator/flycast.entitlements ${CMAKE_CURRENT_BINARY_DIR}/Payload/Flycast.app/Flycast COMMAND ${CMAKE_COMMAND} -E tar "cfv" "${CMAKE_CURRENT_BINARY_DIR}/$-${CMAKE_OSX_SYSROOT}/Flycast.ipa" --format=zip ${CMAKE_CURRENT_BINARY_DIR}/Payload) else() add_subdirectory(core/deps/Syphon) target_link_libraries(${PROJECT_NAME} PRIVATE Syphon) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${SYPHON_METALLIB} $/../Resources/) target_compile_definitions(${PROJECT_NAME} PRIVATE VIDEO_ROUTING) target_sources(${PROJECT_NAME} PRIVATE shell/apple/common/http_client.mm shell/apple/common/util.mm shell/apple/emulator-osx/emulator-osx/SDLApplicationDelegate.h shell/apple/emulator-osx/emulator-osx/SDLApplicationDelegate.mm shell/apple/emulator-osx/emulator-osx/osx-main.mm) set(ASSETS shell/apple/emulator-osx/emulator-osx/Images.xcassets) target_sources(${PROJECT_NAME} PRIVATE ${ASSETS}) source_group("Resources" FILES ${ASSETS}) set_source_files_properties(${ASSETS} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "Flycast" MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/shell/apple/emulator-osx/MacOSXBundleInfo.plist.in MACOSX_BUNDLE_EXECUTABLE_NAME "Flycast" MACOSX_BUNDLE_INFO_STRING "" MACOSX_BUNDLE_ICON_FILE "AppIcon" MACOSX_BUNDLE_GUI_IDENTIFIER "com.flyinghead.Flycast" MACOSX_BUNDLE_LONG_VERSION_STRING "${GIT_VERSION}" MACOSX_BUNDLE_SHORT_VERSION_STRING "${TAG_VERSION}" MACOSX_BUNDLE_BUNDLE_VERSION "${GIT_HASH}" MACOSX_BUNDLE_BUNDLE_NAME "Flycast" MACOSX_BUNDLE_COPYRIGHT "Copyright © ${YEAR} Flycast contributors. All rights reserved." XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "dwarf" XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=RelWithDebInfo] "dwarf-with-dsym" XCODE_ATTRIBUTE_CLANG_DEBUG_INFORMATION_LEVEL[variant=RelWithDebInfo] "line-tables-only" XCODE_ATTRIBUTE_DEPLOYMENT_POSTPROCESSING[variant=RelWithDebInfo] YES XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon" XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.flyinghead.Flycast" BUILD_WITH_INSTALL_RPATH TRUE INSTALL_RPATH "@loader_path/../Frameworks" ) find_library(AUDIO_UNIT_LIBRARY AudioUnit) find_library(FOUNDATION_LIBRARY Foundation) find_library(AUDIO_TOOLBOX_LIBRARY AudioToolbox) find_library(METAL_LIBRARY Metal) find_library(IOSURFACE_LIBRARY IOSurface) find_library(MULTITOUCH_SUPPORT_LIBRARY MultitouchSupport /System/Library/PrivateFrameworks) target_link_libraries(${PROJECT_NAME} PRIVATE ${AUDIO_UNIT_LIBRARY} ${FOUNDATION_LIBRARY} ${AUDIO_TOOLBOX_LIBRARY} ${METAL_LIBRARY} ${IOSURFACE_LIBRARY} ${MULTITOUCH_SUPPORT_LIBRARY}) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "$ENV{VULKAN_SDK}/lib/libMoltenVK.dylib" $/../Frameworks/libvulkan.dylib) endif() elseif(UNIX) if(NOT BUILD_TESTING) target_sources(${PROJECT_NAME} PRIVATE core/linux-dist/main.cpp) endif() elseif(WIN32) target_sources(${PROJECT_NAME} PRIVATE core/windows/rawinput.cpp core/windows/rawinput.h) if(NOT BUILD_TESTING) target_sources(${PROJECT_NAME} PRIVATE core/windows/winmain.cpp) endif() if(WINDOWS_STORE) file(READ shell/uwp/Package.appxmanifest MANIFEST) string(REPLACE "9.9.9.9" ${MS_VERSION} MANIFEST ${MANIFEST}) file(WRITE ${CMAKE_BINARY_DIR}/Package.appxmanifest ${MANIFEST}) set(ResourceFiles ${CMAKE_BINARY_DIR}/Package.appxmanifest shell/uwp/flycast150.png shell/uwp/flycast50.png shell/uwp/flycast44.png shell/uwp/splash.png shell/uwp/flycast44.targetsize-48_altform-unplated.png shell/uwp/flycast44.targetsize-48_altform-lightunplated.png core/deps/SDL/src/main/winrt/SDL2-WinRTResource_BlankCursor.cur core/deps/SDL/src/main/winrt/SDL2-WinRTResources.rc) target_sources(${PROJECT_NAME} PRIVATE ${ResourceFiles} shell/uwp/http_client.cpp) if(NOT BUILD_TESTING) target_sources(${PROJECT_NAME} PRIVATE core/deps/SDL/src/main/winrt/SDL_winrt_main_NonXAML.cpp) endif() set_target_properties(${PROJECT_NAME} PROPERTIES RESOURCE "${ResourceFiles}") else() if(NOT BUILD_TESTING AND ("x86" IN_LIST ARCHITECTURE OR "x86_64" IN_LIST ARCHITECTURE)) target_include_directories(${PROJECT_NAME} PRIVATE core/deps/Spout/SPOUTSDK/SpoutGL) target_include_directories(${PROJECT_NAME} PRIVATE core/deps/Spout/SPOUTSDK/SpoutDirectX/SpoutDX) SET(SPOUT_BUILD_CMT OFF CACHE BOOL "For Visual Studio - build /MT to link runtime libraries" FORCE) SET(SPOUT_BUILD_SPOUTDX ON CACHE BOOL "Build SpoutDX DirectX11 support library" FORCE) SET(SPOUT_BUILD_LIBRARY OFF CACHE BOOL "Build C-compatible cross compiler library" FORCE) SET(SKIP_INSTALL_ALL ON CACHE BOOL "Install headers and libraries" FORCE) add_subdirectory(core/deps/Spout) target_link_libraries(${PROJECT_NAME} PRIVATE Spout_static SpoutDX_static) target_compile_definitions(${PROJECT_NAME} PRIVATE VIDEO_ROUTING) endif() target_sources(${PROJECT_NAME} PRIVATE shell/windows/flycast.rc) target_link_libraries(${PROJECT_NAME} PRIVATE dsound winmm ws2_32 wsock32 xinput9_1_0 cfgmgr32 wininet psapi) endif() endif() endif() if(BUILD_TESTING) add_subdirectory(core/deps/googletest EXCLUDE_FROM_ALL) add_subdirectory(tests) endif() if(NINTENDO_SWITCH) if(LIBRETRO) add_custom_target(combined ALL COMMAND ${CMAKE_AR} -x $ COMMAND ${CMAKE_AR} -x $ COMMAND ${CMAKE_AR} -x $ COMMAND ${CMAKE_AR} -x $ COMMAND ${CMAKE_AR} -x $ COMMAND ${CMAKE_AR} -rs flycast_libretro_libnx.a *.o COMMAND rm *.o WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} DEPENDS xxHash::xxhash chdr-static zip ${PROJECT_NAME}) else() nx_generate_nacp(flycast.nacp NAME "Flycast" AUTHOR "flyinghead, M4xw" VERSION "${GIT_VERSION}") nx_create_nro(flycast NACP flycast.nacp ICON "${CMAKE_SOURCE_DIR}/shell/switch/flycast.jpeg") endif() endif() if(IOS) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$-${CMAKE_OSX_SYSROOT}/Flycast.ipa" TYPE BIN) elseif(NINTENDO_SWITCH AND NOT LIBRETRO) install(FILES ${CMAKE_BINARY_DIR}/flycast.nro DESTINATION "${CMAKE_INSTALL_BINDIR}") elseif(LIBRETRO) install(TARGETS ${PROJECT_NAME} DESTINATION "${CMAKE_INSTALL_LIBDIR}/libretro") else() install(TARGETS ${PROJECT_NAME} DESTINATION "${CMAKE_INSTALL_BINDIR}") endif() if(UNIX AND NOT APPLE AND NOT ANDROID AND NOT LIBRETRO) install(FILES shell/linux/man/${PROJECT_NAME}.1 DESTINATION "${CMAKE_INSTALL_MANDIR}/man1" ) install(FILES shell/linux/${PROJECT_NAME}.desktop DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications" ) install(FILES shell/linux/${PROJECT_NAME}.png DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/pixmaps" ) install(FILES shell/linux/org.${PROJECT_NAME}.Flycast.metainfo.xml DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/metainfo" ) foreach(size 16 32 64 128 256 512) install(FILES shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-${size}.png DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/${size}x${size}/apps" RENAME ${PROJECT_NAME}.png ) endforeach() endif() if(${CMAKE_GENERATOR} MATCHES "^Xcode.*|^Visual Studio.*") file(GLOB_RECURSE SRC_FILES *.h *.cpp *.c *.cc *.mm) source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SRC_FILES}) endif()