# CMakeLists.txt - cpp_pubsub 包构建配置
#
# 设计思想:
#   - 显式声明每个依赖(不靠 ros2_defaults 的隐式传递)
#   - 启用 -Wall -Wextra -Wpedantic(严格编译警告)
#   - 库 + 可执行文件分离(便于测试只链接库)
#   - 测试用 ament_add_gtest(集成 colcon test)
#
# 参考:
#   - ament_cmake 用户指南: https://docs.ros.org/en/humble/Concepts/About-Build-System.html
#   - ROS2 C++ Style: https://docs.ros.org/en/humble/Contributing/Code-Style-Language-Versions.html

cmake_minimum_required(VERSION 3.16)
project(cpp_pubsub 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()

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

set(THIS_PACKAGE_INCLUDE_DEPENDS
  rclcpp
  std_msgs
)

# 库:只含 ChatterPublisher / ChatterSubscriber 类实现(无 main)
add_library(${PROJECT_NAME}_core SHARED
  src/chatter_publisher.cpp
  src/chatter_subscriber.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 ${THIS_PACKAGE_INCLUDE_DEPENDS})

# 可执行文件:每个 main 单独编译
add_executable(chatter_publisher_cpp src/chatter_publisher_main.cpp)
target_link_libraries(chatter_publisher_cpp ${PROJECT_NAME}_core)

add_executable(chatter_subscriber_cpp src/chatter_subscriber_main.cpp)
target_link_libraries(chatter_subscriber_cpp ${PROJECT_NAME}_core)

# 安装:可执行 + 库 + launch
install(TARGETS
  chatter_publisher_cpp
  chatter_subscriber_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_pub_sub test/test_pub_sub.cpp)
  ament_target_dependencies(test_pub_sub ${THIS_PACKAGE_INCLUDE_DEPENDS})
  target_link_libraries(test_pub_sub ${PROJECT_NAME}_core)
endif()

ament_package()