cmake_minimum_required(VERSION 3.10)

# 雷达数据处理动态链接库
# 开发环境已由 Qt/qmake 迁移到 VS Code + CMake。
# 编译器保持为 Microsoft Visual C++ Compiler 12.0 (x86)。
project(data_process_class_dll LANGUAGES CXX)

# 扫描模式：
#   PHASE_SCANNING      -> 相扫雷达（X256_PS，原 Qt 工程默认激活配置）
#   MECHANICAL_SCANNING -> 机扫雷达（X256_MS）
# 用法：cmake -S . -B build -DRADAR_SCAN_MODE=PHASE_SCANNING
set(RADAR_SCAN_MODE "PHASE_SCANNING" CACHE STRING "Radar scan mode (PHASE_SCANNING or MECHANICAL_SCANNING)")
set_property(CACHE RADAR_SCAN_MODE PROPERTY STRINGS PHASE_SCANNING MECHANICAL_SCANNING)

if(NOT RADAR_SCAN_MODE STREQUAL "PHASE_SCANNING" AND NOT RADAR_SCAN_MODE STREQUAL "MECHANICAL_SCANNING")
    message(FATAL_ERROR "RADAR_SCAN_MODE 必须为 PHASE_SCANNING 或 MECHANICAL_SCANNING，当前值：${RADAR_SCAN_MODE}")
endif()

# 导出编译命令，便于 VS Code C/C++ 插件 IntelliSense 使用。
# Visual Studio 生成器不支持该选项，因此仅对 Makefile/Ninja 生成器开启。
if(NOT CMAKE_GENERATOR MATCHES "Visual Studio")
    set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
endif()

set(SOURCES
    data_process_class_dll/data_process_class_dll.cpp
    data_process_class_dll/data_process.cpp
    data_process_class_dll/dot_coh.cpp
    data_process_class_dll/kalman.cpp
    data_process_class_dll/coor_trans.cpp
    data_process_class_dll/track_asso.cpp
    data_process_class_dll/track_init.cpp
    data_process_class_dll/track_index_mangement.cpp
    data_process_class_dll/tas_ctrl.cpp
    data_process_class_dll/track_die.cpp
    data_process_class_dll/dot_coh_tas.cpp
    data_process_class_dll/track_asso_tas.cpp
    data_process_class_dll/track_init_direct_tracking.cpp
    data_process_class_dll/track_die_tas.cpp
)

set(PUBLIC_HEADERS
    data_process_class_dll/data_process_class_dll.h
    data_process_class_dll/data_process_class_dll_global.h
)

add_library(data_process_class_dll SHARED ${SOURCES})

# 编译 DLL 时定义导出宏；引用 DLL 的工程不应定义该宏。
target_compile_definitions(data_process_class_dll PRIVATE
    DATA_PROCESS_CLASS_DLL_LIBRARY
    ${RADAR_SCAN_MODE}
)

# 与 qmake 工程保持一致的 Windows 编译定义
if(WIN32)
    target_compile_definitions(data_process_class_dll PRIVATE
        WIN32
        _WINDOWS
        _UNICODE
        UNICODE
        NOMINMAX
    )
endif()

# Eigen 头文件位于源码目录下（<Eigen/Dense>）。
target_include_directories(data_process_class_dll PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/data_process_class_dll
)

# 原工程使用 MSVC 2013（Visual Studio 12）编译器；保持兼容，不强制更高 C++ 标准。
# 源码使用 C++11 特性（nullptr、类内成员初始化等），MSVC 2013 默认即可支持。

if(MSVC)
    # 与原 qmake 生成的编译选项保持一致。
    # 注意：MSVC 2013 的 Debug 运行库与 /Zc:strictStrings 同时使用会触发 STL 编译错误，
    # 原 qmake 工程也仅在 Release 配置中使用该选项。
    target_compile_options(data_process_class_dll PRIVATE
        /Zc:wchar_t
        /FS
        $<$<CONFIG:Release>:/Zc:strictStrings>
    )

    # 修复 C4819（源文件含当前代码页无法表示的字符）。
    # /utf-8 从 VS2015 Update 2 开始支持；本工程使用 MSVC 2013 时无该选项，
    # 通过为源码文件添加 UTF-8 BOM 解决 C4819，这里仅对支持 /utf-8 的新版 MSVC 开启。
    if(MSVC_VERSION GREATER_EQUAL 1900)
        target_compile_options(data_process_class_dll PRIVATE /utf-8)
    endif()
endif()

# 输出目录：build/bin 下为 DLL/PDB，build/lib 下为导入库。
set_target_properties(data_process_class_dll PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
    ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
    PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
    PUBLIC_HEADER "${PUBLIC_HEADERS}"
)

# 安装规则：DLL/导入库 -> bin/lib，公开头文件 -> include。
include(GNUInstallDirs)
install(TARGETS data_process_class_dll
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
