cmake_minimum_required(VERSION 3.31)
set(CMAKE_CXX_STANDARD 11)
project(MIA)

# ----------------------- 调试相关设置 -----------------------
# 默认构建类型为 Debug，如果没指定就用 Debug（带调试信息、无优化）
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Debug)
endif()

# Debug 模式下：添加 -g（调试符号），关闭优化，开启更多警告
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -Wextra")

# 强烈推荐：开启 AddressSanitizer（能精准定位段错误、缓冲区溢出等内存问题）
# macOS 和 Linux 的 clang/gcc 都支持
option(ENABLE_ASAN "Enable AddressSanitizer" ON)
if(ENABLE_ASAN)
    if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU")
        add_compile_options(-fsanitize=address)
        add_link_options(-fsanitize=address)
    endif()
endif()

# 可选：开启 UndefinedBehaviorSanitizer（检测未定义行为，如整数溢出、移位越界等）
option(ENABLE_UBSAN "Enable UndefinedBehaviorSanitizer" OFF)
if(ENABLE_UBSAN)
    add_compile_options(-fsanitize=undefined)
    add_link_options(-fsanitize=undefined)
endif()

# ----------------------- Python 配置 -----------------------
find_package(Python3 COMPONENTS Interpreter Development REQUIRED)

if(Python3_FOUND)
    message(STATUS "Python include directory: ${Python3_INCLUDE_DIRS}")
    message(STATUS "Python libraries: ${Python3_LIBRARIES}")
    
    # 现代 CMake 推荐使用 target_* 而不是全局 include/link
    # 但为了保持和你原代码类似，先用全局方式
    include_directories(${Python3_INCLUDE_DIRS})
    link_libraries(${Python3_LIBRARIES})
endif()

# ----------------------- pybind11 头文件 -----------------------
include_directories(${PROJECT_SOURCE_DIR}/pybind11/include)

# ----------------------- 文件复制 -----------------------
configure_file(${PROJECT_SOURCE_DIR}/tensor_py.py ${CMAKE_CURRENT_BINARY_DIR}/tensor_py.py COPYONLY)
# 注意：如果你还有一个叫 tensor_py 的目录或文件，也复制
configure_file(${PROJECT_SOURCE_DIR}/tensor_py ${CMAKE_CURRENT_BINARY_DIR}/tensor_py COPYONLY)

# ----------------------- 源文件列表 -----------------------
set(SOURCES
    main.cpp
    tensor.cpp
    algorithm.cpp
    base.cpp
    fcm.cpp
    featureSelect.cpp
    Node.cpp
    procedure.cpp
    RandomForest.cpp
    reduction.cpp
    Sample.cpp
    Tree.cpp
    ALGLIB/alglibinternal.cpp
    ALGLIB/linalg.cpp
    ALGLIB/integration.cpp
    ALGLIB/alglibmisc.cpp
    ALGLIB/optimization.cpp
    ALGLIB/interpolation.cpp
    ALGLIB/ap.cpp
    ALGLIB/solvers.cpp
    ALGLIB/kernels_avx2.cpp
    ALGLIB/dataanalysis.cpp
    ALGLIB/specialfunctions.cpp
    ALGLIB/kernels_fma.cpp
    ALGLIB/diffequations.cpp
    ALGLIB/statistics.cpp
    ALGLIB/kernels_sse2.cpp
    ALGLIB/fasttransforms.cpp
    # 头文件不需要加到 add_executable，但如果你想让 IDE 识别可以加
    # tensor.h
)

# ----------------------- 生成可执行文件 -----------------------
add_executable(${PROJECT_NAME} ${SOURCES})

# 现代做法（推荐）：使用 target_* 把 Python 依赖绑定到目标上
target_include_directories(${PROJECT_NAME} PRIVATE ${Python3_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} PRIVATE ${Python3_LIBRARIES})