cmake_minimum_required(VERSION 3.20)
project(X360PS5XeniaProbe LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
option(X360_TARGET_PS5 "Compile Xenia core for PS5" OFF)
get_filename_component(ROOT "${CMAKE_CURRENT_LIST_DIR}/../.." ABSOLUTE)
set(XE "${ROOT}/.deps/xenia")
set(CMAKE_BUILD_TYPE Release CACHE STRING "" FORCE)
set(CAPSTONE_BUILD_SHARED OFF CACHE BOOL "" FORCE)
set(CAPSTONE_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(CAPSTONE_BUILD_CSTOOL OFF CACHE BOOL "" FORCE)
set(CAPSTONE_ARCHITECTURE_DEFAULT OFF CACHE BOOL "" FORCE)
set(CAPSTONE_X86_SUPPORT ON CACHE BOOL "" FORCE)
add_subdirectory("${XE}/third_party/capstone" capstone EXCLUDE_FROM_ALL)
add_subdirectory("${XE}/third_party/fmt" fmt EXCLUDE_FROM_ALL)
add_compile_definitions(XE_OPTION_PROFILING=0 XE_OPTION_PROFILING_UI=0 XBYAK_NO_OP_NAMES XBYAK_ENABLE_OMITTED_OPERAND)
add_compile_options(-mavx2 -mfma -mf16c -mbmi -mbmi2 -ffunction-sections -fdata-sections -fno-strict-aliasing)
include_directories("${XE}" "${XE}/src" "${XE}/third_party" "${XE}/third_party/llvm/include" "${XE}/third_party/capstone/include" "${ROOT}/src" "${ROOT}/build/host/generated")
if(X360_TARGET_PS5)
  include_directories(BEFORE "${ROOT}/build/ps5/xenia-overlay/src")
  add_compile_options(-iquote "${XE}/src/xenia/base" -include "${ROOT}/build/ps5/xenia-overlay/src/xenia/base/platform.h")
endif()
set(sources)
foreach(dir base cpu cpu/backend cpu/backend/x64 cpu/compiler cpu/compiler/passes cpu/hir cpu/ppc)
  file(GLOB group "${XE}/src/xenia/${dir}/*.cc")
  foreach(source IN LISTS group)
    if(source MATCHES "(_win|_mac|_android|_a64|_arm64|_test|_main|_demo|_gtk|_x11)\\.cc$" OR source MATCHES "main_init_|console_app_main_|elf_module\\.cc$|lzx\\.cc$")
      continue()
    endif()
    if(X360_TARGET_PS5 AND source MATCHES "/memory_posix\\.cc$|exception_handler_posix\\.cc$|clock_posix\\.cc$|system_gnulinux\\.cc$|profiling\\.cc$|threading_posix\\.cc$|filesystem_posix\\.cc$")
      continue()
    endif()
    list(APPEND sources "${source}")
  endforeach()
endforeach()
add_library(xenia-probe-core STATIC ${sources} "${XE}/src/xenia/memory.cc" "${XE}/src/xenia/kernel/xam/user_settings.cc" "${XE}/src/xenia/kernel/xam/user_data.cc")
target_link_libraries(xenia-probe-core PUBLIC fmt capstone)
if(X360_TARGET_PS5)
  target_sources(xenia-probe-core PRIVATE "${ROOT}/port/xenia/memory_ps5.cc" "${ROOT}/build/ps5/xenia-overlay/exception_handler_ps5.cc" "${ROOT}/build/ps5/xenia-overlay/clock_ps5.cc" "${ROOT}/build/ps5/xenia-overlay/threading_ps5.cc")
  add_library(xenia-probe-entry OBJECT "${ROOT}/src/xenia_core_probe.cpp")
  target_sources(xenia-probe-core PRIVATE "${ROOT}/port/xenia/system_ps5.cc")
  target_sources(xenia-probe-core PRIVATE "${ROOT}/build/ps5/xenia-overlay/filesystem_ps5.cc")
  target_compile_definitions(xenia-probe-entry PRIVATE X360_PS5=1)
  return()
endif()
add_executable(xenia-ppc-probe "${ROOT}/src/xenia_core_main.cpp" "${ROOT}/src/xenia_core_probe.cpp" "${ROOT}/src/diagnostics.cpp" "${ROOT}/src/platform.cpp" "${ROOT}/src/exception_probe.cpp" "${ROOT}/src/gpu_probe.cpp")
target_link_libraries(xenia-ppc-probe PRIVATE xenia-probe-core pthread dl)
target_link_options(xenia-ppc-probe PRIVATE -Wl,--gc-sections)
