cmake_minimum_required(VERSION 3.25)
project(sots-engine LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# Build id stamped into the shim log banner (tools/build-shim.sh passes git describe + UTC time).
set(SHIM_BUILD_ID "dev" CACHE STRING "Build identifier logged by the shim")

# Provenance of the binary facts: the generated header's own "Source:" line, forwarded verbatim
# so every shim.log records which RE snapshot the RVAs came from.
file(STRINGS include/generated/sots_addresses.h _addr_provenance REGEX "^// Source:")
list(GET _addr_provenance 0 _addr_provenance)
string(REGEX REPLACE "^// " "" SOTS_ADDR_PROVENANCE "${_addr_provenance}")

add_library(sots_addresses INTERFACE)
target_include_directories(sots_addresses INTERFACE ${CMAKE_SOURCE_DIR}/include)

# ---- engine modules (host + cross): pure, oracle-verified code accrues here ----
add_subdirectory(src/mars/parse)   # brace-block + .effect readers   (lib mars_parse)
add_subdirectory(src/mars/text)    # flat-kv, id-manifest, csv       (lib mars_text)

if(WIN32)
  # ---- shim: proxy binkw32.dll that the original game loads (Phase 2 frontend) ----
  add_library(minhook STATIC
    third_party/minhook/src/buffer.c
    third_party/minhook/src/hook.c
    third_party/minhook/src/trampoline.c
    third_party/minhook/src/hde/hde32.c)
  target_include_directories(minhook PUBLIC third_party/minhook/include)

  add_library(binkw32 SHARED src/shim/main.cpp src/shim/binkw32.def)
  target_link_libraries(binkw32 PRIVATE minhook sots_addresses)
  target_compile_definitions(binkw32 PRIVATE
    SHIM_BUILD_ID="${SHIM_BUILD_ID}"
    SOTS_ADDR_PROVENANCE="${SOTS_ADDR_PROVENANCE}")
  # Must be exactly binkw32.dll (no "lib" prefix); export names come solely from the .def.
  set_target_properties(binkw32 PROPERTIES PREFIX "" OUTPUT_NAME "binkw32")
else()
  # ---- host: engine module tests (ctest) + a header smoke test ----
  enable_testing()
  add_executable(addr_smoke tests/addr_smoke.cpp)
  target_link_libraries(addr_smoke PRIVATE sots_addresses)
  add_test(NAME addr_smoke COMMAND addr_smoke)
  foreach(_t mars_parse mars_text)
    if(EXISTS ${CMAKE_SOURCE_DIR}/tests/${_t}/CMakeLists.txt)
      add_subdirectory(tests/${_t})
    endif()
  endforeach()
endif()
