cmake_minimum_required(VERSION 3.25)

# ============================================================
# 检测项目 git 仓库当前最新 tag，用 tag 作为 CMake 项目版本号
# （与上级 quant1x 仓库同款解法，autochangelog 打 v0.0.x tag 后
#   版本号自动跟随，无需手动维护 CMakeLists 内嵌版本）
# ============================================================
include(cmake/git_tag_info.cmake)
get_latest_git_tag_info(VERSION_FROM_GIT LATEST_TAG TAG_COMMIT_HASH GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE)

project(mopr
    VERSION ${VERSION_FROM_GIT}
    DESCRIPTION "MOPR - 单仓最优可移植运行时"
    LANGUAGES CXX)

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

# 单配置收敛：默认仅 Release（本仓库 conan 只装 Release 配置的依赖），避免 VS
# 多配置生成器对未安装的 Debug/MinSizeRel/RelWithDebInfo 报 "IMPORTED_LOCATION not set"。
# 不带 FORCE：可被 CMakePresets.json 或 -DCMAKE_CONFIGURATION_TYPES=Debug 覆盖，
# 以便在独立目录（debug/）下做 Debug 构建，见仓库根 CMakePresets.json。
set(CMAKE_CONFIGURATION_TYPES Release CACHE STRING "默认仅构建 Release 单配置")

# 导出 compile_commands.json，供 clangd / IDE 解析 conan 注入的 include 路径
# （仓库根放置软链后，clangd 即可找到 fmt/format.h 等第三方头文件）
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# 由 conan install 生成的 CMakeToolchain 已把 fmt 的 config 路径注入
# CMAKE_PREFIX_PATH，这里直接按 CONFIG 模式查找。
find_package(fmt CONFIG REQUIRED)

# ============================================================
# C++ 库 mopr_core：收录 runtime / base / distributed 目录的 C++ 代码
#
# 目录与 Go / Rust / Python 平铺布局一致（runtime/ base/ distributed/），
# 头文件互引采用仓库根相对路径（如 "base/platform.h"、"runtime/ringbuffer.h"），
# 故把仓库根设为 include 目录并 PUBLIC 传播给使用方。
#
# 说明：
# - runtime/ringbuffer.h 为纯头文件模板实现（runtime::ringbuffer::queue<T>），
#   无需编译单元，仅随头文件使用方实例化；
# - base/ 提供 platform（跨平台收敛：_r/_s 类函数、环境变量、sleep/对齐分配等）
#   与 mmap（状态文件共享映射）。
# ============================================================
add_library(mopr_core STATIC
    # base
    base/platform.cpp
    base/mmap.cpp
    # distributed/id
    distributed/id/crc32.cpp
    distributed/id/error.cpp
    distributed/id/generator.cpp
    distributed/id/hlc.cpp
    distributed/id/id.cpp
    distributed/id/queue.cpp
    distributed/id/state_store.cpp)

target_include_directories(mopr_core PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

# 库声明 fmt（PUBLIC：头文件链与将来库内使用 fmt 的场景直接继承）
target_link_libraries(mopr_core PUBLIC fmt::fmt)

# 本机存在 vcpkg 的用户级 MSBuild 集成（vcpkg.user.props/targets），会以同名
# fmt.lib（vcpkg 动态导入库）劫持 conan 静态 fmt.lib 的链接。此处给生成的
# vcxproj 注入 <VcpkgEnabled>false</VcpkgEnabled>，仅对本工程关闭 vcpkg 集成，
# 不影响其它项目。
set_property(TARGET mopr_core PROPERTY VS_GLOBAL_VcpkgEnabled "false")

# ============================================================
# 主程序 mopr：仓库根 main.cpp（与 Rust main.rs 同目录，去掉 src/ 层，
# 保持各语言入口路径一致）。链接 mopr_core，同时直接使用 fmt 输出。
# ============================================================
add_executable(mopr main.cpp)

target_link_libraries(mopr PRIVATE mopr_core fmt::fmt)

set_property(TARGET mopr PROPERTY VS_GLOBAL_VcpkgEnabled "false")
