# oracle —— 独立 Windows 工程（不在主 CMake 树内）。见 ../docs/steps/00-oracle.md、RUNBOOK.md
#
#   cmake -S oracle -B oracle/build -DGRANNY_SDK=<泄露 SDK 根>
#   cmake --build oracle/build --config Release
#
# GRANNY_SDK 默认指向本仓库同级的 MobileSource 里的 Granny-3D-SDK-main。
# 链 granny2_x64.lib（import lib）；运行时需要对应的 granny2_x64.dll 在 PATH / exe 目录。
# ⚠ 这个 DLL 是 SDK 2.9.12。资产由 2.4.0.7 导出（M0 T2 实测）。容器 + 组合公式在 2.4–2.11
#   稳定，但 B 样条边界 / 少数曲线细节可能有差异 —— 先跑 selfcheck（T7）确认坐标约定，
#   再决定是否要换成 2.4.x 的 runtime DLL（见 GRANNY-VERSION.md）。

cmake_minimum_required(VERSION 3.20)
project(xrender_oracle C)

set(CMAKE_C_STANDARD 11)

set(GRANNY_SDK "${CMAKE_SOURCE_DIR}/../../MobileSource/Cross Platform/Granny-3D-SDK-main"
    CACHE PATH "泄露 Granny SDK 根（含 include/ 和 lib/win64/）")

if(NOT EXISTS "${GRANNY_SDK}/include/granny.h")
    message(FATAL_ERROR "找不到 ${GRANNY_SDK}/include/granny.h —— 传 -DGRANNY_SDK=<SDK 根>")
endif()

add_executable(oracle oracle.c)
target_include_directories(oracle PRIVATE "${GRANNY_SDK}/include")

if(WIN32)
    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
        target_link_libraries(oracle PRIVATE "${GRANNY_SDK}/lib/win64/granny2_x64.lib")
        set(_dll "${GRANNY_SDK}/lib/win64/granny2_x64.dll")
    else()
        target_link_libraries(oracle PRIVATE "${GRANNY_SDK}/lib/win32/granny2.lib")
        set(_dll "${GRANNY_SDK}/lib/win32/granny2.dll")
    endif()
    # 把 DLL 拷到 exe 旁边，方便直接跑 / Wine
    add_custom_command(TARGET oracle POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_dll}" "$<TARGET_FILE_DIR:oracle>")
else()
    message(WARNING
        "非 Windows：SDK 只提供 win32/win64/wii/ps3/xenon 的 granny2 预编译库。\n"
        "  选项 A：在 Windows 机器 / VM 上 build+run。\n"
        "  选项 B：Wine（oracle 只做文件 IO + 数学 + 写二进制，不碰 GPU，Wine 够用）——\n"
        "          用 MinGW 交叉编译或直接在 Wine 里跑 MSVC，链 granny2_x64.lib。\n"
        "  选项 C（stretch）：从 SDK source/ 移植 winxx/ 平台层出一个 POSIX libgranny。\n"
        "  见 RUNBOOK.md。")
endif()
