Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 99 additions & 0 deletions cmake/ROS2MedkitCompat.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
# medkit_find_cpp_httplib() — Find cpp-httplib, create cpp_httplib_target alias
# medkit_detect_compat_defs() — Detect rclcpp/rosbag2 versions, set compat variables
# medkit_apply_compat_defs(target) — Apply compile definitions to a target
# medkit_target_dependencies(target ...) - Drop-in ament_target_dependencies replacement
#
# Variables set by medkit_detect_compat_defs():
# MEDKIT_RCLCPP_VERSION_MAJOR — integer (e.g., 16 for Humble, 28 for Jazzy)
Expand Down Expand Up @@ -159,3 +160,101 @@ function(medkit_apply_compat_defs target)
target_compile_definitions(${target} PRIVATE ROSBAG2_USE_OLD_TIMESTAMP_FIELD)
endif()
endfunction()

# ---------------------------------------------------------------------------
# medkit_target_dependencies(target [PUBLIC|PRIVATE|INTERFACE] dep1 dep2 ...)
# ---------------------------------------------------------------------------
# Drop-in replacement for ament_target_dependencies that works on Rolling
# (where ament_target_dependencies was removed from ament_cmake).
#
# On Humble/Jazzy: delegates to ament_target_dependencies (available).
# On Rolling: uses target_link_libraries with ${dep_TARGETS}.
#
# When no visibility keyword (PUBLIC/PRIVATE/INTERFACE) is passed, the macro
# uses the plain target_link_libraries signature. This avoids conflicts with
# ament_add_gtest_executable, which also uses the plain signature internally.
# When an explicit visibility keyword IS passed, the keyword signature is used.
#
# Special cases:
# yaml_cpp_vendor - vendor package, no _TARGETS; links yaml-cpp::yaml-cpp
# (must call medkit_find_yaml_cpp() first)
# ---------------------------------------------------------------------------
macro(medkit_target_dependencies target)
if(COMMAND ament_target_dependencies)
ament_target_dependencies(${target} ${ARGN})
else()
# Rolling fallback: resolve dependency targets explicitly.
#
# CMake forbids mixing the "plain" and "keyword" (PUBLIC/PRIVATE/INTERFACE)
# signatures of target_link_libraries on the same target.
# ament_add_gtest_executable uses the plain signature internally, so we must
# also use the plain signature when no explicit visibility is requested.
# When the caller passes PUBLIC/PRIVATE/INTERFACE, we honour it (keyword form).
set(_mtd_has_visibility FALSE)
set(_mtd_visibility "")
set(_mtd_plain_deps)
set(_mtd_public_deps)
set(_mtd_private_deps)
set(_mtd_interface_deps)
foreach(_mtd_arg ${ARGN})
if(_mtd_arg STREQUAL "PUBLIC" OR _mtd_arg STREQUAL "PRIVATE" OR _mtd_arg STREQUAL "INTERFACE")
set(_mtd_has_visibility TRUE)
set(_mtd_visibility ${_mtd_arg})
else()
# Resolve dependency to concrete CMake targets
set(_mtd_dep_targets)
if(_mtd_arg STREQUAL "yaml_cpp_vendor")
# yaml_cpp_vendor is a wrapper package - link the real target
list(APPEND _mtd_dep_targets yaml-cpp::yaml-cpp)
else()
# Standard ament package - prefer exported <dep>_TARGETS, fall back to <dep>::<dep>
set(_mtd_targets_var "${_mtd_arg}_TARGETS")
if(DEFINED ${_mtd_targets_var} AND NOT "${${_mtd_targets_var}}" STREQUAL "")
list(APPEND _mtd_dep_targets ${${_mtd_targets_var}})
elseif(TARGET ${_mtd_arg}::${_mtd_arg})
list(APPEND _mtd_dep_targets ${_mtd_arg}::${_mtd_arg})
else()
message(FATAL_ERROR
"[MedkitCompat] medkit_target_dependencies: could not resolve dependency '${_mtd_arg}' "
"for target '${target}'. Expected variable ${_mtd_arg}_TARGETS or imported target "
"${_mtd_arg}::${_mtd_arg}")
endif()
unset(_mtd_targets_var)
endif()
# Buffer resolved targets per visibility bucket
if(_mtd_visibility STREQUAL "PRIVATE")
list(APPEND _mtd_private_deps ${_mtd_dep_targets})
elseif(_mtd_visibility STREQUAL "INTERFACE")
list(APPEND _mtd_interface_deps ${_mtd_dep_targets})
elseif(_mtd_visibility STREQUAL "PUBLIC")
list(APPEND _mtd_public_deps ${_mtd_dep_targets})
else()
# No visibility keyword seen yet - use plain signature
list(APPEND _mtd_plain_deps ${_mtd_dep_targets})
endif()
unset(_mtd_dep_targets)
endif()
endforeach()
# Plain deps (no visibility keyword) - use plain signature to stay compatible
# with ament_add_gtest_executable and other plain target_link_libraries calls
if(_mtd_plain_deps)
target_link_libraries(${target} ${_mtd_plain_deps})
endif()
# Keyword deps - only emitted when caller explicitly specified visibility
if(_mtd_public_deps)
target_link_libraries(${target} PUBLIC ${_mtd_public_deps})
endif()
if(_mtd_private_deps)
target_link_libraries(${target} PRIVATE ${_mtd_private_deps})
endif()
if(_mtd_interface_deps)
target_link_libraries(${target} INTERFACE ${_mtd_interface_deps})
endif()
unset(_mtd_has_visibility)
unset(_mtd_visibility)
unset(_mtd_plain_deps)
unset(_mtd_public_deps)
unset(_mtd_private_deps)
unset(_mtd_interface_deps)
endif()
endmacro()
11 changes: 8 additions & 3 deletions src/ros2_medkit_diagnostic_bridge/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ if(ENABLE_COVERAGE)
endif()

