From 9f58f463af5e9d54e634c7a615cc2b97092b17a4 Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Tue, 9 Feb 2021 13:01:15 -0300 Subject: [PATCH 1/2] Expose C++ code generation via rosidl generate CLI. Signed-off-by: Michel Hidalgo --- rosidl_generator_cpp/bin/rosidl_generator_cpp | 4 +- rosidl_generator_cpp/package.xml | 1 + .../rosidl_generator_cpp/__init__.py | 2 +- .../rosidl_generator_cpp/cli.py | 63 +++++++++++++++++++ rosidl_generator_cpp/setup.cfg | 3 + 5 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 rosidl_generator_cpp/rosidl_generator_cpp/cli.py create mode 100644 rosidl_generator_cpp/setup.cfg diff --git a/rosidl_generator_cpp/bin/rosidl_generator_cpp b/rosidl_generator_cpp/bin/rosidl_generator_cpp index 1f1ecbe75..a63e1b5b7 100755 --- a/rosidl_generator_cpp/bin/rosidl_generator_cpp +++ b/rosidl_generator_cpp/bin/rosidl_generator_cpp @@ -31,9 +31,7 @@ def main(argv=sys.argv[1:]): help='The location of the file containing the generator arguments') args = parser.parse_args(argv) - return generate_cpp( - args.generator_arguments_file, - ) + generate_cpp(args.generator_arguments_file) if __name__ == '__main__': diff --git a/rosidl_generator_cpp/package.xml b/rosidl_generator_cpp/package.xml index 04f39fcc6..6e077a2ab 100644 --- a/rosidl_generator_cpp/package.xml +++ b/rosidl_generator_cpp/package.xml @@ -17,6 +17,7 @@ rosidl_generator_c + rosidl_cli rosidl_parser ament_cmake_gtest diff --git a/rosidl_generator_cpp/rosidl_generator_cpp/__init__.py b/rosidl_generator_cpp/rosidl_generator_cpp/__init__.py index 39271a301..9fbbf62f0 100644 --- a/rosidl_generator_cpp/rosidl_generator_cpp/__init__.py +++ b/rosidl_generator_cpp/rosidl_generator_cpp/__init__.py @@ -35,7 +35,7 @@ def generate_cpp(generator_arguments_file): 'idl__struct.hpp.em': 'detail/%s__struct.hpp', 'idl__traits.hpp.em': 'detail/%s__traits.hpp', } - generate_files( + return generate_files( generator_arguments_file, mapping, post_process_callback=prefix_with_bom_if_necessary) diff --git a/rosidl_generator_cpp/rosidl_generator_cpp/cli.py b/rosidl_generator_cpp/rosidl_generator_cpp/cli.py new file mode 100644 index 000000000..0d3044f7e --- /dev/null +++ b/rosidl_generator_cpp/rosidl_generator_cpp/cli.py @@ -0,0 +1,63 @@ +# Copyright 2021 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. + +import pathlib + +from ament_index_python import get_package_share_directory +from rosidl_cli.command.generate.extensions import GenerateCommandExtension +from rosidl_cli.command.helpers import legacy_generator_arguments_file +from rosidl_cli.command.translate.api import translate + +from rosidl_generator_cpp import generate_cpp + + +class GenerateCpp(GenerateCommandExtension): + + def generate( + self, + package_name, + interface_files, + include_paths, + output_path + ): + package_share_path = \ + pathlib.Path(get_package_share_directory('rosidl_generator_cpp')) + templates_path = package_share_path / 'resource' + + # Normalize interface definition format to .idl + idl_interface_files = [] + non_idl_interface_files = [] + for path in interface_files: + if not path.endswith('.idl'): + non_idl_interface_files.append(path) + else: + idl_interface_files.append(path) + if non_idl_interface_files: + idl_interface_files.extend(translate( + package_name=package_name, + interface_files=non_idl_interface_files, + include_paths=include_paths, + output_format='idl', + output_path=output_path / 'tmp', + )) + + # Generate code + with legacy_generator_arguments_file( + package_name=package_name, + interface_files=idl_interface_files, + include_paths=include_paths, + templates_path=templates_path, + output_path=output_path + ) as path_to_arguments_file: + return generate_cpp(path_to_arguments_file) diff --git a/rosidl_generator_cpp/setup.cfg b/rosidl_generator_cpp/setup.cfg new file mode 100644 index 000000000..e710b275d --- /dev/null +++ b/rosidl_generator_cpp/setup.cfg @@ -0,0 +1,3 @@ +[options.entry_points] +rosidl_cli.command.generate.type_extensions = + cpp = rosidl_generator_cpp.cli:GenerateCpp From 9d8bb3089f86ff9b7770124931c2c8e967914717 Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Wed, 10 Mar 2021 10:38:14 -0300 Subject: [PATCH 2/2] Add ament_index_python as dependency Signed-off-by: Michel Hidalgo --- rosidl_generator_cpp/package.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/rosidl_generator_cpp/package.xml b/rosidl_generator_cpp/package.xml index 6e077a2ab..d845d5dc8 100644 --- a/rosidl_generator_cpp/package.xml +++ b/rosidl_generator_cpp/package.xml @@ -17,6 +17,7 @@ rosidl_generator_c + ament_index_python rosidl_cli rosidl_parser