Skip to content

3di | Add area and related_scope metadata for related packages lists - #3309

Open
kacperbojakowski-3di wants to merge 2 commits into
ros2:rollingfrom
kacperbojakowski-3di:related-packages-metadata
Open

kacperbojakowski-3di wants to merge 2 commits into
ros2:rollingfrom
kacperbojakowski-3di:related-packages-metadata

Conversation

@kacperbojakowski-3di

Copy link
Copy Markdown

Description

Adds <area> and <related_scope> to rclcpp's package.xml so the related packages lists in #7240 can match this package. Those lists read exports from the rosdistro cache. Nothing released declares them yet, so the lists are empty. This is one core package as a worked example.

Metadata added

In the existing <export> of rclcpp/package.xml:

<export>
  <build_type>ament_cmake</build_type>
  <area>client-libraries, framework</area>
  <related_scope>core</related_scope>
</export>
  • <area>: which docs pages list the package (most specific first).
  • <related_scope>: core or federation (missing is treated as community).

Why these values

client-libraries, framework matches docs pages that already use :area: client-libraries, framework. core puts it under Core ROS packages rather than community.

Why this is safe to add

<export> is the passthrough container for tool-specific metadata, and tools are expected to skip any export tags they don't recognise (REP 140). Nothing in the build reads these two, so there's no effect on how rclcpp compiles or runs, and no ABI impact. This is all just for the docs.

Scope and next steps

Limited to rclcpp on purpose, as an example to look at before this goes wider. I'll be adding the same exports to the other core packages. Each one shows up in the docs after relase and cache refresh.

Dependencies

Visible to users once #7240 and #6981 land, and this rclcpp change is released (docs read the released cache, not source).

Changes

  • Update rclcpp/package.xml: add <area>client-libraries, framework</area> and <related_scope>core</related_scope>.

Additional Information

Issue: #6991

Signed-off-by: Kacper Bojakowski <kacper.bojakowski@3di-info.com>
@kacperbojakowski-3di kacperbojakowski-3di changed the title Add area and related_scope metadata for related packages lists 3di | Add area and related_scope metadata for related packages lists Oct 3, 2026
@github-actions

github-actions Bot commented Oct 3, 2026 •

Copy link
Copy Markdown

ABI Compliance Check

❌ Verdict: incompatible

Library Verdict Summary
libcomponent_manager.so ❌ incompatible ABI-incompatible changes detected.
librclcpp.so ❌ incompatible ABI-incompatible changes detected.
librclcpp_action.so ✅ compatible No ABI changes detected.
librclcpp_lifecycle.so ❌ incompatible ABI-incompatible changes detected.
❌ libcomponent_manager.so — full abidiff report

Compared:

  • Base: lib-base/libcomponent_manager.so
  • Head: lib-pr/libcomponent_manager.so @ 72fe94e
Functions changes summary: 6 Removed (84 filtered out), 8 Changed (111 filtered out), 0 Added (30 filtered out) functions
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable

6 Removed functions:

  [D] 'function char* tracetools::get_symbol<void, const composition_interfaces::srv::ListNodes_Request_<std::allocator<void> >&, composition_interfaces::srv::ListNodes_Response_<std::allocator<void> >&>(std::function<void(const composition_interfaces::srv::ListNodes_Request_<std::allocator<void> >&, composition_interfaces::srv::ListNodes_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN22composition_interfaces3srv18ListNodes_Request_ISaIvEEERNS2_19ListNodes_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const composition_interfaces::srv::LoadNode_Request_<std::allocator<void> >&, composition_interfaces::srv::LoadNode_Response_<std::allocator<void> >&>(std::function<void(const composition_interfaces::srv::LoadNode_Request_<std::allocator<void> >&, composition_interfaces::srv::LoadNode_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN22composition_interfaces3srv17LoadNode_Request_ISaIvEEERNS2_18LoadNode_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const composition_interfaces::srv::UnloadNode_Request_<std::allocator<void> >&, composition_interfaces::srv::UnloadNode_Response_<std::allocator<void> >&>(std::function<void(const composition_interfaces::srv::UnloadNode_Request_<std::allocator<void> >&, composition_interfaces::srv::UnloadNode_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN22composition_interfaces3srv19UnloadNode_Request_ISaIvEEERNS2_20UnloadNode_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const composition_interfaces::srv::ListNodes_Request_<std::allocator<void> >&, composition_interfaces::srv::ListNodes_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const composition_interfaces::srv::ListNodes_Request_<std::allocator<void> >&, composition_interfaces::srv::ListNodes_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN22composition_interfaces3srv18ListNodes_Request_ISaIvEEERNS5_19ListNodes_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const composition_interfaces::srv::LoadNode_Request_<std::allocator<void> >&, composition_interfaces::srv::LoadNode_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const composition_interfaces::srv::LoadNode_Request_<std::allocator<void> >&, composition_interfaces::srv::LoadNode_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN22composition_interfaces3srv17LoadNode_Request_ISaIvEEERNS5_18LoadNode_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const composition_interfaces::srv::UnloadNode_Request_<std::allocator<void> >&, composition_interfaces::srv::UnloadNode_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const composition_interfaces::srv::UnloadNode_Request_<std::allocator<void> >&, composition_interfaces::srv::UnloadNode_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN22composition_interfaces3srv19UnloadNode_Request_ISaIvEEERNS5_20UnloadNode_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}

