cmake_minimum_required(VERSION 3.10)
project(pyaac_core_build)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Python COMPONENTS Interpreter Development REQUIRED)
execute_process(
    COMMAND python3 -c "import pybind11; print(pybind11.get_cmake_dir())"
    OUTPUT_VARIABLE PYBIND11_PATH
    OUTPUT_STRIP_TRAILING_WHITESPACE
)
list(APPEND CMAKE_PREFIX_PATH "${PYBIND11_PATH}")
find_package(pybind11 REQUIRED)

set(CMAKE_DEBUG_POSTFIX "")
set(CMAKE_RELEASE_POSTFIX "")

if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
    set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE)
endif()

# 跨平台优化选项
if(WIN32)
    add_definitions(-DNOMINMAX -DDOACALC_EXPORTS)
    add_definitions(-DNOMINMAX)
    set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG")
else()
    # Linux / Jetson ARM64 高性能参数
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -Ofast -mcpu=native -mtune=native")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffast-math -funroll-loops -fomit-frame-pointer")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto -fno-stack-protector")
endif()

# ==========================
# 头文件路径（全平台通用）
# ==========================
include_directories(
    ${PROJECT_SOURCE_DIR}
    ${PROJECT_SOURCE_DIR}/include
    ${PROJECT_SOURCE_DIR}/include/eigen-5.0.0
)

# ==========================
# 自动判断平台
# ==========================
if(WIN32)
    # Windows x64
    link_directories(
        ${PROJECT_SOURCE_DIR}/lib/windows_x64/sndfile
        ${PROJECT_SOURCE_DIR}/lib/windows_x64/DOA
    )
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
    # ARM64
    link_directories(
        ${PROJECT_SOURCE_DIR}/lib/arm64/sndfile
        ${PROJECT_SOURCE_DIR}/lib/arm64/DOA
    )
else()
    # Linux x86_64
    link_directories(
        ${PROJECT_SOURCE_DIR}/lib/linux64/sndfile
        ${PROJECT_SOURCE_DIR}/lib/linux64/DOA
    )
endif()

pybind11_add_module(pyaac_core src_cpp/binding.cpp)

if(WIN32)
    target_link_libraries(pyaac_core PRIVATE
        DOACalc.lib    # 你的 DOA 算法静态库
        sndfile.lib    # 音频读写库
    )
else()
    target_link_libraries(pyaac_core PRIVATE
        DOACalc        # Linux 静态库自动补全 libDOACalc.a
        sndfile        # 自动补全 libsndfile.a
        -lm            # 数学库
        -pthread       # 线程库
    )
endif()

if(UNIX)
    set_target_properties(pyaac_core PROPERTIES
        INSTALL_RPATH "$ORIGIN"
        BUILD_WITH_INSTALL_RPATH TRUE
    )
endif()

set(PROJECT_OUTPUT_DIR "${PROJECT_BINARY_DIR}")

foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
    string(TOUPPER ${OUTPUTCONFIG} UPPERCONFIG)
    set_target_properties(pyaac_core PROPERTIES
        LIBRARY_OUTPUT_DIRECTORY_${UPPERCONFIG} "${PROJECT_OUTPUT_DIR}"
        RUNTIME_OUTPUT_DIRECTORY_${UPPERCONFIG} "${PROJECT_OUTPUT_DIR}"
    )
endforeach()

set_target_properties(pyaac_core PROPERTIES
    LIBRARY_OUTPUT_DIRECTORY "${PROJECT_OUTPUT_DIR}"
    RUNTIME_OUTPUT_DIRECTORY "${PROJECT_OUTPUT_DIR}"
)

if(WIN32)
    add_custom_command(TARGET pyaac_core POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy
        "${PROJECT_SOURCE_DIR}/lib/windows_x64/DOA/DOACalc.dll"
        "${PROJECT_OUTPUT_DIR}"
    )
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
    add_custom_command(TARGET pyaac_core POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy
        "${PROJECT_SOURCE_DIR}/lib/arm64/DOA/libDOACalc.so"
        "${PROJECT_OUTPUT_DIR}"
    )
else()
    add_custom_command(TARGET pyaac_core POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy
        "${PROJECT_SOURCE_DIR}/lib/linux64/DOA/libDOACalc.so"
        "${PROJECT_OUTPUT_DIR}"
    )
endif()
