cmake_minimum_required(VERSION 3.24)

project(hunjing_lingtai VERSION 0.1.0 LANGUAGES CXX)

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

# 编译警告全开并视为错误（AGENTS.md 8.4）
if(MSVC)
  add_compile_options(/W4 /WX)
else()
  add_compile_options(-Wall -Wextra -Wpedantic -Wshadow -Wconversion -Wsign-conversion -Werror)
endif()

# 符号默认隐藏，仅导出 hj_*（API 卫生；由 HJ_API 宏显式导出）
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_VISIBILITY_INLINES_HIDDEN ON)

add_library(hunjing SHARED src/lingtai.cpp src/transform.cpp src/modules.cpp)
target_include_directories(hunjing
  PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include
  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)

# 单元测试（doctest，ADR-025）；单头直接引入，不用 FetchContent 拉网络
add_executable(lingtai_tests tests/test_main.cpp tests/test_core.cpp tests/test_transform.cpp
  tests/test_modules.cpp src/lingtai.cpp src/transform.cpp src/modules.cpp)
target_include_directories(lingtai_tests PRIVATE
  ${CMAKE_CURRENT_SOURCE_DIR}/include
  ${CMAKE_CURRENT_SOURCE_DIR}/src
  ${CMAKE_CURRENT_SOURCE_DIR}/third_party)

enable_testing()
add_test(NAME lingtai_tests COMMAND lingtai_tests)

# fuzz 目标（ADR-025：hj_transform 为必测目标；需要 clang libFuzzer）
option(HJ_BUILD_FUZZER "Build libFuzzer targets" OFF)
if(HJ_BUILD_FUZZER)
  add_executable(fuzz_transform fuzz/fuzz_transform.cpp src/lingtai.cpp src/transform.cpp
    src/modules.cpp)
  target_include_directories(fuzz_transform PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/include
    ${CMAKE_CURRENT_SOURCE_DIR}/src)
  target_compile_options(fuzz_transform PRIVATE -fsanitize=fuzzer,address -g)
  target_link_options(fuzz_transform PRIVATE -fsanitize=fuzzer,address)
endif()
