cmake_minimum_required(VERSION 3.10)
project(FaceDetectionApp)

# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 若未指定构建类型，默认使用 Release
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
endif()

# 默认导出 compile_commands.json（便于 IDE/clangd 索引）
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# ============================================================================
# 0. SIMD 加速选项（作用于 libfacedetection 动态库）
#    X86/X64 CPU:  cmake -DENABLE_AVX2=ON 或 -DENABLE_AVX512=ON
#    ARM CPU:      cmake -DENABLE_NEON=ON
#    开启后会自动定义对应宏并添加编译器指令集标志，无需手动改头文件。
#    AVX512 / AVX2 / NEON 三者互斥（与头文件中的 #error 检查一致）。
# ============================================================================
set(ENABLE_AVX2   ON  CACHE BOOL "Enable AVX2 acceleration (X64 CPU)")
set(ENABLE_AVX512 OFF CACHE BOOL "Enable AVX512 acceleration (X64 CPU)")
set(ENABLE_NEON   OFF CACHE BOOL "Enable NEON acceleration (ARM CPU)")

# 三者最多只能开启其中一个
set(_SIMD_ENABLED_COUNT 0)
foreach(_simd_opt ENABLE_AVX512 ENABLE_AVX2 ENABLE_NEON)
    if(${_simd_opt})
        math(EXPR _SIMD_ENABLED_COUNT "${_SIMD_ENABLED_COUNT} + 1")
    endif()
endforeach()
if(_SIMD_ENABLED_COUNT GREATER 1)
    message(FATAL_ERROR "ENABLE_AVX512 / ENABLE_AVX2 / ENABLE_NEON 三者互斥，最多只能开启其中一个。")
endif()

# 检测编译器是否支持 -mfpu=neon：
#   - 32 位 ARM (armhf) 需要该标志才能使用 arm_neon.h 内联函数；
#   - AArch64 下 NEON 默认开启，x86 不识别该标志，这两种情况检测结果均为否。
include(CheckCXXCompilerFlag)
check_cxx_compiler_flag("-mfpu=neon" CXX_HAS_MFPU_NEON)

# ============================================================================
# 1. 依赖查找
# ============================================================================
find_package(OpenCV REQUIRED)        # app / network_camera_receiver 需要
find_package(OpenMP)                 # libfacedetection 可选加速
find_package(Threads REQUIRED)       # network_camera_receiver 后台线程 / app

message(STATUS "Found OpenCV Version: ${OpenCV_VERSION}")
if(OpenMP_FOUND)
    message(STATUS "Found OpenMP CXX: ${OpenMP_CXX_VERSION}")
else()
    message(STATUS "OpenMP not found, building without OpenMP support.")
endif()
message(STATUS "Threads library enabled.")

# ============================================================================
# 2. 子模块
#    libfacedetection       -> SHARED 动态库（人脸检测）
#    network_camera_receiver-> STATIC 静态库（仅抓帧）
#    app                    -> 可执行程序（编排 收帧->检测->显示）
# ============================================================================
add_subdirectory(libfacedetection)
add_subdirectory(network_camera_receiver)
add_subdirectory(app)