8 functions with some indirect sub-type change:

  [C] 'method rclcpp_components::NodeFactory* class_loader::ClassLoader::createRawInstance<rclcpp_components::NodeFactory>(const std::string&, bool)' at class_loader.hpp:319:1 has some indirect sub-type changes:
    return type changed:
      in pointed to type 'class rclcpp_components::NodeFactory' at node_factory.hpp:30:1:
        type size hasn't changed
        1 member function changes (1 filtered):
          'method virtual rclcpp_components::NodeInstanceWrapper rclcpp_components::NodeFactory::create_node_instance(const rclcpp::NodeOptions&)' has some sub-type changes:
            parameter 1 of type 'const rclcpp::NodeOptions&' has sub-type changes:
              in referenced type 'const rclcpp::NodeOptions':
                in unqualified underlying type 'class rclcpp::NodeOptions' at node_options.hpp:36:1:
                  type size hasn't changed
                  no member function changes (3 filtered);
                  1 data member insertion:
                    'bool enable_topic_statistics_', at offset 728 (in bits) at node_options.hpp:458:1
                  2 data member changes:
                    'bool start_parameter_services_' offset changed from 728 to 736 (in bits) (by +8 bits)
                    'bool start_parameter_event_publisher_' offset changed from 736 to 744 (in bits) (by +8 bits)

  [C] 'method std::shared_ptr<composition_interfaces::srv::ListNodes_Response_<std::allocator<void> > > rclcpp::AnyServiceCallback<composition_interfaces::srv::ListNodes>::dispatch(const std::shared_ptr<rclcpp::Service<composition_interfaces::srv::ListNodes> >&, const std::shared_ptr<rmw_request_id_s>&, std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >)' at any_service_callback.hpp:181:1 has some indirect sub-type changes:
    implicit parameter 0 of type 'rclcpp::AnyServiceCallback<composition_interfaces::srv::ListNodes>*' has sub-type changes:
      in pointed to type 'class rclcpp::AnyServiceCallback<composition_interfaces::srv::ListNodes>' at any_service_callback.hpp:57:1:
        type size hasn't changed
        1 data member change:
          type of 'std::variant<std::monostate, std::function<void(std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >, std::shared_ptr<composition_interfaces::srv::ListNodes_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >, std::shared_ptr<composition_interfaces::srv::ListNodes_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rclcpp::Service<composition_interfaces::srv::ListNodes> >, std::shared_ptr<rmw_request_id_s>, std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >)>, std::function<void(const composition_interfaces::srv::ListNodes_Request_<std::allocator<void> >&, composition_interfaces::srv::ListNodes_Response_<std::allocator<void> >&)>, std::function<void(const rmw_request_id_s&, const composition_interfaces::srv::ListNodes_Request_<std::allocator<void> >&, composition_interfaces::srv::ListNodes_Response_<std::allocator<void> >&)> > callback_' changed:
            type name changed from 'std::variant<std::monostate, std::function<void(std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >, std::shared_ptr<composition_interfaces::srv::ListNodes_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >, std::shared_ptr<composition_interfaces::srv::ListNodes_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rclcpp::Service<composition_interfaces::srv::ListNodes> >, std::shared_ptr<rmw_request_id_s>, std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >)>, std::function<void(const composition_interfaces::srv::ListNodes_Request_<std::allocator<void> >&, composition_interfaces::srv::ListNodes_Response_<std::allocator<void> >&)>, std::function<void(const rmw_request_id_s&, const composition_interfaces::srv::ListNodes_Request_<std::allocator<void> >&, composition_interfaces::srv::ListNodes_Response_<std::allocator<void> >&)> >' to 'std::variant<std::monostate, std::function<void(std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >, std::shared_ptr<composition_interfaces::srv::ListNodes_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >, std::shared_ptr<composition_interfaces::srv::ListNodes_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rclcpp::Service<composition_interfaces::srv::ListNodes> >, std::shared_ptr<rmw_request_id_s>, std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >)> >'
            type size hasn't changed
            2 base class deletions:
              struct std::_Enable_copy_move<true, true, true, true, std::variant<std::monostate, std::function<void(std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >, std::shared_ptr<composition_interfaces::srv::ListNodes_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >, std::shared_ptr<composition_interfaces::srv::ListNodes_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rclcpp::Service<composition_interfaces::srv::ListNodes> >, std::shared_ptr<rmw_request_id_s>, std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >)>, std::function<void(const composition_interfaces::srv::ListNodes_Request_<std::allocator<void> >&, composition_interfaces::srv::ListNodes_Response_<std::allocator<void> >&)>, std::function<void(const rmw_request_id_s&, const composition_interfaces::srv::ListNodes_Request_<std::allocator<void> >&, composition_interfaces::srv::ListNodes_Response_<std::allocator<void> >&)> > > at enable_special_members.h:89:1
              struct std::__detail::__variant::_Variant_base<std::monostate, std::function<void(std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >, std::shared_ptr<composition_interfaces::srv::ListNodes_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >, std::shared_ptr<composition_interfaces::srv::ListNodes_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rclcpp::Service<composition_interfaces::srv::ListNodes> >, std::shared_ptr<rmw_request_id_s>, std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >)>, std::function<void(const composition_interfaces::srv::ListNodes_Request_<std::allocator<void> >&, composition_interfaces::srv::ListNodes_Response_<std::allocator<void> >&)>, std::function<void(const rmw_request_id_s&, const composition_interfaces::srv::ListNodes_Request_<std::allocator<void> >&, composition_interfaces::srv::ListNodes_Response_<std::allocator<void> >&)> > at variant:757:1
            2 base class insertions:
              struct std::_Enable_copy_move<true, true, true, true, std::variant<std::monostate, std::function<void(std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >, std::shared_ptr<composition_interfaces::srv::ListNodes_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >, std::shared_ptr<composition_interfaces::srv::ListNodes_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rclcpp::Service<composition_interfaces::srv::ListNodes> >, std::shared_ptr<rmw_request_id_s>, std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >)> > > at enable_special_members.h:89:1
              struct std::__detail::__variant::_Variant_base<std::monostate, std::function<void(std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >, std::shared_ptr<composition_interfaces::srv::ListNodes_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >, std::shared_ptr<composition_interfaces::srv::ListNodes_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rclcpp::Service<composition_interfaces::srv::ListNodes> >, std::shared_ptr<rmw_request_id_s>, std::shared_ptr<composition_interfaces::srv::ListNodes_Request_<std::allocator<void> > >)> > at variant:757:1

  [C] 'method std::shared_ptr<composition_interfaces::srv::LoadNode_Response_<std::allocator<void> > > rclcpp::AnyServiceCallback<composition_interfaces::srv::LoadNode>::dispatch(const std::shared_ptr<rclcpp::Service<composition_interfaces::srv::LoadNode> >&, const std::shared_ptr<rmw_request_id_s>&, std::shared_ptr<composition_in
