From cab592caed28d4cf30c4fd029fe8cd1f4787d786 Mon Sep 17 00:00:00 2001 From: Gonzalo de Pedro Date: Tue, 20 Feb 2024 15:10:23 -0300 Subject: [PATCH 1/2] first commit Signed-off-by: Gonzalo de Pedro --- rosidl_typesupport_protobuf_c/CMakeLists.txt | 5 -- .../bin/rosidl_typesupport_protobuf_c | 54 ------------- ...idl_typesupport_protobuf_c-extras.cmake.in | 11 +-- ...pport_protobuf_c_generate_interfaces.cmake | 45 ----------- ...pesupport_protobuf_c_write_arguments.cmake | 56 ++++++++++++++ .../rosidl_typesupport_protobuf_c/__init__.py | 18 ++++- .../CMakeLists.txt | 5 -- .../bin/rosidl_typesupport_protobuf_cpp | 49 ------------ ...l_typesupport_protobuf_cpp-extras.cmake.in | 11 +-- ...ort_protobuf_cpp_generate_interfaces.cmake | 57 -------------- ...support_protobuf_cpp_write_arguments_cmake | 75 +++++++++++++++++++ .../__init__.py | 11 ++- 12 files changed, 164 insertions(+), 233 deletions(-) delete mode 100644 rosidl_typesupport_protobuf_c/bin/rosidl_typesupport_protobuf_c create mode 100644 rosidl_typesupport_protobuf_c/cmake/rosidl_typesupport_protobuf_c_write_arguments.cmake delete mode 100644 rosidl_typesupport_protobuf_cpp/bin/rosidl_typesupport_protobuf_cpp create mode 100644 rosidl_typesupport_protobuf_cpp/cmake/rosidl_typesupport_protobuf_cpp_write_arguments_cmake diff --git a/rosidl_typesupport_protobuf_c/CMakeLists.txt b/rosidl_typesupport_protobuf_c/CMakeLists.txt index c843619..dd473d2 100644 --- a/rosidl_typesupport_protobuf_c/CMakeLists.txt +++ b/rosidl_typesupport_protobuf_c/CMakeLists.txt @@ -121,11 +121,6 @@ ament_package( CONFIG_EXTRAS "cmake/rosidl_typesupport_protobuf_c-extras.cmake.in" ) -install( - PROGRAMS bin/rosidl_typesupport_protobuf_c - DESTINATION lib/rosidl_typesupport_protobuf_c -) - install( DIRECTORY cmake resource DESTINATION share/${PROJECT_NAME} diff --git a/rosidl_typesupport_protobuf_c/bin/rosidl_typesupport_protobuf_c b/rosidl_typesupport_protobuf_c/bin/rosidl_typesupport_protobuf_c deleted file mode 100644 index 42ae009..0000000 --- a/rosidl_typesupport_protobuf_c/bin/rosidl_typesupport_protobuf_c +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python3 - -# ================================= Apache 2.0 ================================= -# -# Copyright (C) 2021 Continental -# -# 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. -# -# ================================= Apache 2.0 ================================= - -import argparse -import os -import sys -import rosidl_typesupport_protobuf - -from rosidl_typesupport_protobuf_c import generate_typesupport_protobuf_c - -def is_valid_file(parser, file_name): - if not os.path.exists(file_name): - parser.error("File does not exist: '{0}'".format(file_name)) - file_name_abs = os.path.abspath(file_name) - if not os.path.isfile(file_name_abs): - parser.error("Path exists but is not a file: '{0}'".format(file_name_abs)) - return file_name - - -def main(argv=sys.argv[1:]): - parser = argparse.ArgumentParser( - description='Generate the C interfaces for Protobuf.', - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument( - '--generator-arguments-file', - required=True, - help='The location of the file containing the generator arguments') - args = parser.parse_args(argv) - - rosidl_typesupport_protobuf.set_namespace_delimeter("__") - rosidl_typesupport_protobuf.set_type_support_name("rosidl_typesupport_protobuf_c") - - return generate_typesupport_protobuf_c(args.generator_arguments_file) - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/rosidl_typesupport_protobuf_c/cmake/rosidl_typesupport_protobuf_c-extras.cmake.in b/rosidl_typesupport_protobuf_c/cmake/rosidl_typesupport_protobuf_c-extras.cmake.in index 9a297aa..0297d37 100644 --- a/rosidl_typesupport_protobuf_c/cmake/rosidl_typesupport_protobuf_c-extras.cmake.in +++ b/rosidl_typesupport_protobuf_c/cmake/rosidl_typesupport_protobuf_c-extras.cmake.in @@ -7,16 +7,17 @@ if(NOT Protobuf_FOUND) message(STATUS "Could not find Protobuf: skipping rosidl_typesupport_protobuf_c") else() find_package(ament_cmake_core QUIET REQUIRED) + + ament_register_extension( + "rosidl_write_generator_arguments_extensions" + "rosidl_typesupport_protobuf_c" + "rosidl_typesupport_protobuf_c_write_arguments.cmake") + ament_register_extension( "rosidl_generate_idl_interfaces" "rosidl_typesupport_protobuf_c" "rosidl_typesupport_protobuf_c_generate_interfaces.cmake") - set(rosidl_typesupport_protobuf_c_BIN - "${rosidl_typesupport_protobuf_c_DIR}/../../../lib/rosidl_typesupport_protobuf_c/rosidl_typesupport_protobuf_c") - normalize_path(rosidl_typesupport_protobuf_c_BIN - "${rosidl_typesupport_protobuf_c_BIN}") - set(rosidl_typesupport_protobuf_c_GENERATOR_FILES "${rosidl_typesupport_protobuf_c_DIR}/../../../@PYTHON_INSTALL_DIR@/rosidl_typesupport_protobuf_c/__init__.py") normalize_path(rosidl_typesupport_protobuf_c_GENERATOR_FILES diff --git a/rosidl_typesupport_protobuf_c/cmake/rosidl_typesupport_protobuf_c_generate_interfaces.cmake b/rosidl_typesupport_protobuf_c/cmake/rosidl_typesupport_protobuf_c_generate_interfaces.cmake index 376a70d..46d7fd8 100644 --- a/rosidl_typesupport_protobuf_c/cmake/rosidl_typesupport_protobuf_c_generate_interfaces.cmake +++ b/rosidl_typesupport_protobuf_c/cmake/rosidl_typesupport_protobuf_c_generate_interfaces.cmake @@ -34,51 +34,6 @@ foreach(_abs_idl_file ${rosidl_generate_interfaces_ABS_IDL_FILES}) ) endforeach() -set(_dependency_files "") -set(_dependencies "") -foreach(_pkg_name ${rosidl_generate_interfaces_DEPENDENCY_PACKAGE_NAMES}) - foreach(_idl_file ${${_pkg_name}_IDL_FILES}) - set(_abs_idl_file "${${_pkg_name}_DIR}/../${_idl_file}") - normalize_path(_abs_idl_file "${_abs_idl_file}") - list(APPEND _dependency_files "${_abs_idl_file}") - list(APPEND _dependencies "${_pkg_name}:${_abs_idl_file}") - endforeach() -endforeach() - -set(target_dependencies - "${rosidl_typesupport_protobuf_c_BIN}" - ${rosidl_typesupport_protobuf_c_GENERATOR_FILES} - "${rosidl_typesupport_protobuf_c_TEMPLATE_DIR}/idl__rosidl_typesupport_protobuf_c.hpp.em" - "${rosidl_typesupport_protobuf_c_TEMPLATE_DIR}/idl__type_support.cpp.em" - "${rosidl_typesupport_protobuf_c_TEMPLATE_DIR}/msg__rosidl_typesupport_protobuf_c.hpp.em" - "${rosidl_typesupport_protobuf_c_TEMPLATE_DIR}/msg__type_support.cpp.em" - "${rosidl_typesupport_protobuf_c_TEMPLATE_DIR}/srv__rosidl_typesupport_protobuf_c.hpp.em" - "${rosidl_typesupport_protobuf_c_TEMPLATE_DIR}/srv__type_support.cpp.em" - "${rosidl_typesupport_protobuf_c_TEMPLATE_DIR}/rosidl_typesupport_protobuf_c__visibility_control.h.in" - ${rosidl_generate_interfaces_ABS_IDL_FILES} - ${_dependency_files} -) - -set(generator_arguments_file "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_protobuf_c__arguments.json") -rosidl_write_generator_arguments( - "${generator_arguments_file}" - PACKAGE_NAME "${PROJECT_NAME}" - IDL_TUPLES "${rosidl_generate_interfaces_IDL_TUPLES}" - ROS_INTERFACE_DEPENDENCIES "${_dependencies}" - OUTPUT_DIR "${_output_path}" - TEMPLATE_DIR "${rosidl_typesupport_protobuf_c_TEMPLATE_DIR}" - TARGET_DEPENDENCIES ${target_dependencies} -) - -add_custom_command( - OUTPUT ${_generated_files} - COMMAND ${PYTHON_EXECUTABLE} ${rosidl_typesupport_protobuf_c_BIN} - --generator-arguments-file "${generator_arguments_file}" - DEPENDS ${target_dependencies} - COMMENT "Generating C type support for Protobuf" - VERBATIM -) - set(_target_suffix "__rosidl_typesupport_protobuf_c") link_directories(${Protobuf_LIBRARY_DIRS}) diff --git a/rosidl_typesupport_protobuf_c/cmake/rosidl_typesupport_protobuf_c_write_arguments.cmake b/rosidl_typesupport_protobuf_c/cmake/rosidl_typesupport_protobuf_c_write_arguments.cmake new file mode 100644 index 0000000..a5e4c84 --- /dev/null +++ b/rosidl_typesupport_protobuf_c/cmake/rosidl_typesupport_protobuf_c_write_arguments.cmake @@ -0,0 +1,56 @@ +# Copyright 2024 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. + +set(_output_path + "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_protobuf_c/${PROJECT_NAME}") +set(_generated_files "") + +set(_dependency_files "") +set(_dependencies "") +foreach(_pkg_name ${rosidl_generate_interfaces_DEPENDENCY_PACKAGE_NAMES}) + foreach(_idl_file ${${_pkg_name}_IDL_FILES}) + set(_abs_idl_file "${${_pkg_name}_DIR}/../${_idl_file}") + normalize_path(_abs_idl_file "${_abs_idl_file}") + list(APPEND _dependency_files "${_abs_idl_file}") + list(APPEND _dependencies "${_pkg_name}:${_abs_idl_file}") + endforeach() +endforeach() + +set(target_dependencies + "${rosidl_typesupport_protobuf_c_BIN}" + ${rosidl_typesupport_protobuf_c_GENERATOR_FILES} + "${rosidl_typesupport_protobuf_c_TEMPLATE_DIR}/idl__rosidl_typesupport_protobuf_c.hpp.em" + "${rosidl_typesupport_protobuf_c_TEMPLATE_DIR}/idl__type_support.cpp.em" + "${rosidl_typesupport_protobuf_c_TEMPLATE_DIR}/msg__rosidl_typesupport_protobuf_c.hpp.em" + "${rosidl_typesupport_protobuf_c_TEMPLATE_DIR}/msg__type_support.cpp.em" + "${rosidl_typesupport_protobuf_c_TEMPLATE_DIR}/srv__rosidl_typesupport_protobuf_c.hpp.em" + "${rosidl_typesupport_protobuf_c_TEMPLATE_DIR}/srv__type_support.cpp.em" + "${rosidl_typesupport_protobuf_c_TEMPLATE_DIR}/rosidl_typesupport_protobuf_c__visibility_control.h.in" + ${rosidl_generate_interfaces_ABS_IDL_FILES} + ${_dependency_files} +) + +set(generator_arguments_file "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_protobuf_c__arguments.json") +rosidl_write_generator_arguments( + "${generator_arguments_file}" + PACKAGE_NAME "${PROJECT_NAME}" + IDL_TUPLES "${rosidl_generate_interfaces_IDL_TUPLES}" + ROS_INTERFACE_DEPENDENCIES "${_dependencies}" + OUTPUT_DIR "${_output_path}" + TEMPLATE_DIR "${rosidl_typesupport_protobuf_c_TEMPLATE_DIR}" + TARGET_DEPENDENCIES ${target_dependencies} + GENERATOR_FILES "${rosidl_typesupport_protobuf_c_GENERATOR_FILES}" +) + +list(APPEND rosidl_generator_arguments_files ${generator_arguments_file}) \ No newline at end of file diff --git a/rosidl_typesupport_protobuf_c/rosidl_typesupport_protobuf_c/__init__.py b/rosidl_typesupport_protobuf_c/rosidl_typesupport_protobuf_c/__init__.py index db60ce3..75e7539 100644 --- a/rosidl_typesupport_protobuf_c/rosidl_typesupport_protobuf_c/__init__.py +++ b/rosidl_typesupport_protobuf_c/rosidl_typesupport_protobuf_c/__init__.py @@ -12,12 +12,22 @@ # See the License for the specific language governing permissions and # limitations under the License. -from rosidl_cmake import generate_files +from rosidl_pycommon import generate_files -def generate_typesupport_protobuf_c(generator_arguments_file): - mapping = { +def get_template_mapping(): + return { 'idl__rosidl_typesupport_protobuf_c.hpp.em': '%s__rosidl_typesupport_protobuf_c.hpp', 'idl__type_support.cpp.em': 'detail/%s__type_support.cpp', } - generate_files(generator_arguments_file, mapping) + +def generate_typesupport_protobuf_c(generator_arguments_file): + """ + Generate the C type support to handle ROS messages. + :param generator_arguments_file: Path location of the file containing the generator arguments + :param type_support: List of type supports to be used + """ + mapping = get_template_mapping() + + return generate_files( + generator_arguments_file, mapping) diff --git a/rosidl_typesupport_protobuf_cpp/CMakeLists.txt b/rosidl_typesupport_protobuf_cpp/CMakeLists.txt index 2413e03..ccac6d0 100644 --- a/rosidl_typesupport_protobuf_cpp/CMakeLists.txt +++ b/rosidl_typesupport_protobuf_cpp/CMakeLists.txt @@ -100,11 +100,6 @@ endif() ament_package(CONFIG_EXTRAS "cmake/rosidl_typesupport_protobuf_cpp-extras.cmake.in") -install( - PROGRAMS bin/rosidl_typesupport_protobuf_cpp - DESTINATION lib/rosidl_typesupport_protobuf_cpp -) - install( DIRECTORY cmake resource DESTINATION share/${PROJECT_NAME} diff --git a/rosidl_typesupport_protobuf_cpp/bin/rosidl_typesupport_protobuf_cpp b/rosidl_typesupport_protobuf_cpp/bin/rosidl_typesupport_protobuf_cpp deleted file mode 100644 index c8f50a5..0000000 --- a/rosidl_typesupport_protobuf_cpp/bin/rosidl_typesupport_protobuf_cpp +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env python3 - -# ================================= Apache 2.0 ================================= -# -# Copyright (C) 2021 Continental -# -# 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. -# -# ================================= Apache 2.0 ================================= - -import argparse -import sys -import pathlib -import os -import rosidl_typesupport_protobuf - -from rosidl_cmake import read_generator_arguments -from rosidl_typesupport_protobuf_cpp import generate_cpp - -def main(argv=sys.argv[1:]): - parser = argparse.ArgumentParser( - description='Generate the Protobuf & C++ interfaces for Protobuf type support.', - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument( - '--generator-arguments-file', - required=True, - help='The location of the file containing the generator arguments') - - args = parser.parse_args(argv) - rosidl_typesupport_protobuf.set_namespace_delimeter("::") - rosidl_typesupport_protobuf.set_type_support_name("rosidl_typesupport_protobuf_cpp") - # Generate typesupport cpp files - rc = generate_cpp(args.generator_arguments_file) - - return rc - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/rosidl_typesupport_protobuf_cpp/cmake/rosidl_typesupport_protobuf_cpp-extras.cmake.in b/rosidl_typesupport_protobuf_cpp/cmake/rosidl_typesupport_protobuf_cpp-extras.cmake.in index fc06bc4..15d11e2 100644 --- a/rosidl_typesupport_protobuf_cpp/cmake/rosidl_typesupport_protobuf_cpp-extras.cmake.in +++ b/rosidl_typesupport_protobuf_cpp/cmake/rosidl_typesupport_protobuf_cpp-extras.cmake.in @@ -10,16 +10,17 @@ if(NOT Protobuf_FOUND) ) else() find_package(ament_cmake_core QUIET REQUIRED) + + ament_register_extension( + "rosidl_write_generator_arguments_extensions" + "rosidl_typesupport_protobuf_cpp" + "rosidl_typesupport_protobuf_cpp_write_arguments.cmake") + ament_register_extension( "rosidl_generate_idl_interfaces" "rosidl_typesupport_protobuf_cpp" "rosidl_typesupport_protobuf_cpp_generate_interfaces.cmake") - set(rosidl_typesupport_protobuf_cpp_BIN - "${rosidl_typesupport_protobuf_cpp_DIR}/../../../lib/rosidl_typesupport_protobuf_cpp/rosidl_typesupport_protobuf_cpp") - normalize_path(rosidl_typesupport_protobuf_cpp_BIN - "${rosidl_typesupport_protobuf_cpp_BIN}") - set(rosidl_typesupport_protobuf_cpp_GENERATOR_FILES "${rosidl_typesupport_protobuf_cpp_DIR}/../../../@PYTHON_INSTALL_DIR@/rosidl_typesupport_protobuf_cpp/__init__.py") normalize_path(rosidl_typesupport_protobuf_cpp_GENERATOR_FILES diff --git a/rosidl_typesupport_protobuf_cpp/cmake/rosidl_typesupport_protobuf_cpp_generate_interfaces.cmake b/rosidl_typesupport_protobuf_cpp/cmake/rosidl_typesupport_protobuf_cpp_generate_interfaces.cmake index 88c8853..874012f 100644 --- a/rosidl_typesupport_protobuf_cpp/cmake/rosidl_typesupport_protobuf_cpp_generate_interfaces.cmake +++ b/rosidl_typesupport_protobuf_cpp/cmake/rosidl_typesupport_protobuf_cpp_generate_interfaces.cmake @@ -37,63 +37,6 @@ foreach(_abs_idl_file ${rosidl_generate_interfaces_ABS_IDL_FILES}) ) endforeach() -# Create a list of IDL files from other packages that this generator should depend on -set(_dependency_files "") -set(_dependencies "") -foreach(_pkg_name ${rosidl_generate_interfaces_DEPENDENCY_PACKAGE_NAMES}) - foreach(_idl_file ${${_pkg_name}_IDL_FILES}) - # ${{_pkg_name}_DIR} is absolute path ending in 'share//cmake', so go back one - # directory for IDL files - set(_abs_idl_file "${${_pkg_name}_DIR}/../${_idl_file}") - normalize_path(_abs_idl_file "${_abs_idl_file}") - list(APPEND _dependency_files "${_abs_idl_file}") - list(APPEND _dependencies "${_pkg_name}:${_abs_idl_file}") - endforeach() -endforeach() - -# Create a list of templates and source files this generator uses, and check that they exist -set(target_dependencies - "${rosidl_typesupport_protobuf_cpp_BIN}" - ${rosidl_typesupport_protobuf_cpp_GENERATOR_FILES} - "${rosidl_typesupport_protobuf_cpp_TEMPLATE_DIR}/idl__rosidl_typesupport_protobuf_cpp.hpp.em" - "${rosidl_typesupport_protobuf_cpp_TEMPLATE_DIR}/idl__type_support.cpp.em" - "${rosidl_typesupport_protobuf_cpp_TEMPLATE_DIR}/msg__rosidl_typesupport_protobuf_cpp.hpp.em" - "${rosidl_typesupport_protobuf_cpp_TEMPLATE_DIR}/idl__typeadapter_protobuf_cpp.hpp.em" - "${rosidl_typesupport_protobuf_cpp_TEMPLATE_DIR}/msg__type_support.cpp.em" - "${rosidl_typesupport_protobuf_cpp_TEMPLATE_DIR}/srv__rosidl_typesupport_protobuf_cpp.hpp.em" - "${rosidl_typesupport_protobuf_cpp_TEMPLATE_DIR}/srv__type_support.cpp.em" - "${rosidl_typesupport_protobuf_cpp_TEMPLATE_DIR}/rosidl_typesupport_protobuf_cpp__visibility_control.h.in" - ${rosidl_generate_interfaces_ABS_IDL_FILES} - ${_dependency_files} -) -foreach(dep ${target_dependencies}) - if(NOT EXISTS "${dep}") - message(FATAL_ERROR "Target dependency '${dep}' does not exist") - endif() -endforeach() - -# Write all this to a file to work around command line length limitations on some platforms -set(generator_arguments_file "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_protobuf_cpp__arguments.json") -rosidl_write_generator_arguments( - "${generator_arguments_file}" - PACKAGE_NAME "${PROJECT_NAME}" - IDL_TUPLES "${rosidl_generate_interfaces_IDL_TUPLES}" - ROS_INTERFACE_DEPENDENCIES "${_dependencies}" - OUTPUT_DIR "${_output_path}" - TEMPLATE_DIR "${rosidl_typesupport_protobuf_cpp_TEMPLATE_DIR}" - TARGET_DEPENDENCIES ${target_dependencies} -) - -# Add a command that invokes generator at build time -add_custom_command( - OUTPUT ${_generated_files} - COMMAND ${PYTHON_EXECUTABLE} ${rosidl_typesupport_protobuf_cpp_BIN} - --generator-arguments-file "${generator_arguments_file}" - DEPENDS ${target_dependencies} - COMMENT "Generating C++ type support for Protobuf" - VERBATIM -) - # generate header to switch between export and import for a specific package set(_visibility_control_file "${_output_path}/rosidl_typesupport_protobuf_cpp__visibility_control.h") diff --git a/rosidl_typesupport_protobuf_cpp/cmake/rosidl_typesupport_protobuf_cpp_write_arguments_cmake b/rosidl_typesupport_protobuf_cpp/cmake/rosidl_typesupport_protobuf_cpp_write_arguments_cmake new file mode 100644 index 0000000..d1f8ac6 --- /dev/null +++ b/rosidl_typesupport_protobuf_cpp/cmake/rosidl_typesupport_protobuf_cpp_write_arguments_cmake @@ -0,0 +1,75 @@ +# Copyright 2024 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. + +# Create a list of IDL files from other packages that this generator should depend on +set(_dependency_files "") +set(_dependencies "") +foreach(_pkg_name ${rosidl_generate_interfaces_DEPENDENCY_PACKAGE_NAMES}) + foreach(_idl_file ${${_pkg_name}_IDL_FILES}) + # ${{_pkg_name}_DIR} is absolute path ending in 'share//cmake', so go back one + # directory for IDL files + set(_abs_idl_file "${${_pkg_name}_DIR}/../${_idl_file}") + normalize_path(_abs_idl_file "${_abs_idl_file}") + list(APPEND _dependency_files "${_abs_idl_file}") + list(APPEND _dependencies "${_pkg_name}:${_abs_idl_file}") + endforeach() +endforeach() + +# Create a list of templates and source files this generator uses, and check that they exist +set(target_dependencies + "${rosidl_typesupport_protobuf_cpp_BIN}" + ${rosidl_typesupport_protobuf_cpp_GENERATOR_FILES} + "${rosidl_typesupport_protobuf_cpp_TEMPLATE_DIR}/idl__rosidl_typesupport_protobuf_cpp.hpp.em" + "${rosidl_typesupport_protobuf_cpp_TEMPLATE_DIR}/idl__type_support.cpp.em" + "${rosidl_typesupport_protobuf_cpp_TEMPLATE_DIR}/msg__rosidl_typesupport_protobuf_cpp.hpp.em" + "${rosidl_typesupport_protobuf_cpp_TEMPLATE_DIR}/idl__typeadapter_protobuf_cpp.hpp.em" + "${rosidl_typesupport_protobuf_cpp_TEMPLATE_DIR}/msg__type_support.cpp.em" + "${rosidl_typesupport_protobuf_cpp_TEMPLATE_DIR}/srv__rosidl_typesupport_protobuf_cpp.hpp.em" + "${rosidl_typesupport_protobuf_cpp_TEMPLATE_DIR}/srv__type_support.cpp.em" + "${rosidl_typesupport_protobuf_cpp_TEMPLATE_DIR}/rosidl_typesupport_protobuf_cpp__visibility_control.h.in" + ${rosidl_generate_interfaces_ABS_IDL_FILES} + ${_dependency_files} +) +foreach(dep ${target_dependencies}) + if(NOT EXISTS "${dep}") + message(FATAL_ERROR "Target dependency '${dep}' does not exist") + endif() +endforeach() + +# Write all this to a file to work around command line length limitations on some platforms +set(generator_arguments_file "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_protobuf_cpp__arguments.json") +rosidl_write_generator_arguments( + "${generator_arguments_file}" + PACKAGE_NAME "${PROJECT_NAME}" + IDL_TUPLES "${rosidl_generate_interfaces_IDL_TUPLES}" + ROS_INTERFACE_DEPENDENCIES "${_dependencies}" + OUTPUT_DIR "${_output_path}" + TEMPLATE_DIR "${rosidl_typesupport_protobuf_cpp_TEMPLATE_DIR}" + TARGET_DEPENDENCIES ${target_dependencies} +) + +# Write all this to a file to work around command line length limitations on some platforms +set(generator_arguments_file "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_protobuf_cpp__arguments.json") +rosidl_write_generator_arguments( + "${generator_arguments_file}" + PACKAGE_NAME "${PROJECT_NAME}" + IDL_TUPLES "${rosidl_generate_interfaces_IDL_TUPLES}" + ROS_INTERFACE_DEPENDENCIES "${_dependencies}" + OUTPUT_DIR "${_output_path}" + TEMPLATE_DIR "${rosidl_typesupport_protobuf_cpp_TEMPLATE_DIR}" + TARGET_DEPENDENCIES ${target_dependencies} + GENERATOR_FILES "${rosidl_typesupport_protobuf_cpp_GENERATOR_FILES}" +) + +list(APPEND rosidl_generator_arguments_files ${generator_arguments_file}) \ No newline at end of file diff --git a/rosidl_typesupport_protobuf_cpp/rosidl_typesupport_protobuf_cpp/__init__.py b/rosidl_typesupport_protobuf_cpp/rosidl_typesupport_protobuf_cpp/__init__.py index 827e39f..806324c 100644 --- a/rosidl_typesupport_protobuf_cpp/rosidl_typesupport_protobuf_cpp/__init__.py +++ b/rosidl_typesupport_protobuf_cpp/rosidl_typesupport_protobuf_cpp/__init__.py @@ -18,12 +18,15 @@ from rosidl_cmake import generate_files +from rosidl_pycommon import generate_files -def generate_cpp(generator_arguments_file): - mapping = { +def get_template_mapping(): + return { "idl__rosidl_typesupport_protobuf_cpp.hpp.em": "%s__rosidl_typesupport_protobuf_cpp.hpp", "idl__typeadapter_protobuf_cpp.hpp.em": "%s__typeadapter_protobuf_cpp.hpp", "idl__type_support.cpp.em": "detail/%s__type_support.cpp", } - generate_files(generator_arguments_file, mapping) - return 0 + +def generate_cpp(generator_arguments_file): + mapping = get_template_mapping() + return generate_files(generator_arguments_file, mapping) From a28e88a4d26dcaa8c253a91bb318e527957a64a6 Mon Sep 17 00:00:00 2001 From: Gonzalo de Pedro Date: Wed, 21 Feb 2024 14:55:04 -0300 Subject: [PATCH 2/2] Changes to allow for calling templates from arguments file Signed-off-by: Gonzalo de Pedro --- .../rosidl_typesupport_protobuf/__init__.py | 37 ++++++++----------- ...pesupport_protobuf_c_write_arguments.cmake | 7 ++++ .../resource/idl__type_support.cpp.em | 3 +- .../msg__rosidl_typesupport_protobuf_c.hpp.em | 6 +-- .../resource/msg__type_support.cpp.em | 6 +-- .../resource/srv__type_support.cpp.em | 4 +- .../resource/tmpl_forward_declarations.em | 4 +- .../resource/idl__type_support.cpp.em | 2 +- .../idl__typeadapter_protobuf_cpp.hpp.em | 6 +-- ...sg__rosidl_typesupport_protobuf_cpp.hpp.em | 6 +-- .../resource/msg__type_support.cpp.em | 4 +- .../resource/srv__type_support.cpp.em | 4 +- .../resource/tmpl_forward_declarations.em | 4 +- 13 files changed, 47 insertions(+), 46 deletions(-) diff --git a/rosidl_typesupport_protobuf/rosidl_typesupport_protobuf/__init__.py b/rosidl_typesupport_protobuf/rosidl_typesupport_protobuf/__init__.py index c3e690d..c2a28c7 100644 --- a/rosidl_typesupport_protobuf/rosidl_typesupport_protobuf/__init__.py +++ b/rosidl_typesupport_protobuf/rosidl_typesupport_protobuf/__init__.py @@ -21,15 +21,8 @@ # A postfix for the protobuf package name / the c++ namespace PROTO_PACKAGE_POSTFIX = 'pb' -_TYPE_SUPPORT_NAME = '' _NAMESPACE_DELIMETER = '' - -def set_type_support_name(val): - global _TYPE_SUPPORT_NAME - _TYPE_SUPPORT_NAME = val - - def set_namespace_delimeter(val): global _NAMESPACE_DELIMETER _NAMESPACE_DELIMETER = val @@ -85,56 +78,56 @@ def protobuf_message_header(package_name, interface_path): return '/'.join(include_parts + [include_prefix + '.pb.h']) -def typesupport_header(package_name, interface_path): +def typesupport_header(package_name, interface_path, typesupport_name): include_parts = [package_name] + list(interface_path.parents[0].parts) + \ [convert_camel_case_to_lower_case_underscore(interface_path.stem)] include_base = '/'.join(include_parts) - return f'{include_base}__{_TYPE_SUPPORT_NAME}.hpp' + return f'{include_base}__{typesupport_name}.hpp' -def visibility_control_header(package_name): - return f'{package_name}/{_TYPE_SUPPORT_NAME}__visibility_control.h' +def visibility_control_header(package_name, typesupport_name): + return f'{package_name}/{typesupport_name}__visibility_control.h' def adapter_visibility_control_header(package_name): return f'{package_name}/rosidl_adapter_proto__visibility_control.h' -def ros_type_namespace(package_name, interface_path): - return _NAMESPACE_DELIMETER.join([package_name] + list(interface_path.parents[0].parts)) +def ros_type_namespace(package_name, interface_path, namespace_delimiter): + return namespace_delimiter.join([package_name] + list(interface_path.parents[0].parts)) def ros_type_name(message): return message.structure.namespaced_type.name -def ros_type(package_name, interface_path, message): +def ros_type(package_name, interface_path, message, namespace_delimiter): ros_type_ns = ros_type_namespace(package_name, interface_path) ros_type_nm = ros_type_name(message) - return '::' + _NAMESPACE_DELIMETER.join([ros_type_ns, ros_type_nm]) + return '::' + namespace_delimiter.join([ros_type_ns, ros_type_nm]) -def ros_type_from_namespaced_type(namespaced_type): - return '::' + _NAMESPACE_DELIMETER.join(namespaced_type.namespaces + [namespaced_type.name]) +def ros_type_from_namespaced_type(namespaced_type, namespace_delimiter): + return '::' + namespace_delimiter.join(namespaced_type.namespaces + [namespaced_type.name]) def ros_type_from_namespaced_type_c(namespaced_type): - return '::' + _NAMESPACE_DELIMETER.join(namespaced_type.namespaces + [namespaced_type.name]) + return '::' + '__'.join(namespaced_type.namespaces + [namespaced_type.name]) -def ros_service_namespace(package_name, interface_path): - return _NAMESPACE_DELIMETER.join([package_name] + list(interface_path.parents[0].parts)) +def ros_service_namespace(package_name, interface_path, namespace_delimiter): + return namespace_delimiter.join([package_name] + list(interface_path.parents[0].parts)) def ros_service_name(service): return service.namespaced_type.name -def ros_service_type(package_name, interface_path, service): +def ros_service_type(package_name, interface_path, service, namespace_delimiter): ros_type_ns = ros_service_namespace(package_name, interface_path) ros_type_nm = ros_service_name(service) - return '::' + _NAMESPACE_DELIMETER.join([ros_type_ns, ros_type_nm]) + return '::' + namespace_delimiter.join([ros_type_ns, ros_type_nm]) def protobuf_type(package_name, interface_path, message): diff --git a/rosidl_typesupport_protobuf_c/cmake/rosidl_typesupport_protobuf_c_write_arguments.cmake b/rosidl_typesupport_protobuf_c/cmake/rosidl_typesupport_protobuf_c_write_arguments.cmake index a5e4c84..631ed9b 100644 --- a/rosidl_typesupport_protobuf_c/cmake/rosidl_typesupport_protobuf_c_write_arguments.cmake +++ b/rosidl_typesupport_protobuf_c/cmake/rosidl_typesupport_protobuf_c_write_arguments.cmake @@ -41,6 +41,12 @@ set(target_dependencies ${_dependency_files} ) +set(additional_context_file "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_protobuf_c__additional_context.json") +rosidl_write_additional_context( + "${additional_context_file}" + TYPE_SUPPORTS "rosidl_typesupport_protobuf_c" +) + set(generator_arguments_file "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_protobuf_c__arguments.json") rosidl_write_generator_arguments( "${generator_arguments_file}" @@ -51,6 +57,7 @@ rosidl_write_generator_arguments( TEMPLATE_DIR "${rosidl_typesupport_protobuf_c_TEMPLATE_DIR}" TARGET_DEPENDENCIES ${target_dependencies} GENERATOR_FILES "${rosidl_typesupport_protobuf_c_GENERATOR_FILES}" + ADDITIONAL_CONTEXT_FILE "${additional_context_file}" ) list(APPEND rosidl_generator_arguments_files ${generator_arguments_file}) \ No newline at end of file diff --git a/rosidl_typesupport_protobuf_c/resource/idl__type_support.cpp.em b/rosidl_typesupport_protobuf_c/resource/idl__type_support.cpp.em index ea6864d..72cac99 100644 --- a/rosidl_typesupport_protobuf_c/resource/idl__type_support.cpp.em +++ b/rosidl_typesupport_protobuf_c/resource/idl__type_support.cpp.em @@ -27,6 +27,7 @@ @# Context: @# - package_name (string) @# - interface_path (Path relative to the directory named after the package) +@# - typesupport @# - content (IdlContent, list of elements, e.g. Messages or Services) @####################################################################### @ @@ -39,7 +40,7 @@ forward_declared_types = set() system_header_files = [] header_files = [ - typesupport_header(package_name, interface_path), + typesupport_header(package_name, interface_path, 'rosidl_typesupport_protobuf_c'), ros_message_header_c(package_name, interface_path), ros_message_functions_header_c(package_name, interface_path) ] diff --git a/rosidl_typesupport_protobuf_c/resource/msg__rosidl_typesupport_protobuf_c.hpp.em b/rosidl_typesupport_protobuf_c/resource/msg__rosidl_typesupport_protobuf_c.hpp.em index 5bc5342..58e5b33 100644 --- a/rosidl_typesupport_protobuf_c/resource/msg__rosidl_typesupport_protobuf_c.hpp.em +++ b/rosidl_typesupport_protobuf_c/resource/msg__rosidl_typesupport_protobuf_c.hpp.em @@ -30,14 +30,14 @@ header_files = [ "rosidl_typesupport_cpp/message_type_support.hpp", ros_message_header_c(package_name, interface_path), ros_message_header(package_name, interface_path), - visibility_control_header(package_name), + visibility_control_header(package_name, 'rosidl_typesupport_protobuf_c'), "rosidl_typesupport_interface/macros.h", protobuf_message_header(package_name, interface_path) ] -ros_type_ns = ros_type_namespace(package_name, interface_path) +ros_type_ns = ros_type_namespace(package_name, interface_path, '__') ros_type_name = ros_type_name(message) -ros_type = ros_type(package_name, interface_path, message) +ros_type = ros_type(package_name, interface_path, message, '__') proto_type = protobuf_type(package_name, interface_path, message) }@ diff --git a/rosidl_typesupport_protobuf_c/resource/msg__type_support.cpp.em b/rosidl_typesupport_protobuf_c/resource/msg__type_support.cpp.em index 93f6d84..a36cafa 100644 --- a/rosidl_typesupport_protobuf_c/resource/msg__type_support.cpp.em +++ b/rosidl_typesupport_protobuf_c/resource/msg__type_support.cpp.em @@ -24,9 +24,9 @@ from rosidl_cmake import convert_camel_case_to_lower_case_underscore from rosidl_parser.definition import * from rosidl_typesupport_protobuf import * -ros_type_ns = ros_type_namespace(package_name, interface_path) +ros_type_ns = ros_type_namespace(package_name, interface_path, '__') ros_type_name = ros_type_name(message) -ros_type = ros_type(package_name, interface_path, message) +ros_type = ros_type(package_name, interface_path, message, '__') proto_type = protobuf_type(package_name, interface_path, message) system_header_files = [ @@ -36,7 +36,7 @@ system_header_files = [ header_files = [ 'rosidl_typesupport_cpp/message_type_support.hpp', - visibility_control_header(package_name), + visibility_control_header(package_name, 'rosidl_typesupport_protobuf_c'), 'rosidl_typesupport_protobuf_c/identifier.hpp', 'rosidl_typesupport_protobuf_c/to_ros_c_string.hpp', 'rosidl_typesupport_protobuf_c/wstring_conversion.hpp', diff --git a/rosidl_typesupport_protobuf_c/resource/srv__type_support.cpp.em b/rosidl_typesupport_protobuf_c/resource/srv__type_support.cpp.em index 9e7e50a..18f2ff8 100644 --- a/rosidl_typesupport_protobuf_c/resource/srv__type_support.cpp.em +++ b/rosidl_typesupport_protobuf_c/resource/srv__type_support.cpp.em @@ -31,8 +31,8 @@ header_files = [ ] service_name = ros_service_name(service) -service_namespace = ros_service_namespace(package_name, interface_path) -service_type = ros_service_type(package_name, interface_path, service) +service_namespace = ros_service_namespace(package_name, interface_path, '__') +service_type = ros_service_type(package_name, interface_path, service, '__') }@ @{ diff --git a/rosidl_typesupport_protobuf_c/resource/tmpl_forward_declarations.em b/rosidl_typesupport_protobuf_c/resource/tmpl_forward_declarations.em index 16880f8..72f9f25 100644 --- a/rosidl_typesupport_protobuf_c/resource/tmpl_forward_declarations.em +++ b/rosidl_typesupport_protobuf_c/resource/tmpl_forward_declarations.em @@ -32,11 +32,11 @@ def isNamespacedArrayType(type_): def isTypeAlreadyDeclared(type_, fw_declared_types): from rosidl_typesupport_protobuf import ros_type_from_namespaced_type - return ros_type_from_namespaced_type(type_) in fw_declared_types + return ros_type_from_namespaced_type(type_, '__') in fw_declared_types def registerDeclaredType(type_, fw_declared_types): from rosidl_typesupport_protobuf import ros_type_from_namespaced_type - fw_declared_types.add(ros_type_from_namespaced_type(type_)) + fw_declared_types.add(ros_type_from_namespaced_type(type_, '__')) types_to_declare = list() for member in message.structure.members: diff --git a/rosidl_typesupport_protobuf_cpp/resource/idl__type_support.cpp.em b/rosidl_typesupport_protobuf_cpp/resource/idl__type_support.cpp.em index f1f18d3..82a01de 100644 --- a/rosidl_typesupport_protobuf_cpp/resource/idl__type_support.cpp.em +++ b/rosidl_typesupport_protobuf_cpp/resource/idl__type_support.cpp.em @@ -39,7 +39,7 @@ forward_declared_types = set() system_header_files = [] header_files = [ - typesupport_header(package_name, interface_path), + typesupport_header(package_name, interface_path, 'rosidl_typesupport_protobuf_cpp'), ros_message_header(package_name, interface_path) ] }@ diff --git a/rosidl_typesupport_protobuf_cpp/resource/idl__typeadapter_protobuf_cpp.hpp.em b/rosidl_typesupport_protobuf_cpp/resource/idl__typeadapter_protobuf_cpp.hpp.em index 6140761..55ceec9 100644 --- a/rosidl_typesupport_protobuf_cpp/resource/idl__typeadapter_protobuf_cpp.hpp.em +++ b/rosidl_typesupport_protobuf_cpp/resource/idl__typeadapter_protobuf_cpp.hpp.em @@ -34,7 +34,7 @@ header_files = [ ros_message_header(package_name, interface_path), adapter_visibility_control_header(package_name), typesupport_message_header(package_name, interface_path), - visibility_control_header(package_name), + visibility_control_header(package_name, 'rosidl_typesupport_protobuf_cpp'), 'rosidl_typesupport_protobuf/rosidl_generator_c_pkg_adapter.hpp', 'rosidl_typesupport_interface/macros.h', protobuf_message_header(package_name, interface_path) @@ -55,9 +55,9 @@ TEMPLATE( @[for message in content.get_elements_of_type(Message)]@ @{ -ros_type_ns = ros_type_namespace(package_name, interface_path) +ros_type_ns = ros_type_namespace(package_name, interface_path, '::') ros_type_name = ros_type_name(message) -ros_type = ros_type(package_name, interface_path, message) +ros_type = ros_type(package_name, interface_path, message, '::') proto_type = protobuf_type(package_name, interface_path, message) }@ diff --git a/rosidl_typesupport_protobuf_cpp/resource/msg__rosidl_typesupport_protobuf_cpp.hpp.em b/rosidl_typesupport_protobuf_cpp/resource/msg__rosidl_typesupport_protobuf_cpp.hpp.em index c707f80..4638aaf 100644 --- a/rosidl_typesupport_protobuf_cpp/resource/msg__rosidl_typesupport_protobuf_cpp.hpp.em +++ b/rosidl_typesupport_protobuf_cpp/resource/msg__rosidl_typesupport_protobuf_cpp.hpp.em @@ -28,15 +28,15 @@ system_header_files = [ header_files = [ ros_message_header(package_name, interface_path), - visibility_control_header(package_name), + visibility_control_header(package_name, 'rosidl_typesupport_protobuf_cpp'), 'rosidl_typesupport_protobuf/rosidl_generator_c_pkg_adapter.hpp', 'rosidl_typesupport_interface/macros.h', protobuf_message_header(package_name, interface_path) ] -ros_type_ns = ros_type_namespace(package_name, interface_path) +ros_type_ns = ros_type_namespace(package_name, interface_path, '::') ros_type_name = ros_type_name(message) -ros_type = ros_type(package_name, interface_path, message) +ros_type = ros_type(package_name, interface_path, message, '::') proto_type = protobuf_type(package_name, interface_path, message) }@ diff --git a/rosidl_typesupport_protobuf_cpp/resource/msg__type_support.cpp.em b/rosidl_typesupport_protobuf_cpp/resource/msg__type_support.cpp.em index cca61fa..6ea1b0d 100644 --- a/rosidl_typesupport_protobuf_cpp/resource/msg__type_support.cpp.em +++ b/rosidl_typesupport_protobuf_cpp/resource/msg__type_support.cpp.em @@ -23,7 +23,7 @@ import rosidl_parser.parser as rosidl from rosidl_parser.definition import * from rosidl_typesupport_protobuf import * -ros_type_ns = ros_type_namespace(package_name, interface_path) +ros_type_ns = ros_type_namespace(package_name, interface_path, '::') ros_type_name = ros_type_name(message) ros_type = ros_type(package_name, interface_path, message) proto_type = protobuf_type(package_name, interface_path, message) @@ -40,7 +40,7 @@ header_files = [ 'rosidl_typesupport_protobuf/message_type_support.hpp', 'rosidl_typesupport_protobuf/message_type_support_decl.hpp', 'rosidl_typesupport_protobuf/proto_descriptor_helper.hpp', - visibility_control_header(package_name), + (package_name, 'rosidl_typesupport_protobuf_c'), protobuf_message_header(package_name, interface_path) ] }@ diff --git a/rosidl_typesupport_protobuf_cpp/resource/srv__type_support.cpp.em b/rosidl_typesupport_protobuf_cpp/resource/srv__type_support.cpp.em index e555c0b..3468ade 100644 --- a/rosidl_typesupport_protobuf_cpp/resource/srv__type_support.cpp.em +++ b/rosidl_typesupport_protobuf_cpp/resource/srv__type_support.cpp.em @@ -30,8 +30,8 @@ header_files = [ ] service_name = ros_service_name(service) -service_namespace = ros_service_namespace(package_name, interface_path) -service_type = ros_service_type(package_name, interface_path, service) +service_namespace = ros_service_namespace(package_name, interface_path, '::') +service_type = ros_service_type(package_name, interface_path, service, '::') }@ @{ diff --git a/rosidl_typesupport_protobuf_cpp/resource/tmpl_forward_declarations.em b/rosidl_typesupport_protobuf_cpp/resource/tmpl_forward_declarations.em index 3fe7784..0456f54 100644 --- a/rosidl_typesupport_protobuf_cpp/resource/tmpl_forward_declarations.em +++ b/rosidl_typesupport_protobuf_cpp/resource/tmpl_forward_declarations.em @@ -32,11 +32,11 @@ def isNamespacedArrayType(type_): def isTypeAlreadyDeclared(type_, fw_declared_types): from rosidl_typesupport_protobuf import ros_type_from_namespaced_type - return ros_type_from_namespaced_type(type_) in fw_declared_types + return ros_type_from_namespaced_type(type_, '::') in fw_declared_types def registerDeclaredType(type_, fw_declared_types): from rosidl_typesupport_protobuf import ros_type_from_namespaced_type - fw_declared_types.add(ros_type_from_namespaced_type(type_)) + fw_declared_types.add(ros_type_from_namespaced_type(type_, '::')) types_to_declare = list() for member in message.structure.members: