From ec71e6562ecac9225df8869e84a3f46db7ca9074 Mon Sep 17 00:00:00 2001 From: Dirk Thomas Date: Mon, 7 Nov 2016 10:55:17 -0800 Subject: [PATCH 1/2] move CMake function into separate file --- rclcpp/cmake/rclcpp_create_node_main.cmake | 28 ++++++++++++++++++++++ rclcpp/rclcpp-extras.cmake | 13 +--------- 2 files changed, 29 insertions(+), 12 deletions(-) create mode 100644 rclcpp/cmake/rclcpp_create_node_main.cmake diff --git a/rclcpp/cmake/rclcpp_create_node_main.cmake b/rclcpp/cmake/rclcpp_create_node_main.cmake new file mode 100644 index 0000000..3d77516 --- /dev/null +++ b/rclcpp/cmake/rclcpp_create_node_main.cmake @@ -0,0 +1,28 @@ +# 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. + +# copied from rclcpp/rclcpp-extras.cmake + + +set(rclcpp_node_main_SRC "${rclcpp_DIR}/../../../src/rclcpp/node_main.cpp") + +function(rclcpp_create_node_main node_library_target) + if(NOT TARGET ${node_library_target}) + message(FATAL_ERROR "rclcpp_create_node_main() the first argument must be a valid target name") + endif() + set(executable_name_ ${node_library_target}_node) + add_executable(${executable_name_} ${rclcpp_node_main_SRC}) + target_link_libraries(${executable_name_} ${node_library_target}) + install(TARGETS ${executable_name_} DESTINATION bin) +endfunction() diff --git a/rclcpp/rclcpp-extras.cmake b/rclcpp/rclcpp-extras.cmake index 7ecfec8..e237b62 100644 --- a/rclcpp/rclcpp-extras.cmake +++ b/rclcpp/rclcpp-extras.cmake @@ -15,15 +15,4 @@ # 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) - if(NOT TARGET ${node_library_target}) - message(FATAL_ERROR "rclcpp_create_node_main() the first argument must be a valid target name") - endif() - set(executable_name_ ${node_library_target}_node) - add_executable(${executable_name_} ${rclcpp_node_main_SRC}) - target_link_libraries(${executable_name_} ${node_library_target}) - install(TARGETS ${executable_name_} DESTINATION bin) -endfunction() +include("${rclcpp_DIR}/rclcpp_create_node_main.cmake") From 74505f25fa1057811cff23f51b1a3dda4d97b52d Mon Sep 17 00:00:00 2001 From: Dirk Thomas Date: Mon, 7 Nov 2016 14:45:44 -0800 Subject: [PATCH 2/2] add rclcpp_register_node_plugins macro --- rclcpp/cmake/rclcpp_create_node_main.cmake | 2 - rclcpp/cmake/rclcpp_package_hook.cmake | 17 ++++++ .../cmake/rclcpp_register_node_plugins.cmake | 58 +++++++++++++++++++ rclcpp/rclcpp-extras.cmake | 12 ++++ 4 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 rclcpp/cmake/rclcpp_package_hook.cmake create mode 100644 rclcpp/cmake/rclcpp_register_node_plugins.cmake diff --git a/rclcpp/cmake/rclcpp_create_node_main.cmake b/rclcpp/cmake/rclcpp_create_node_main.cmake index 3d77516..086d5f6 100644 --- a/rclcpp/cmake/rclcpp_create_node_main.cmake +++ b/rclcpp/cmake/rclcpp_create_node_main.cmake @@ -12,8 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -# copied from rclcpp/rclcpp-extras.cmake - set(rclcpp_node_main_SRC "${rclcpp_DIR}/../../../src/rclcpp/node_main.cpp") diff --git a/rclcpp/cmake/rclcpp_package_hook.cmake b/rclcpp/cmake/rclcpp_package_hook.cmake new file mode 100644 index 0000000..9e73620 --- /dev/null +++ b/rclcpp/cmake/rclcpp_package_hook.cmake @@ -0,0 +1,17 @@ +# Copyright 2016 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. + +# register node plugins +ament_index_register_resource( + "node_plugin" CONTENT "${_RCLCPP__NODE_PLUGINS}") diff --git a/rclcpp/cmake/rclcpp_register_node_plugins.cmake b/rclcpp/cmake/rclcpp_register_node_plugins.cmake new file mode 100644 index 0000000..254d2b8 --- /dev/null +++ b/rclcpp/cmake/rclcpp_register_node_plugins.cmake @@ -0,0 +1,58 @@ +# Copyright 2016 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. + +# +# Register a node plugin with the ament resource index. +# +# The passed library can contain multiple plugins extending the node interface. +# +# :param target: the shared library target +# :type target: string +# :param ARGN: the unique plugin names being exported using class_loader +# :type ARGN: list of strings +# +macro(rclcpp_register_node_plugins target) + if(NOT TARGET ${target}) + message( + FATAL_ERROR + "rclcpp_register_node_plugins() first argument '${target}' is not a target") + endif() + get_target_property(_target_type ${target} TYPE) + if(NOT _target_type STREQUAL "SHARED_LIBRARY") + message( + FATAL_ERROR + "rclcpp_register_node_plugins() first argument '${target}' is not a shared library target") + endif() + + if(${ARGC} GREATER 0) + _rclcpp_register_package_hook() + set(_unique_names) + foreach(_arg ${ARGN}) + if(_arg IN_LIST _unique_names) + message( + FATAL_ERROR + "rclcpp_register_node_plugins() the plugin names must be unique (multiple '${_arg}')") + endif() + list(APPEND _unique_names "${_arg}") + + if(WIN32) + set(_path "bin") + else() + set(_path "lib") + endif() + set(_RCLCPP__NODE_PLUGINS + "${_RCLCPP__NODE_PLUGINS}${_arg};${_path}/$\n") + endforeach() + endif() +endmacro() diff --git a/rclcpp/rclcpp-extras.cmake b/rclcpp/rclcpp-extras.cmake index e237b62..facb37c 100644 --- a/rclcpp/rclcpp-extras.cmake +++ b/rclcpp/rclcpp-extras.cmake @@ -14,5 +14,17 @@ # copied from rclcpp/rclcpp-extras.cmake +# register ament_package() hook for node plugins once +macro(_rclcpp_register_package_hook) + if(NOT DEFINED _RCLCPP_PACKAGE_HOOK_REGISTERED) + set(_RCLCPP_PACKAGE_HOOK_REGISTERED TRUE) + + find_package(ament_cmake_core QUIET REQUIRED) + ament_register_extension("ament_package" "rclcpp" + "rclcpp_package_hook.cmake") + endif() +endmacro() + include("${rclcpp_DIR}/get_rclcpp_information.cmake") include("${rclcpp_DIR}/rclcpp_create_node_main.cmake") +include("${rclcpp_DIR}/rclcpp_register_node_plugins.cmake")