cmake_minimum_required(VERSION 3.8)
project(hik_camera LANGUAGES CXX)

# 编译选项
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# 默认编译类型
if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE Debug CACHE STRING "Build type" FORCE)
endif()

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Debug / Release 参数
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g2 -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "-O3")


# ROS2 / 三方依赖
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rclcpp_components REQUIRED)
find_package(rclcpp_lifecycle REQUIRED)
find_package(sensor_msgs REQUIRED)
find_package(cv_bridge REQUIRED)
find_package(camera_info_manager REQUIRED)
find_package(image_transport REQUIRED)

find_package(OpenCV 4 REQUIRED)
find_package(Protobuf REQUIRED)
find_package(fmt REQUIRED)


# 头文件路径
set(PROJECT_INCLUDE_DIRS
  include
  sync_board_core/include
  third_party/httplib
  third_party/cxxopts
  third_party/mavlink
  proto_generated/cpp
  /opt/MVS/include
)


# 库搜索路径
link_directories(
  /opt/MVS/lib/64
)


# HikCamera 组件库
add_library(HikCamera SHARED
  src/hik_camera.cpp
)

target_include_directories(HikCamera
  PUBLIC
    ${PROJECT_INCLUDE_DIRS}
    ${Protobuf_INCLUDE_DIRS}
)

target_compile_definitions(HikCamera
  PRIVATE COMPOSITION_BUILDING_DLL
)

ament_target_dependencies(HikCamera
  rclcpp
  rclcpp_components
  rclcpp_lifecycle
  cv_bridge
  sensor_msgs
  camera_info_manager
  image_transport
)

rclcpp_components_register_nodes(
  HikCamera
  "camera::CameraNode"
)

add_executable(${PROJECT_NAME}
  src/main.cpp
  proto_generated/cpp/sync.pb.cc
)

target_link_libraries(${PROJECT_NAME}
  HikCamera
  pthread
  GCBase_gcc485_v3_0
  MvCameraControl
  MVGigEVisionSDK
  log4cpp_gcc485_v3_0
  MVRender
  Log_gcc485_v3_0
  MvUsb3vTL
  MediaProcess

  fmt::fmt
  ${Protobuf_LIBRARIES}
)

ament_target_dependencies(${PROJECT_NAME}
  rclcpp
)

install(TARGETS
  HikCamera
  ARCHIVE DESTINATION lib
  LIBRARY DESTINATION lib
  RUNTIME DESTINATION bin
)

install(TARGETS
  ${PROJECT_NAME}
  DESTINATION lib/${PROJECT_NAME}
)

install(DIRECTORY launch config
  DESTINATION share/${PROJECT_NAME}
)

ament_package()
