# 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)

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()

# 1) 找依赖
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)

# 2) 定义接口(关键步骤)
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
  ADD_LINTER_TESTS
)

# 3) C++ 库(节点代码)
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_typesupport_cpp"
)
rosidl_target_interfaces(${PROJECT_NAME}_core
  ${PROJECT_NAME} "rosidl_typesupport_cpp"
)

# 4) 可执行
add_executable(sensor_publisher_cpp src/sensor_publisher.cpp)
target_link_libraries(sensor_publisher_cpp ${PROJECT_NAME}_core)

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

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

# 5) 安装
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}
)

ament_package()