# CMakeLists.txt - 多路摄像头校准系统构建配置
# 适用环境: Ubuntu 20.04 LTS / OpenCV 4.2+ / GCC 9+ / C++17
cmake_minimum_required(VERSION 3.16)
project(multicam_calib LANGUAGES CXX)

# ================= 基础配置 =================
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF) # 严格遵循 ISO C++17，禁用 GNU 扩展

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type (Debug/Release)" FORCE)
endif()

# ================= 依赖查找 =================
# OpenCV 4.2+ (Ubuntu 20.04 官方源默认版本)
find_package(OpenCV 4.2 REQUIRED COMPONENTS 
    core imgproc videoio calib3d highgui)

# POSIX 线程
find_package(Threads REQUIRED)

# 可选：硬件触发模块支持
option(USE_ADV_TRIGGER "Enable hardware trigger support (requires libadv_trigger)" OFF)

# ================= 源文件定义 =================
set(SOURCES
    src/main.cpp
    src/camera_capture.cpp
    src/calibrator.cpp
    src/yaml_exporter.cpp
    src/trigger_controller.cpp
    # 如需录制功能，取消下行注释
    # src/recorder.cpp
)

add_executable(${PROJECT_NAME} ${SOURCES})

# ================= 头文件路径 =================
target_include_directories(${PROJECT_NAME} PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/include
    ${OpenCV_INCLUDE_DIRS}
)

# ================= 链接库 =================
target_link_libraries(${PROJECT_NAME} PRIVATE
    ${OpenCV_LIBRARIES}
    Threads::Threads
    rt          # clock_gettime 支持
)

# ================= 硬件触发条件编译 =================
if(USE_ADV_TRIGGER)
    target_compile_definitions(${PROJECT_NAME} PRIVATE USE_ADV_TRIGGER)
    
    set(ADV_TRIGGER_INC "${CMAKE_CURRENT_SOURCE_DIR}/lib/include")
    set(ADV_TRIGGER_LIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/adv_trigger/libadv_trigger.a")

    # 安全校验：库文件必须存在
    if(NOT EXISTS ${ADV_TRIGGER_LIB})
        message(FATAL_ERROR 
            "❌ 硬件触发库未找到: ${ADV_TRIGGER_LIB}\n"
            "请确保库文件已放置，或使用 cmake .. -DUSE_ADV_TRIGGER=OFF 编译"
        )
    endif()

    target_include_directories(${PROJECT_NAME} PRIVATE ${ADV_TRIGGER_INC})
    target_link_libraries(${PROJECT_NAME} PRIVATE ${ADV_TRIGGER_LIB})
    message(STATUS "✅ Hardware trigger ENABLED")
    message(STATUS "#####: ${ADV_TRIGGER_INC}\n")
else()
    message(STATUS "⚠️  Hardware trigger DISABLED (Software mode active)")
endif()

# ================= 编译选项 =================
target_compile_options(${PROJECT_NAME} PRIVATE
    -Wall -Wextra -Wpedantic
    # Release 优化：O3 + 针对当前CPU指令集优化 (嵌入式ARM平台请移除 -march=native)
    $<$<CONFIG:Release>:-O3 -march=native>
    $<$<CONFIG:Debug>:-g -O0 -DDEBUG>
)

# ================= 状态输出 =================
message(STATUS "========================================")
message(STATUS "Project      : ${PROJECT_NAME}")
message(STATUS "OpenCV       : ${OpenCV_VERSION} (${OpenCV_INCLUDE_DIRS})")
message(STATUS "C++ Standard : ${CMAKE_CXX_STANDARD}")
message(STATUS "Build Type   : ${CMAKE_BUILD_TYPE}")
message(STATUS "Trigger Mode : ${USE_ADV_TRIGGER}")
message(STATUS "========================================")

# ================= 安装规则（可选） =================
install(TARGETS ${PROJECT_NAME} DESTINATION bin)
install(DIRECTORY include/ DESTINATION include/${PROJECT_NAME})