# mcla - ReXGlue Recompiled Project
#
# SDK boilerplate lives in generated/rexglue.cmake.

cmake_minimum_required(VERSION 3.25)
project(mcla LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include(generated/rexglue.cmake)

# Sources
set(MCLA_SOURCES
    src/main.cpp
    src/mcla_app.cpp
    src/crash_trace.cpp
    src/audio_fallback.cpp
    src/frame_timing.cpp
    src/render_perf.cpp
    src/perf_options.cpp
    src/warp_fix.cpp
    src/button_prompts.cpp
    src/settings_menu.cpp
    src/sampling_profiler.cpp
    src/native_metal/capture.cpp
    src/native_metal/shader_identity.cpp
    src/code_pointer_scan.cpp
)

if(WIN32)
    add_executable(mcla WIN32 ${MCLA_SOURCES})
else()
    add_executable(mcla ${MCLA_SOURCES})
endif()

# The Xenos plugin is loaded at runtime, so it must be staged explicitly.
rexglue_setup_target(mcla GPU_PLUGINS xenos)

if(APPLE)
    # Independent of game codegen; tests the same SDL backend and mapping file.
    add_executable(mcla_controller_check EXCLUDE_FROM_ALL tools/controller_check.cpp)
    target_link_libraries(mcla_controller_check PRIVATE SDL3::SDL3)
endif()

if(WIN32)
    # timeBeginPeriod for the frame limiter.
    target_link_libraries(mcla PRIVATE winmm)
endif()

# Experimental title-native Metal path. The ordinary build remains available.
option(MCLA_NATIVE_METAL "Build the experimental macOS title-native Metal adapter" OFF)
set(MCLA_METAL_SHADER_DIR "${CMAKE_SOURCE_DIR}/out/native-metal/prepared" CACHE PATH "Locally prepared native shader sources (never distributed)")
if(MCLA_NATIVE_METAL)
    if(NOT APPLE)
        message(FATAL_ERROR "MCLA_NATIVE_METAL requires macOS")
    endif()
    if(NOT EXISTS "${MCLA_METAL_SHADER_DIR}/mcla_metal_shader_info.h")
        message(FATAL_ERROR "Prepare the local native shader corpus first")
    endif()
    enable_language(OBJCXX)
    set(MCLA_METAL_ROOT "${CMAKE_SOURCE_DIR}/src/native_metal/renderer")
    set(MCLA_METAL_SOURCES
        ${MCLA_METAL_ROOT}/MCLAMetalRenderer.mm
        ${MCLA_METAL_ROOT}/MCLANativeRenderer.cpp
        ${MCLA_METAL_ROOT}/mac_host.mm
        ${MCLA_METAL_ROOT}/mac_performance.cpp
        ${MCLA_METAL_ROOT}/mac_gpu.cpp
        ${MCLA_METAL_ROOT}/mac_hooks.cpp
        ${MCLA_METAL_ROOT}/mac_bridge.cpp
        ${MCLA_METAL_ROOT}/texture_conversion.cpp
        ${MCLA_METAL_ROOT}/texture_info.cpp
        ${MCLA_METAL_ROOT}/texture_util.cpp)
    target_sources(mcla PRIVATE ${MCLA_METAL_SOURCES})
    # Keep feature flags local to the host adapter, so enabling Metal does not
    # invalidate/recompile the 120 generated guest translation units.
    set_source_files_properties(${MCLA_METAL_SOURCES} src/mcla_app.cpp src/settings_menu.cpp src/native_metal/capture.cpp
        PROPERTIES COMPILE_DEFINITIONS "MCLA_NATIVE_METAL=1;MCLA_DIRECT_METAL=1;MCLA_NATIVE_TITLE=1;MCLA_SMAA_LAB=1;MCLA_XENOS_RUNTIME_LINKED=0;MCLA_METAL_SHADER_DIR=\"${MCLA_METAL_SHADER_DIR}\""
        INCLUDE_DIRECTORIES "${MCLA_METAL_ROOT};${MCLA_METAL_ROOT}/include;${MCLA_METAL_ROOT}/foundation;${MCLA_METAL_SHADER_DIR}")
    set_source_files_properties(${MCLA_METAL_ROOT}/MCLAMetalRenderer.mm ${MCLA_METAL_ROOT}/mac_host.mm
        PROPERTIES COMPILE_OPTIONS "-fobjc-arc" COMPILE_FLAGS "-std=c++23")
    target_link_libraries(mcla PRIVATE "-framework Metal" "-framework QuartzCore" "-framework Foundation" "-framework AppKit" "-framework CoreGraphics")
endif()
