Merge pull request #172 from ros2/refactor_typesupport
refactor typesupport
This commit is contained in:
commit
9cd129c70f
10 changed files with 142 additions and 166 deletions
|
@ -5,6 +5,8 @@ project(rclcpp)
|
|||
find_package(ament_cmake REQUIRED)
|
||||
find_package(rcl_interfaces REQUIRED)
|
||||
find_package(rmw REQUIRED)
|
||||
find_package(rmw_implementation REQUIRED)
|
||||
find_package(rmw_implementation_cmake REQUIRED)
|
||||
find_package(rosidl_generator_cpp REQUIRED)
|
||||
|
||||
if(NOT WIN32)
|
||||
|
@ -35,31 +37,37 @@ set(${PROJECT_NAME}_SRCS
|
|||
src/rclcpp/service.cpp
|
||||
src/rclcpp/subscription.cpp
|
||||
src/rclcpp/timer.cpp
|
||||
src/rclcpp/type_support.cpp
|
||||
src/rclcpp/utilities.cpp
|
||||
)
|
||||
if(WIN32)
|
||||
list(APPEND ${PROJECT_NAME}_SRCS src/rclcpp/windows_helper.cpp)
|
||||
endif()
|
||||
add_library(${PROJECT_NAME} SHARED ${${PROJECT_NAME}_SRCS})
|
||||
ament_target_dependencies(
|
||||
${PROJECT_NAME}
|
||||
"rcl_interfaces"
|
||||
"rmw"
|
||||
"rosidl_generator_cpp"
|
||||
)
|
||||
# Causes the visibility macros to use dllexport rather than dllimport,
|
||||
# which is appropriate when building the dll but not consuming it.
|
||||
# It also avoids using certain parts of the code that the consuming code must
|
||||
# use, but which the library cannot consume itself.
|
||||
target_compile_definitions(${PROJECT_NAME} PRIVATE "RCLCPP_BUILDING_LIBRARY")
|
||||
if(APPLE)
|
||||
# Since the rmw_* symbols are unresolved at the time of building librclcpp,
|
||||
# tell the linker on OS X to dynamically look them up at runtime.
|
||||
set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "-undefined dynamic_lookup")
|
||||
endif()
|
||||
|
||||
macro(target)
|
||||
add_library(${PROJECT_NAME}${target_suffix} SHARED
|
||||
${${PROJECT_NAME}_SRCS})
|
||||
ament_target_dependencies(${PROJECT_NAME}${target_suffix}
|
||||
"rcl_interfaces"
|
||||
"rmw"
|
||||
"rosidl_generator_cpp"
|
||||
"${rmw_implementation}")
|
||||
|
||||
# Causes the visibility macros to use dllexport rather than dllimport,
|
||||
# which is appropriate when building the dll but not consuming it.
|
||||
target_compile_definitions(${PROJECT_NAME}${target_suffix}
|
||||
PRIVATE "RCLCPP_BUILDING_LIBRARY")
|
||||
|
||||
install(
|
||||
TARGETS ${PROJECT_NAME}${target_suffix}
|
||||
ARCHIVE DESTINATION lib
|
||||
LIBRARY DESTINATION lib
|
||||
RUNTIME DESTINATION bin
|
||||
)
|
||||
endmacro()
|
||||
|
||||
call_for_each_rmw_implementation(target GENERATE_DEFAULT)
|
||||
|
||||
ament_export_dependencies(rcl_interfaces)
|
||||
ament_export_dependencies(rmw)
|
||||
ament_export_dependencies(rmw_implementation)
|
||||
ament_export_dependencies(rosidl_generator_cpp)
|
||||
|
||||
ament_export_include_directories(include)
|
||||
|
@ -100,6 +108,11 @@ ament_package(
|
|||
CONFIG_EXTRAS rclcpp-extras.cmake
|
||||
)
|
||||
|
||||
install(
|
||||
DIRECTORY cmake
|
||||
DESTINATION share/${PROJECT_NAME}
|
||||
)
|
||||
|
||||
install(
|
||||
DIRECTORY include/
|
||||
DESTINATION include
|
||||
|
@ -109,10 +122,3 @@ install(
|
|||
DIRECTORY src/
|
||||
DESTINATION src/rclcpp
|
||||
)
|
||||
|
||||
install(
|
||||
TARGETS ${PROJECT_NAME}
|
||||
ARCHIVE DESTINATION lib
|
||||
LIBRARY DESTINATION lib
|
||||
RUNTIME DESTINATION bin
|
||||
)
|
||||
|
|
88
rclcpp/cmake/get_rclcpp_information.cmake
Normal file
88
rclcpp/cmake/get_rclcpp_information.cmake
Normal file
|
@ -0,0 +1,88 @@
|
|||
# Copyright 2015 Open Source Robotics Foundation, Inc.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
#
|
||||
# Get all information abut rclcpp for a specific RMW implementation.
|
||||
#
|
||||
# It sets the common variables _DEFINITIONS, _INCLUDE_DIRS and _LIBRARIES
|
||||
# with the given prefix.
|
||||
#
|
||||
# :param rmw_implementation: the RMW implementation name
|
||||
# :type target: string
|
||||
# :param var_prefix: the prefix of all output variable names
|
||||
# :type var_prefix: string
|
||||
#
|
||||
macro(get_rclcpp_information rmw_implementation var_prefix)
|
||||
# pretend to be a "package"
|
||||
# so that the variables can be used by various functions / macros
|
||||
set(${var_prefix}_FOUND TRUE)
|
||||
|
||||
# include directories
|
||||
set(${var_prefix}_INCLUDE_DIRS
|
||||
"${rclcpp_DIR}/../../../include")
|
||||
|
||||
# libraries
|
||||
set(_libs)
|
||||
# search for library relative to this CMake file
|
||||
set(_library_target "rclcpp")
|
||||
get_available_rmw_implementations(_rmw_impls)
|
||||
list(LENGTH _rmw_impls _rmw_impls_length)
|
||||
if(_rmw_impls_length GREATER 1)
|
||||
set(_library_target "${_library_target}__${rmw_implementation}")
|
||||
endif()
|
||||
set(_lib "NOTFOUND")
|
||||
find_library(
|
||||
_lib NAMES "${_library_target}"
|
||||
PATHS "${rclcpp_DIR}/../../../lib"
|
||||
NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH
|
||||
)
|
||||
if(NOT _lib)
|
||||
# warn about not existing library and ignore it
|
||||
message(FATAL_ERROR "Package 'rclcpp' doesn't contain the library '${_library_target}'")
|
||||
elseif(NOT IS_ABSOLUTE "${_lib}")
|
||||
# the found library must be an absolute path
|
||||
message(FATAL_ERROR "Package 'rclcpp' found the library '${_library_target}' at '${_lib}' which is not an absolute path")
|
||||
elseif(NOT EXISTS "${_lib}")
|
||||
# the found library must exist
|
||||
message(FATAL_ERROR "Package 'rclcpp' found the library '${_lib}' which doesn't exist")
|
||||
else()
|
||||
list(APPEND _libs "${_lib}")
|
||||
endif()
|
||||
|
||||
# dependencies
|
||||
set(_exported_dependencies
|
||||
"rcl_interfaces"
|
||||
"rmw"
|
||||
"${rmw_implementation}"
|
||||
"rosidl_generator_cpp")
|
||||
set(${var_prefix}_DEFINITIONS)
|
||||
foreach(_dep ${_exported_dependencies})
|
||||
if(NOT ${_dep}_FOUND)
|
||||
find_package("${_dep}" QUIET REQUIRED)
|
||||
endif()
|
||||
if(${_dep}_DEFINITIONS)
|
||||
list_append_unique(${var_prefix}_DEFINITIONS "${${_dep}_DEFINITIONS}")
|
||||
endif()
|
||||
if(${_dep}_INCLUDE_DIRS)
|
||||
list_append_unique(${var_prefix}_INCLUDE_DIRS "${${_dep}_INCLUDE_DIRS}")
|
||||
endif()
|
||||
if(${_dep}_LIBRARIES)
|
||||
list(APPEND _libs "${${_dep}_LIBRARIES}")
|
||||
endif()
|
||||
endforeach()
|
||||
if(_libs)
|
||||
ament_libraries_deduplicate(_libs "${_libs}")
|
||||
endif()
|
||||
set(${var_prefix}_LIBRARIES "${_libs}")
|
||||
endmacro()
|
|
@ -18,41 +18,57 @@
|
|||
#include "rosidl_generator_cpp/message_type_support_decl.hpp"
|
||||
#include "rosidl_generator_cpp/service_type_support_decl.hpp"
|
||||
|
||||
#include "rosidl_generator_cpp/message_type_support.hpp"
|
||||
#include "rosidl_generator_cpp/service_type_support.hpp"
|
||||
|
||||
#include "rclcpp/visibility_control.hpp"
|
||||
|
||||
namespace rclcpp
|
||||
{
|
||||
namespace type_support
|
||||
{
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
const rosidl_message_type_support_t *
|
||||
get_intra_process_message_msg_type_support();
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
const rosidl_message_type_support_t *
|
||||
get_parameter_event_msg_type_support();
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
const rosidl_message_type_support_t *
|
||||
get_set_parameters_result_msg_type_support();
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
const rosidl_message_type_support_t *
|
||||
get_parameter_descriptor_msg_type_support();
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
const rosidl_message_type_support_t *
|
||||
get_list_parameters_result_msg_type_support();
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
const rosidl_service_type_support_t *
|
||||
get_get_parameters_srv_type_support();
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
const rosidl_service_type_support_t *
|
||||
get_get_parameter_types_srv_type_support();
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
const rosidl_service_type_support_t *
|
||||
get_set_parameters_srv_type_support();
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
const rosidl_service_type_support_t *
|
||||
get_list_parameters_srv_type_support();
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
const rosidl_service_type_support_t *
|
||||
get_describe_parameters_srv_type_support();
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
const rosidl_service_type_support_t *
|
||||
get_set_parameters_atomically_srv_type_support();
|
||||
|
||||
|
|
|
@ -24,31 +24,6 @@
|
|||
|
||||
#include "rmw/rmw.h"
|
||||
|
||||
#if !defined(RCLCPP_BUILDING_LIBRARY)
|
||||
// The following header is necessary inorder to get the correct rmw
|
||||
// implementation specific message symbols.
|
||||
// Any library or executable using librclcpp must include the header.
|
||||
// However, librclcpp must not include it.
|
||||
#include "rclcpp/type_support_def.hpp"
|
||||
|
||||
// Anonymous namespace to prevent duplicate symbols across compile units.
|
||||
namespace
|
||||
{
|
||||
|
||||
// This call to an rmw function is used to force the Linux linker to include
|
||||
// the rmw implementation library in the user's executable.
|
||||
// If this is not done, then only librclcpp is missing rmw symbols and when
|
||||
// linking the next library or exectuable the linker will discard the rmw
|
||||
// implementation shared library as unused.
|
||||
// On OS X this isn't an issue because linking is done, by default, in a flat
|
||||
// namespace, so when linking something that uses librclcpp, it will try to
|
||||
// resolve the rclcpp symbols each time, taking them from the rmw implementation
|
||||
// when it is available and not discarding it as unused during the link step.
|
||||
static const char * __rmw_identifier = rmw_get_implementation_identifier();
|
||||
|
||||
} // namespace
|
||||
#endif // !defined(RCLCPP_BUILDING_LIBRARY)
|
||||
|
||||
// This logic was borrowed (then namespaced) from the examples on the gcc wiki:
|
||||
// https://gcc.gnu.org/wiki/Visibility
|
||||
|
||||
|
|
|
@ -11,12 +11,13 @@
|
|||
<build_export_depend>rmw</build_export_depend>
|
||||
|
||||
<build_depend>rcl_interfaces</build_depend>
|
||||
<!-- This ensures the rmw impls are built first. -->
|
||||
<build_depend>rmw_implementation</build_depend>
|
||||
<build_depend>rmw_implementation_cmake</build_depend>
|
||||
<build_depend>rosidl_generator_cpp</build_depend>
|
||||
<build_export_depend>rcl_interfaces</build_export_depend>
|
||||
<build_export_depend>rosidl_generator_cpp</build_export_depend>
|
||||
|
||||
<depend>rmw_implementation</depend>
|
||||
|
||||
<test_depend>ament_cmake_gtest</test_depend>
|
||||
<test_depend>ament_lint_auto</test_depend>
|
||||
<test_depend>ament_lint_common</test_depend>
|
||||
|
|
|
@ -14,6 +14,8 @@
|
|||
|
||||
# copied from rclcpp/rclcpp-extras.cmake
|
||||
|
||||
include("${rclcpp_DIR}/get_rclcpp_information.cmake")
|
||||
|
||||
set(rclcpp_node_main_SRC "${rclcpp_DIR}/../../../src/rclcpp/node_main.cpp")
|
||||
|
||||
function(rclcpp_create_node_main node_library_target)
|
||||
|
|
|
@ -21,43 +21,6 @@
|
|||
|
||||
#include "rclcpp/node.hpp"
|
||||
|
||||
// Specializations with references to unresolved symbols to delay evaluation until later.
|
||||
// On Windows this is not necessary since it will be built against the rmw implementation directly.
|
||||
#if !defined(WIN32)
|
||||
namespace rosidl_generator_cpp
|
||||
{
|
||||
|
||||
template<>
|
||||
const rosidl_message_type_support_t *
|
||||
get_message_type_support_handle<rcl_interfaces::msg::ParameterEvent>()
|
||||
{
|
||||
return rclcpp::type_support::get_parameter_event_msg_type_support();
|
||||
}
|
||||
|
||||
template<>
|
||||
const rosidl_message_type_support_t *
|
||||
get_message_type_support_handle<rcl_interfaces::msg::SetParametersResult>()
|
||||
{
|
||||
return rclcpp::type_support::get_set_parameters_result_msg_type_support();
|
||||
}
|
||||
|
||||
template<>
|
||||
const rosidl_message_type_support_t *
|
||||
get_message_type_support_handle<rcl_interfaces::msg::ParameterDescriptor>()
|
||||
{
|
||||
return rclcpp::type_support::get_parameter_descriptor_msg_type_support();
|
||||
}
|
||||
|
||||
template<>
|
||||
const rosidl_message_type_support_t *
|
||||
get_message_type_support_handle<rcl_interfaces::msg::ListParametersResult>()
|
||||
{
|
||||
return rclcpp::type_support::get_list_parameters_result_msg_type_support();
|
||||
}
|
||||
|
||||
} // namespace rosidl_generator_cpp
|
||||
#endif
|
||||
|
||||
using rclcpp::node::Node;
|
||||
|
||||
Node::Node(const std::string & node_name, bool use_intra_process_comms)
|
||||
|
|
|
@ -18,57 +18,6 @@
|
|||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
// Specializations with references to unresolved symbols to delay evaluation until later.
|
||||
// On Windows this is not necessary since it will be built against the rmw implementation directly.
|
||||
#if !defined(WIN32)
|
||||
namespace rosidl_generator_cpp
|
||||
{
|
||||
|
||||
template<>
|
||||
const rosidl_service_type_support_t *
|
||||
get_service_type_support_handle<rcl_interfaces::srv::GetParameters>()
|
||||
{
|
||||
return rclcpp::type_support::get_get_parameters_srv_type_support();
|
||||
}
|
||||
|
||||
template<>
|
||||
const rosidl_service_type_support_t *
|
||||
get_service_type_support_handle<rcl_interfaces::srv::GetParameterTypes>()
|
||||
{
|
||||
return rclcpp::type_support::get_get_parameter_types_srv_type_support();
|
||||
}
|
||||
|
||||
template<>
|
||||
const rosidl_service_type_support_t *
|
||||
get_service_type_support_handle<rcl_interfaces::srv::SetParameters>()
|
||||
{
|
||||
return rclcpp::type_support::get_set_parameters_srv_type_support();
|
||||
}
|
||||
|
||||
template<>
|
||||
const rosidl_service_type_support_t *
|
||||
get_service_type_support_handle<rcl_interfaces::srv::ListParameters>()
|
||||
{
|
||||
return rclcpp::type_support::get_list_parameters_srv_type_support();
|
||||
}
|
||||
|
||||
template<>
|
||||
const rosidl_service_type_support_t *
|
||||
get_service_type_support_handle<rcl_interfaces::srv::DescribeParameters>()
|
||||
{
|
||||
return rclcpp::type_support::get_describe_parameters_srv_type_support();
|
||||
}
|
||||
|
||||
template<>
|
||||
const rosidl_service_type_support_t *
|
||||
get_service_type_support_handle<rcl_interfaces::srv::SetParametersAtomically>()
|
||||
{
|
||||
return rclcpp::type_support::get_set_parameters_atomically_srv_type_support();
|
||||
}
|
||||
|
||||
} // namespace rosidl_generator_cpp
|
||||
#endif
|
||||
|
||||
using rclcpp::parameter_client::AsyncParametersClient;
|
||||
using rclcpp::parameter_client::SyncParametersClient;
|
||||
|
||||
|
|
|
@ -12,9 +12,6 @@
|
|||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#ifndef RCLCPP__TYPE_SUPPORT_DEF_HPP_
|
||||
#define RCLCPP__TYPE_SUPPORT_DEF_HPP_
|
||||
|
||||
#include "rclcpp/type_support_decl.hpp"
|
||||
#include "rclcpp/visibility_control.hpp"
|
||||
|
||||
|
@ -29,8 +26,6 @@
|
|||
#include "rcl_interfaces/srv/list_parameters.hpp"
|
||||
#include "rcl_interfaces/srv/set_parameters.hpp"
|
||||
#include "rcl_interfaces/srv/set_parameters_atomically.hpp"
|
||||
#include "rosidl_generator_cpp/message_type_support.hpp"
|
||||
#include "rosidl_generator_cpp/service_type_support.hpp"
|
||||
|
||||
const rosidl_message_type_support_t *
|
||||
rclcpp::type_support::get_intra_process_message_msg_type_support()
|
||||
|
@ -119,5 +114,3 @@ rclcpp::type_support::get_set_parameters_atomically_srv_type_support()
|
|||
rcl_interfaces::srv::SetParametersAtomically
|
||||
>();
|
||||
}
|
||||
|
||||
#endif // RCLCPP__TYPE_SUPPORT_DEF_HPP_
|
|
@ -1,17 +0,0 @@
|
|||
// Copyright 2015 Open Source Robotics Foundation, Inc.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#if defined(WIN32)
|
||||
#include "rclcpp/type_support_def.hpp"
|
||||
#endif
|
Loading…
Add table
Add a link
Reference in a new issue