... (report truncated; the full report is in the check run artifacts: https://github.com/ros2/rclcpp/actions/runs/38882614242)
❌ librclcpp.so — full abidiff report

Compared:

  • Base: lib-base/librclcpp.so
  • Head: lib-pr/librclcpp.so @ 72fe94e
Functions changes summary: 23 Removed (199 filtered out), 21 Changed (1299 filtered out), 103 Added (267 filtered out) functions
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable

23 Removed functions:

  [D] 'method void rclcpp::Subscription<rosgraph_msgs::msg::Clock_<std::allocator<void> >, std::allocator<void>, rosgraph_msgs::msg::Clock_<std::allocator<void> >, rosgraph_msgs::msg::Clock_<std::allocator<void> >, rclcpp::message_memory_strategy::MessageMemoryStrategy<rosgraph_msgs::msg::Clock_<std::allocator<void> >, std::allocator<void> > >::Subscription(rclcpp::node_interfaces::NodeBaseInterface*, const rosidl_message_type_support_t&, const std::string&, const rclcpp::QoS&, rclcpp::AnySubscriptionCallback<rosgraph_msgs::msg::Clock_<std::allocator<void> >, std::allocator<void> >, const rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> >&, rclcpp::message_memory_strategy::MessageMemoryStrategy<rosgraph_msgs::msg::Clock_<std::allocator<void> >, std::allocator<void> >::SharedPtr)'    {_ZN6rclcpp12SubscriptionIN13rosgraph_msgs3msg6Clock_ISaIvEEES4_S5_S5_NS_23message_memory_strategy21MessageMemoryStrategyIS5_S4_EEEC2EPNS_15node_interfaces17NodeBaseInterfaceERK29rosidl_message_type_support_tRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_3QoSENS_23AnySubscriptionCallbackIS5_S4_EERKNS_32SubscriptionOptionsWithAllocatorIS4_EESt10shared_ptrIS8_E, aliases _ZN6rclcpp12SubscriptionIN13rosgraph_msgs3msg6Clock_ISaIvEEES4_S5_S5_NS_23message_memory_strategy21MessageMemoryStrategyIS5_S4_EEEC1EPNS_15node_interfaces17NodeBaseInterfaceERK29rosidl_message_type_support_tRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_3QoSENS_23AnySubscriptionCallbackIS5_S4_EERKNS_32SubscriptionOptionsWithAllocatorIS4_EESt10shared_ptrIS8_E}
  [D] 'method rclcpp::WaitResult<rclcpp::WaitSetTemplate<rclcpp::wait_set_policies::SequentialSynchronization, rclcpp::wait_set_policies::DynamicStorage> >::~WaitResult()'    {_ZN6rclcpp10WaitResultINS_15WaitSetTemplateINS_17wait_set_policies25SequentialSynchronizationENS2_14DynamicStorageEEEED2Ev, aliases _ZN6rclcpp10WaitResultINS_15WaitSetTemplateINS_17wait_set_policies25SequentialSynchronizationENS2_14DynamicStorageEEEED1Ev}
  [D] 'function rclcpp::SubscriptionFactory rclcpp::create_subscription_factory<rosgraph_msgs::msg::Clock_<std::allocator<void> >, rclcpp::TimeSource::NodeState::create_clock_sub()::<lambda(const std::shared_ptr<const rosgraph_msgs::msg::Clock_<std::allocator<void> > >&)>, std::allocator<void> >(const rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> >&, rclcpp::message_memory_strategy::MessageMemoryStrategy<rosgraph_msgs::msg::Clock_<std::allocator<void> >, std::allocator<void> >::SharedPtr)'    {_ZN6rclcpp27create_subscription_factoryIN13rosgraph_msgs3msg6Clock_ISaIvEEEZNS_10TimeSource9NodeState16create_clock_subEvEUlRKSt10shared_ptrIKS5_EE_S4_NS_12SubscriptionIS5_S4_S5_S5_NS_23message_memory_strategy21MessageMemoryStrategyIS5_S4_EEEESH_EENS_19SubscriptionFactoryEOT0_RKNS_32SubscriptionOptionsWithAllocatorIT1_EENT3_9SharedPtrE, aliases _ZN6rclcpp27create_subscription_factoryIN13rosgraph_msgs3msg6Clock_ISaIvEEEZNS_10TimeSource9NodeState16create_clock_subEvEUlRKSt10shared_ptrIKS5_EE0_S4_NS_12SubscriptionIS5_S4_S5_S5_NS_23message_memory_strategy21MessageMemoryStrategyIS5_S4_EEEESH_EENS_19SubscriptionFactoryEOT0_RKNS_32SubscriptionOptionsWithAllocatorIT1_EENT3_9SharedPtrE}
  [D] 'method void rclcpp::experimental::SubscriptionIntraProcess<rosgraph_msgs::msg::Clock_<std::allocator<void> >, rosgraph_msgs::msg::Clock_<std::allocator<void> >, std::allocator<rosgraph_msgs::msg::Clock_<std::allocator<void> > >, std::default_delete<rosgraph_msgs::msg::Clock_<std::allocator<void> > >, rosgraph_msgs::msg::Clock_<std::allocator<void> >, std::allocator<void> >::SubscriptionIntraProcess(rclcpp::AnySubscriptionCallback<rosgraph_msgs::msg::Clock_<std::allocator<void> >, std::allocator<void> >, std::shared_ptr<std::allocator<void> >, rclcpp::Context::SharedPtr, const std::string&, const rclcpp::QoS&, rclcpp::IntraProcessBufferType)'    {_ZN6rclcpp12experimental24SubscriptionIntraProcessIN13rosgraph_msgs3msg6Clock_ISaIvEEES6_SaIS6_ESt14default_deleteIS6_ES6_S5_EC2ENS_23AnySubscriptionCallbackIS6_S5_EESt10shared_ptrIS5_ESD_INS_7ContextEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_3QoSENS_22IntraProcessBufferTypeE, aliases _ZN6rclcpp12experimental24SubscriptionIntraProcessIN13rosgraph_msgs3msg6Clock_ISaIvEEES6_SaIS6_ESt14default_deleteIS6_ES6_S5_EC1ENS_23AnySubscriptionCallbackIS6_S5_EESt10shared_ptrIS5_ESD_INS_7ContextEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_3QoSENS_22IntraProcessBufferTypeE}
  [D] 'method rclcpp::node_interfaces::NodeBase::NodeBase(const std::string&, const std::string&, rclcpp::Context::SharedPtr, const rcl_node_options_t&, bool, rclcpp::CallbackGroup::SharedPtr)'    {_ZN6rclcpp15node_interfaces8NodeBaseC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES9_St10shared_ptrINS_7ContextEERK18rcl_node_options_sbSA_INS_13CallbackGroupEE, aliases _ZN6rclcpp15node_interfaces8NodeBaseC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES9_St10shared_ptrINS_7ContextEERK18rcl_node_options_sbSA_INS_13CallbackGroupEE}
  [D] 'function char* tracetools::get_symbol<void, const rcl_interfaces::srv::DescribeParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::DescribeParameters_Response_<std::allocator<void> >&>(std::function<void(const rcl_interfaces::srv::DescribeParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::DescribeParameters_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14rcl_interfaces3srv27DescribeParameters_Request_ISaIvEEERNS2_28DescribeParameters_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rcl_interfaces::srv::GetLoggerLevels_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetLoggerLevels_Response_<std::allocator<void> >&>(std::function<void(const rcl_interfaces::srv::GetLoggerLevels_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetLoggerLevels_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14rcl_interfaces3srv24GetLoggerLevels_Request_ISaIvEEERNS2_25GetLoggerLevels_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rcl_interfaces::srv::GetParameterTypes_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetParameterTypes_Response_<std::allocator<void> >&>(std::function<void(const rcl_interfaces::srv::GetParameterTypes_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetParameterTypes_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14rcl_interfaces3srv26GetParameterTypes_Request_ISaIvEEERNS2_27GetParameterTypes_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rcl_interfaces::srv::GetParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetParameters_Response_<std::allocator<void> >&>(std::function<void(const rcl_interfaces::srv::GetParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetParameters_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14rcl_interfaces3srv22GetParameters_Request_ISaIvEEERNS2_23GetParameters_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rcl_interfaces::srv::ListParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::ListParameters_Response_<std::allocator<void> >&>(std::function<void(const rcl_interfaces::srv::ListParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::ListParameters_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14rcl_interfaces3srv23ListParameters_Request_ISaIvEEERNS2_24ListParameters_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rcl_interfaces::srv::SetLoggerLevels_Request_<std::allocator<void> >&, rcl_interfaces::srv::SetLoggerLevels_Response_<std::allocator<void> >&>(std::function<void(const rcl_interfaces::srv::SetLoggerLevels_Request_<std::allocator<void> >&, rcl_interfaces::srv::SetLoggerLevels_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14rcl_interfaces3srv24SetLoggerLevels_Request_ISaIvEEERNS2_25SetLoggerLevels_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rcl_interfaces::srv::SetParametersAtomically_Request_<std::allocator<void> >&, rcl_interfaces::srv::SetParametersAtomically_Response_<std::allocator<void> >&>(std::function<void(const rcl_interfaces::srv::SetParametersAtomically_Request_<std::allocator<void> >&, rcl_interfaces::srv::SetParametersAtomically_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14rcl_interfaces3srv32SetParametersAtomically_Request_ISaIvEEERNS2_33SetParametersAtomically_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rcl_interfaces::srv::SetParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::SetParameters_Response_<std::allocator<void> >&>(std::function<void(const rcl_interfaces::srv::SetParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::SetParameters_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14rcl_interfaces3srv22SetParameters_Request_ISaIvEEERNS2_23SetParameters_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const rcl_interfaces::srv::DescribeParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::DescribeParameters_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const rcl_interfaces::srv::DescribeParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::DescribeParameters_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN14rcl_interfaces3srv27DescribeParameters_Request_ISaIvEEERNS5_28DescribeParameters_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const rcl_interfaces::srv::GetLoggerLevels_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetLoggerLevels_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const rcl_interfaces::srv::GetLoggerLevels_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetLoggerLevels_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN14rcl_interfaces3srv24GetLoggerLevels_Request_ISaIvEEERNS5_25GetLoggerLevels_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const rcl_interfaces::srv::GetParameterTypes_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetParameterTypes_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const rcl_interfaces::srv::GetParameterTypes_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetParameterTypes_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN14rcl_interfaces3srv26GetParameterTypes_Request_ISaIvEEERNS5_27GetParameterTypes_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const rcl_interfaces::srv::GetParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetParameters_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const rcl_interfaces::srv::GetParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetParameters_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN14rcl_interfaces3srv22GetParameters_Request_ISaIvEEERNS5_23GetParameters_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const rcl_interfaces::srv::ListParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::ListParameters_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const rcl_interfaces::srv::ListParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::ListParameters_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN14rcl_interfaces3srv23ListParameters_Request_ISaIvEEERNS5_24ListParameters_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const rcl_interfaces::srv::SetLoggerLevels_Request_<std::allocator<void> >&, rcl_interfaces::srv::SetLoggerLevels_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const rcl_interfaces::srv::SetLoggerLevels_Request_<std::allocator<void> >&, rcl_interfaces::srv::SetLoggerLevels_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN14rcl_interfaces3srv24SetLoggerLevels_Request_ISaIvEEERNS5_25SetLoggerLevels_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const rcl_interfaces::srv::SetParametersAtomically_Request_<std::allocator<void> >&, rcl_interfaces::srv::SetParametersAtomically_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const rcl_interfaces::srv::SetParametersAtomically_Request_<std::allocator<void> >&, rcl_interfaces::srv::SetParametersAtomically_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN14rcl_interfaces3srv32SetParametersAtomically_Request_ISaIvEEERNS5_33SetParametersAtomically_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const rcl_interfaces::srv::SetParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::SetParameters_Response_<std::allocator<void> >&>(std::function<vo
... (report truncated; the full report is in the check run artifacts: https://github.com/ros2/rclcpp/actions/runs/38882614242)
✅ librclcpp_action.so — full abidiff report

Compared:

  • Base: lib-base/librclcpp_action.so
  • Head: lib-pr/librclcpp_action.so @ 72fe94e
(empty report — no differences printed by abidiff)
❌ librclcpp_lifecycle.so — full abidiff report

Compared:

  • Base: lib-base/librclcpp_lifecycle.so
  • Head: lib-pr/librclcpp_lifecycle.so @ 72fe94e
Functions changes summary: 8 Removed (116 filtered out), 10 Changed (220 filtered out), 0 Added (44 filtered out) functions
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable

8 Removed functions:

  [D] 'function char* tracetools::get_symbol<void, const lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> >&>(std::function<void(const lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14lifecycle_msgs3srv20ChangeState_Request_ISaIvEEERNS2_21ChangeState_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const lifecycle_msgs::srv::GetAvailableStates_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetAvailableStates_Response_<std::allocator<void> >&>(std::function<void(const lifecycle_msgs::srv::GetAvailableStates_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetAvailableStates_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14lifecycle_msgs3srv27GetAvailableStates_Request_ISaIvEEERNS2_28GetAvailableStates_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const lifecycle_msgs::srv::GetAvailableTransitions_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetAvailableTransitions_Response_<std::allocator<void> >&>(std::function<void(const lifecycle_msgs::srv::GetAvailableTransitions_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetAvailableTransitions_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14lifecycle_msgs3srv32GetAvailableTransitions_Request_ISaIvEEERNS2_33GetAvailableTransitions_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const lifecycle_msgs::srv::GetState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetState_Response_<std::allocator<void> >&>(std::function<void(const lifecycle_msgs::srv::GetState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetState_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14lifecycle_msgs3srv17GetState_Request_ISaIvEEERNS2_18GetState_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN14lifecycle_msgs3srv20ChangeState_Request_ISaIvEEERNS5_21ChangeState_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const lifecycle_msgs::srv::GetAvailableStates_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetAvailableStates_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const lifecycle_msgs::srv::GetAvailableStates_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetAvailableStates_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN14lifecycle_msgs3srv27GetAvailableStates_Request_ISaIvEEERNS5_28GetAvailableStates_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const lifecycle_msgs::srv::GetAvailableTransitions_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetAvailableTransitions_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const lifecycle_msgs::srv::GetAvailableTransitions_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetAvailableTransitions_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN14lifecycle_msgs3srv32GetAvailableTransitions_Request_ISaIvEEERNS5_33GetAvailableTransitions_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const lifecycle_msgs::srv::GetState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetState_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const lifecycle_msgs::srv::GetState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetState_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN14lifecycle_msgs3srv17GetState_Request_ISaIvEEERNS5_18GetState_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}

10 functions with some indirect sub-type change:

  [C] 'method std::shared_ptr<lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> > > rclcpp::AnyServiceCallback<lifecycle_msgs::srv::ChangeState>::dispatch(const std::shared_ptr<rclcpp::Service<lifecycle_msgs::srv::ChangeState> >&, const std::shared_ptr<rmw_request_id_s>&, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >)' at any_service_callback.hpp:181:1 has some indirect sub-type changes:
    implicit parameter 0 of type 'rclcpp::AnyServiceCallback<lifecycle_msgs::srv::ChangeState>*' has sub-type changes:
      in pointed to type 'class rclcpp::AnyServiceCallback<lifecycle_msgs::srv::ChangeState>' at any_service_callback.hpp:57:1:
        type size hasn't changed
        1 data member change:
          type of 'std::variant<std::monostate, std::function<void(std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rclcpp::Service<lifecycle_msgs::srv::ChangeState> >, std::shared_ptr<rmw_request_id_s>, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >)>, std::function<void(const lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> >&)>, std::function<void(const rmw_request_id_s&, const lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> >&)> > callback_' changed:
            type name changed from 'std::variant<std::monostate, std::function<void(std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rclcpp::Service<lifecycle_msgs::srv::ChangeState> >, std::shared_ptr<rmw_request_id_s>, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >)>, std::function<void(const lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> >&)>, std::function<void(const rmw_request_id_s&, const lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> >&)> >' to 'std::variant<std::monostate, std::function<void(std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rclcpp::Service<lifecycle_msgs::srv::ChangeState> >, std::shared_ptr<rmw_request_id_s>, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >)> >'
            type size hasn't changed
            2 base class deletions:
              struct std::_Enable_copy_move<true, true, true, true, std::variant<std::monostate, std::function<void(std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rclcpp::Service<lifecycle_msgs::srv::ChangeState> >, std::shared_ptr<rmw_request_id_s>, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >)>, std::function<void(const lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> >&)>, std::function<void(const rmw_request_id_s&, const lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> >&)> > > at enable_special_members.h:89:1
              struct std::__detail::__variant::_Variant_base<std::monostate, std::function<void(std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rclcpp::Service<lifecycle_msgs::srv::ChangeState> >, std::shared_ptr<rmw_request_id_s>, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >)>, std::function<void(const lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> >&)>, std::function<void(const rmw_request_id_s&, const lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> >&)> > at variant:757:1
            2 base class insertions:
              struct std::_Enable_copy_move<true, true, true, true, std::variant<std::monostate, std::function<void(std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rclcpp::Service<lifecycle_msgs::srv::ChangeState> >, std::shared_ptr<rmw_request_id_s>, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >)> > > at enable_special_members.h:89:1
              struct std::__detail::__variant::_Variant_base<std::monostate, std::function<void(std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<rclcpp::Service<lifecycle_msgs::srv::ChangeState> >, std::shared_ptr<rmw_request_id_s>, std::shared_ptr<lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> > >)> > at variant:757:1

  [C] 'method std::shared_ptr<lifecycle_msgs::srv::GetAvailableStates_Response_<std::allocator<void> > > rclcpp::AnyServiceCallback<lifecycle_msgs::srv::GetAvailableStates>::dispatch(const std::shared_ptr<rclcpp::Service<lifecycle_msgs::srv::GetAvailableStates> >&, const std::shared_ptr<rmw_request_id_s>&, std::shared_ptr<lifecycle_msgs::srv::GetAvailableStates_Request_<std::allocator<void> > >)' at any_service_callback.hpp:181:1 has some indirect sub-type changes:
    implicit parameter 0 of type 'rclcpp::AnyServiceCallback<lifecycle_msgs::srv::GetAvailableStates>*' has sub-type changes:
      in pointed to type 'class rclcpp::AnyServiceCallback<lifecycle_msgs::srv::GetAvailableStates>' at any_service_callback.hpp:57:1:
        type size hasn't changed
        1 data member change:
          type of 'std::variant<std::monostate, std::function<void(std::shared_ptr<lifecycle_msgs::srv::GetAvailableStates_Request_<std::allocator<void> > >, std::shared_ptr<lifecycle_msgs::srv::G
... (report truncated; the full report is in the check run artifacts: https://github.com/ros2/rclcpp/actions/runs/38882614242)

Updated for commit 72fe94e · check run · suppressions: /home/runner/work/_temp/ros2-abi-suppressions.txt

@jmachowinski

Copy link
Copy Markdown
Collaborator

I don't like the approach for several reasons.

  • There is no validation of the fields. E.g. typos etc can go unoticed.
  • It is not clear to me what tags exist etc. Can people just come up with tags, is there a curated list of tags ?
  • Any package can declare being core. This is my major criticism here. I would rather have a curated list of core packages that is under our control.

@kacperbojakowski-3di

Copy link
Copy Markdown
Author

Thanks @jmachowinski, both fair points.

There is a curated list. It lives in tools/enhance.yaml and is loaded by enhance_config.py, so on the docs side anything outside it is flagged as an error. You're right that nothing checks it at the package.xml end. For now the values are being added by hand to packages considered core, starting here, so that we have a worked example to point at and enough coverage for the docs lists to be useful. I have also shared the allowed values with @gbiggs to put them into the package template. The list will also be exposed in one of the "how to contribute" docs.

On packages declaring themselves core, the default is community, and the grouping is only read on the docs side, so moving to a curated list wouldn't need anything undone in the packages themselves, but I'll leave that one with OR.

cc @tfoote

@tfoote

tfoote commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

I think that there's to generally space to improve on this with validation etc. But we can't know all the potential tags people would want to use up front.

And yes we can potentially curate and restrict packages from certain tags like core. But to start let's rely on our community behaving with good intentions and use social processes to manage it until it doesn't work. This is one of many that were pushing ahead with this mechanism. We can continue to improve and evolve things. But this will help us get to better docs with what we have so far.

@jmachowinski

Copy link
Copy Markdown
Collaborator

I think that there's to generally space to improve on this with validation etc. But we can't know all the potential tags people would want to use up front.

@kacperbojakowski-3di just wrote above, that there is a list of tags, and that all other ones are being ignored anyway.
So we got a list, and we can check for them in ament etc.

And yes we can potentially curate and restrict packages from certain tags like core. But to start let's rely on our community behaving with good intentions and use social processes to manage it until it doesn't work.

What am I missing here ? Core packages are kind of static. Is only about 50 packages and they almost never change. I don't see any good reason to have a complicated dynamic way of determining them. From my point of view, this is unnecessary complicated, clutters our package.xml and has potential for misuse.

Apart from this, I am a bit confused about the scope of the documentation overhaul. Until now I was under the impression that only docs.ros.org should be overworked. E.g. make the tutorials better an more beginner friendly, make it so that people can actually find workgoups etc.

I was not aware that an overhaul of index.ros.org was also in the scope of this work.

@fujitatomoya fujitatomoya left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i don't have a fundamental objection to this approach if TGC made this decision.
but imo @jmachowinski points stand, this probably generates more maintainability than benefits, i guess.

especially, i do not like this part if i am not mistaken.

so on the docs side anything outside it is flagged as an error.

this means, typos in the some package.xml can break the documentation? i do not think this is acceptable, it should be checked and validated when the package.xml is submitted?

Comment thread rclcpp/package.xml Outdated
Comment on lines +65 to +66
<area>client-libraries, framework</area>
<related_scope>core</related_scope>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
<area>client-libraries, framework</area>
<related_scope>core</related_scope>
<x-area>client-libraries, framework</x-area>
<x-related_scope>core</x-related_scope>

IIUC, since this is a new tag that we're trying out for the docs I recommend making the tag name more clearly experimental. An x- prefix seems like a good idea matching https://www.rfc-editor.org/info/rfc6648/

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like https://www.ros.org/reps/rep-0149.html#export recommends prefixing with a package name prefix.

Suggested change
<area>client-libraries, framework</area>
<related_scope>core</related_scope>
<ros2_documentation_area>client-libraries, framework</ros2_documentation_area>
<ros2_documentation_related_scope>core</ros2_documentation_related_scope>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I do think that this naming approach is better so that people can find the content better.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sloretz @tfoote Added now, thanks!

@tfoote

tfoote commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

@kacperbojakowski-3di just wrote above, that there is a list of tags, and that all other ones are being ignored anyway.
So we got a list, and we can check for them in ament etc.

For areas, in the current state yes. We're focused specifically on ros2_documentation builds. But looking beyond our initial rollout this sort of tagging should be something that all packages can do. In the broader ecosystem and as you think about people who might have a private instance of this with their own custom packages we can't have a centralized preordained list of tags without maintaining that list of tags becoming a very large challenge. I'm not sure if the related_scope is also listed somewhere, note that core is not in that list. https://github.com/ros2/ros2_documentation/blob/71492ab3295315cf9546eed895dc3c766ee51d62/tools/enhance.yaml#L20-L42

this means, typos in the some package.xml can break the documentation? i do not think this is acceptable, it should be checked and validated when the package.xml is submitted?

A typo in a tag here will lead to a package being missassociated. It won't "break" the documentation. This is the same as any other key in the package.xml if you misdeclare a dependency it will point to the wrong thing too. Most maintainers notice it or get it ticketed after it deploys more widely and the error becomes more obvious. You may be first in class of a type, for which there's no others. That's a potentially valid situation.

What am I missing here ? Core packages are kind of static. Is only about 50 packages and they almost never change. I don't see any good reason to have a complicated dynamic way of determining them. From my point of view, this is unnecessary complicated, clutters our package.xml and has potential for misuse.

Core is a convenient example of something that is clearly defined and can provide us with a clear example of how to do grouping initially. Obviously we could make something to special process it. But with this mechanism we're enabling a class of categorization, using core as an example. Versus the goal is to categorize core.

We're currently only targeting the documentation builds, but putting these classifications into the package.xml means that it will get into the rosdistro cache and from there it can trivially be picked up by many other tools including the rosdistro library and into rosindex too.

The reason we have the exports section is to enable dynamic and explorative usages for specific tools. If we do find this to be very useful and something that we should standardize there's talk of package.xml format 4. But until we try things out I definitely wouldn't want to propose this sort of change into the core specification. If there's a few extra tags here while we experiment it does have extra content, but removing it down the line if the experiment fails is not hard either.

This is like adding 2 lines of description to a package which has only a single sentence description would be very reasonable/probably much better. This is adding 2 lines of structured documentation which helps people find it.

kacperbojakowski-3di added a commit to kacperbojakowski-3di/ros2_documentation that referenced this pull request Oct 16, 2026
Address Shane's feedback on ros2/rclcpp#3309 to have the names in export prefixed.
Use REP 149 package-name prefixes for the docs export tags, matching
feedback on ros2#3309 / ros2/ros2_documentation#7240.

Signed-off-by: Kacper Bojakowski <kacper.bojakowski@3di-info.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants