# CMakeLists.txt - cpp_custom_interface 构建配置
#
# 设计思想:
#   - 必须用 rosidl_generate_interfaces 自动生成 msg/srv/action 的 C++ + Python 代码
#   - 生成的代码会装到 install/cpp_custom_interface/include/...
#   - 然后被同包或跨包的 C++ 代码 include
#   - 库 + 可执行分离(便于测试只链接库)
#
# 参考:
#   - 自定义接口: https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Custom-ROS2-Interfaces.html

cmake_minimum_required(VERSION 3.16)
project(cpp_custom_interface LANGUAGES CXX C)

if(NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 17)
endif()

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# 必备: 找 ament_cmake + 依赖
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rclcpp_action REQUIRED)
find_package(std_msgs REQUIRED)
find_package(geometry_msgs REQUIRED)
find_package(rosidl_default_generators REQUIRED)

# 定义接口(关键步骤)
set(MSG_FILES "msg/SensorReading.msg")
set(SRV_FILES "srv/GetCalibration.srv")
set(ACTION_FILES "action/MoveArm.action")

rosidl_generate_interfaces(${PROJECT_NAME}
  ${MSG_FILES} ${SRV_FILES} ${ACTION_FILES}
  DEPENDENCIES std_msgs geometry_msgs
)

# C++ 库(只含类实现,不含 main)
add_library(${PROJECT_NAME}_core SHARED
  src/sensor_publisher.cpp
  src/calibration_server.cpp
  src/move_arm_server.cpp
)
target_include_directories(${PROJECT_NAME}_core PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include/${PROJECT_NAME}>
)
ament_target_dependencies(${PROJECT_NAME}_core
  rclcpp rclcpp_action
)
rosidl_get_typesupport_target(cpp_typesupport_cpp
  ${PROJECT_NAME} "rosidl_typesupport_cpp"
)
target_link_libraries(${PROJECT_NAME}_core ${cpp_typesupport_cpp})

# 可执行(main 单独文件)
add_executable(sensor_publisher_cpp src/sensor_publisher_main.cpp)
target_link_libraries(sensor_publisher_cpp ${PROJECT_NAME}_core)

add_executable(calibration_server_cpp src/calibration_server_main.cpp)
target_link_libraries(calibration_server_cpp ${PROJECT_NAME}_core)

add_executable(move_arm_server_cpp src/move_arm_server_main.cpp)
target_link_libraries(move_arm_server_cpp ${PROJECT_NAME}_core)

# 安装
install(TARGETS
  sensor_publisher_cpp
  calibration_server_cpp
  move_arm_server_cpp
  ${PROJECT_NAME}_core
  DESTINATION lib/${PROJECT_NAME}
)
install(DIRECTORY launch
  DESTINATION share/${PROJECT_NAME}
)

# 测试
if(BUILD_TESTING)
  find_package(ament_cmake_gtest REQUIRED)
  ament_add_gtest(test_custom_interfaces test/test_custom_interfaces.cpp)
  ament_target_dependencies(test_custom_interfaces rclcpp rclcpp_action)
  target_link_libraries(test_custom_interfaces ${PROJECT_NAME}_core)
  rosidl_get_typesupport_target(cpp_typesupport_cpp
    ${PROJECT_NAME} "rosidl_typesupport_cpp"
  )
  target_link_libraries(test_custom_interfaces ${cpp_typesupport_cpp})
endif()

ament_package()