find_package(ament_cmake REQUIRED)

# Multi-distro compatibility (Humble / Jazzy / Rolling)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../cmake")
include(ROS2MedkitCompat)

find_package(rclcpp REQUIRED)
find_package(diagnostic_msgs REQUIRED)
find_package(ros2_medkit_msgs REQUIRED)
Expand All @@ -47,7 +52,7 @@ target_include_directories(diagnostic_bridge_lib PUBLIC
$<INSTALL_INTERFACE:include>
)

ament_target_dependencies(diagnostic_bridge_lib
medkit_target_dependencies(diagnostic_bridge_lib
rclcpp
diagnostic_msgs
ros2_medkit_msgs
Expand All @@ -57,7 +62,7 @@ ament_target_dependencies(diagnostic_bridge_lib
# Executable
add_executable(diagnostic_bridge_node src/main.cpp)
target_link_libraries(diagnostic_bridge_node diagnostic_bridge_lib)
ament_target_dependencies(diagnostic_bridge_node rclcpp)
medkit_target_dependencies(diagnostic_bridge_node rclcpp)

# Install executable
install(TARGETS diagnostic_bridge_node
Expand Down Expand Up @@ -100,7 +105,7 @@ if(BUILD_TESTING)
# Unit tests
ament_add_gtest(test_diagnostic_bridge test/test_diagnostic_bridge.cpp)
target_link_libraries(test_diagnostic_bridge diagnostic_bridge_lib)
ament_target_dependencies(test_diagnostic_bridge rclcpp diagnostic_msgs ros2_medkit_msgs)
medkit_target_dependencies(test_diagnostic_bridge rclcpp diagnostic_msgs ros2_medkit_msgs)

if(ENABLE_COVERAGE)
target_compile_options(test_diagnostic_bridge PRIVATE --coverage -O0 -g)
Expand Down
10 changes: 5 additions & 5 deletions src/ros2_medkit_fault_manager/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ target_include_directories(fault_manager_lib PUBLIC
$<INSTALL_INTERFACE:include>
)

ament_target_dependencies(fault_manager_lib PUBLIC
medkit_target_dependencies(fault_manager_lib PUBLIC
rclcpp
ros2_medkit_msgs
ros2_medkit_serialization
Expand Down Expand Up @@ -125,22 +125,22 @@ if(BUILD_TESTING)
# Unit tests
ament_add_gtest(test_fault_manager test/test_fault_manager.cpp)
target_link_libraries(test_fault_manager fault_manager_lib)
ament_target_dependencies(test_fault_manager rclcpp ros2_medkit_msgs)
medkit_target_dependencies(test_fault_manager rclcpp ros2_medkit_msgs)

# SQLite storage tests
ament_add_gtest(test_sqlite_storage test/test_sqlite_storage.cpp)
target_link_libraries(test_sqlite_storage fault_manager_lib)
ament_target_dependencies(test_sqlite_storage rclcpp ros2_medkit_msgs)
medkit_target_dependencies(test_sqlite_storage rclcpp ros2_medkit_msgs)

# Snapshot capture tests
ament_add_gtest(test_snapshot_capture test/test_snapshot_capture.cpp)
target_link_libraries(test_snapshot_capture fault_manager_lib)
ament_target_dependencies(test_snapshot_capture rclcpp ros2_medkit_msgs)
medkit_target_dependencies(test_snapshot_capture rclcpp ros2_medkit_msgs)

# Rosbag capture tests
ament_add_gtest(test_rosbag_capture test/test_rosbag_capture.cpp)
target_link_libraries(test_rosbag_capture fault_manager_lib)
ament_target_dependencies(test_rosbag_capture rclcpp ros2_medkit_msgs)
medkit_target_dependencies(test_rosbag_capture rclcpp ros2_medkit_msgs)

# Correlation config parser tests
ament_add_gtest(test_correlation_config_parser test/test_correlation_config_parser.cpp)
Expand Down
9 changes: 7 additions & 2 deletions src/ros2_medkit_fault_reporter/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ if(ENABLE_COVERAGE)
endif()

find_package(ament_cmake REQUIRED)

# Multi-distro compatibility (Humble / Jazzy / Rolling)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../cmake")
include(ROS2MedkitCompat)

find_package(rclcpp REQUIRED)
find_package(ros2_medkit_msgs REQUIRED)

Expand All @@ -46,7 +51,7 @@ target_include_directories(fault_reporter_lib PUBLIC
$<INSTALL_INTERFACE:include>
)

ament_target_dependencies(fault_reporter_lib
medkit_target_dependencies(fault_reporter_lib
rclcpp
ros2_medkit_msgs
)
Expand Down Expand Up @@ -87,7 +92,7 @@ if(BUILD_TESTING)
# Unit tests
ament_add_gtest(test_local_filter test/test_local_filter.cpp)
target_link_libraries(test_local_filter fault_reporter_lib)
ament_target_dependencies(test_local_filter rclcpp ros2_medkit_msgs)
medkit_target_dependencies(test_local_filter rclcpp ros2_medkit_msgs)

if(ENABLE_COVERAGE)
target_compile_options(test_local_filter PRIVATE --coverage -O0 -g)
Expand Down
14 changes: 7 additions & 7 deletions src/ros2_medkit_gateway/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ add_library(gateway_lib STATIC
src/plugins/plugin_manager.cpp
)

ament_target_dependencies(gateway_lib
medkit_target_dependencies(gateway_lib
rclcpp
std_msgs
std_srvs
Expand Down Expand Up @@ -264,7 +264,7 @@ if(BUILD_TESTING)

ament_add_gtest(test_generic_client_compat test/test_generic_client_compat.cpp)
target_link_libraries(test_generic_client_compat gateway_lib)
ament_target_dependencies(test_generic_client_compat rclcpp std_srvs)
medkit_target_dependencies(test_generic_client_compat rclcpp std_srvs)

ament_add_gtest(test_operation_manager test/test_operation_manager.cpp)
target_link_libraries(test_operation_manager gateway_lib)
Expand All @@ -276,12 +276,12 @@ if(BUILD_TESTING)
find_package(std_msgs REQUIRED)
ament_add_gtest(test_native_topic_sampler test/test_native_topic_sampler.cpp)
target_link_libraries(test_native_topic_sampler gateway_lib)
ament_target_dependencies(test_native_topic_sampler std_msgs)
medkit_target_dependencies(test_native_topic_sampler std_msgs)

# Add DiscoveryManager tests
ament_add_gtest(test_discovery_manager test/test_discovery_manager.cpp)
target_link_libraries(test_discovery_manager gateway_lib)
ament_target_dependencies(test_discovery_manager std_msgs)
medkit_target_dependencies(test_discovery_manager std_msgs)

# Add TLS configuration tests
ament_add_gtest(test_tls_config test/test_tls_config.cpp)
Expand All @@ -290,7 +290,7 @@ if(BUILD_TESTING)
# Add FaultManager tests
ament_add_gtest(test_fault_manager test/test_fault_manager.cpp)
target_link_libraries(test_fault_manager gateway_lib)
ament_target_dependencies(test_fault_manager rclcpp ros2_medkit_msgs)
medkit_target_dependencies(test_fault_manager rclcpp ros2_medkit_msgs)

# Add discovery models tests
ament_add_gtest(test_discovery_models test/test_discovery_models.cpp)
Expand Down Expand Up @@ -335,7 +335,7 @@ if(BUILD_TESTING)
# Add data access manager tests
ament_add_gtest(test_data_access_manager test/test_data_access_manager.cpp)
target_link_libraries(test_data_access_manager gateway_lib)
ament_target_dependencies(test_data_access_manager rclcpp std_msgs)
medkit_target_dependencies(test_data_access_manager rclcpp std_msgs)

# Add entity resource model tests
ament_add_gtest(test_entity_resource_model test/test_entity_resource_model.cpp)
Expand Down Expand Up @@ -425,7 +425,7 @@ if(BUILD_TESTING)
# Add plugin loader tests
ament_add_gtest(test_plugin_loader test/test_plugin_loader.cpp)
target_link_libraries(test_plugin_loader gateway_lib)
ament_target_dependencies(test_plugin_loader ament_index_cpp)
medkit_target_dependencies(test_plugin_loader ament_index_cpp)

# Plugin manager tests
ament_add_gtest(test_plugin_manager test/test_plugin_manager.cpp)
Expand Down
23 changes: 14 additions & 9 deletions src/ros2_medkit_integration_tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
endif()

find_package(ament_cmake REQUIRED)

# Multi-distro compatibility (Humble / Jazzy / Rolling)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../cmake")
include(ROS2MedkitCompat)

find_package(ament_cmake_python REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rclcpp_action REQUIRED)
Expand All @@ -22,31 +27,31 @@ find_package(ros2_medkit_msgs REQUIRED)
# === Demo node executables ===

add_executable(demo_engine_temp_sensor demo_nodes/engine_temp_sensor.cpp)
ament_target_dependencies(demo_engine_temp_sensor rclcpp rcl_interfaces sensor_msgs)
medkit_target_dependencies(demo_engine_temp_sensor rclcpp rcl_interfaces sensor_msgs)

add_executable(demo_rpm_sensor demo_nodes/rpm_sensor.cpp)
ament_target_dependencies(demo_rpm_sensor rclcpp std_msgs)
medkit_target_dependencies(demo_rpm_sensor rclcpp std_msgs)

add_executable(demo_brake_pressure_sensor demo_nodes/brake_pressure_sensor.cpp)
ament_target_dependencies(demo_brake_pressure_sensor rclcpp std_msgs)
medkit_target_dependencies(demo_brake_pressure_sensor rclcpp std_msgs)

add_executable(demo_door_status_sensor demo_nodes/door_status_sensor.cpp)
ament_target_dependencies(demo_door_status_sensor rclcpp std_msgs)
medkit_target_dependencies(demo_door_status_sensor rclcpp std_msgs)

add_executable(demo_brake_actuator demo_nodes/brake_actuator.cpp)
ament_target_dependencies(demo_brake_actuator rclcpp std_msgs)
medkit_target_dependencies(demo_brake_actuator rclcpp std_msgs)

add_executable(demo_light_controller demo_nodes/light_controller.cpp)
ament_target_dependencies(demo_light_controller rclcpp std_msgs)
medkit_target_dependencies(demo_light_controller rclcpp std_msgs)

add_executable(demo_calibration_service demo_nodes/calibration_service.cpp)
ament_target_dependencies(demo_calibration_service rclcpp std_srvs)
medkit_target_dependencies(demo_calibration_service rclcpp std_srvs)

add_executable(demo_long_calibration_action demo_nodes/long_calibration_action.cpp)
ament_target_dependencies(demo_long_calibration_action rclcpp rclcpp_action example_interfaces)
medkit_target_dependencies(demo_long_calibration_action rclcpp rclcpp_action example_interfaces)

add_executable(demo_lidar_sensor demo_nodes/lidar_sensor.cpp)
ament_target_dependencies(demo_lidar_sensor rclcpp rcl_interfaces sensor_msgs std_srvs ros2_medkit_msgs)
medkit_target_dependencies(demo_lidar_sensor rclcpp rcl_interfaces sensor_msgs std_srvs ros2_medkit_msgs)

install(TARGETS
demo_engine_temp_sensor
Expand Down
8 changes: 4 additions & 4 deletions src/ros2_medkit_serialization/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ target_include_directories(${PROJECT_NAME} PUBLIC
$<INSTALL_INTERFACE:include>
)

ament_target_dependencies(${PROJECT_NAME}
medkit_target_dependencies(${PROJECT_NAME}
rclcpp
rcutils
rosidl_runtime_c
Expand Down Expand Up @@ -152,15 +152,15 @@ if(BUILD_TESTING)
# Unit tests
ament_add_gtest(test_type_cache test/test_type_cache.cpp)
target_link_libraries(test_type_cache ${PROJECT_NAME})
ament_target_dependencies(test_type_cache std_msgs std_srvs)
medkit_target_dependencies(test_type_cache std_msgs std_srvs)

ament_add_gtest(test_json_serializer test/test_json_serializer.cpp)
target_link_libraries(test_json_serializer ${PROJECT_NAME})
ament_target_dependencies(test_json_serializer std_msgs std_srvs geometry_msgs sensor_msgs test_msgs)
medkit_target_dependencies(test_json_serializer std_msgs std_srvs geometry_msgs sensor_msgs test_msgs)

ament_add_gtest(test_service_action_types test/test_service_action_types.cpp)
target_link_libraries(test_service_action_types ${PROJECT_NAME})
ament_target_dependencies(test_service_action_types std_srvs)
medkit_target_dependencies(test_service_action_types std_srvs)

# Apply coverage flags to test targets
if(ENABLE_COVERAGE)
Expand Down