From 534167d557f5d1b83e0df4122b26d2a7d976e371 Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Tue, 9 Feb 2021 14:47:30 -0300 Subject: [PATCH] Expose Python code generation via rosidl generate CLI Signed-off-by: Michel Hidalgo --- rosidl_generator_py/bin/rosidl_generator_py | 4 +- rosidl_generator_py/package.xml | 1 + .../rosidl_generator_py/cli.py | 71 +++++++++++++++++++ .../rosidl_generator_py/generate_py_impl.py | 5 +- rosidl_generator_py/setup.cfg | 3 + 5 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 rosidl_generator_py/rosidl_generator_py/cli.py create mode 100644 rosidl_generator_py/setup.cfg diff --git a/rosidl_generator_py/bin/rosidl_generator_py b/rosidl_generator_py/bin/rosidl_generator_py index dc010512..23a67b6d 100755 --- a/rosidl_generator_py/bin/rosidl_generator_py +++ b/rosidl_generator_py/bin/rosidl_generator_py @@ -33,8 +33,8 @@ def main(argv=sys.argv[1:]): help='All the available typesupport implementations') args = parser.parse_args(argv) - return generate_py(args.generator_arguments_file, args.typesupport_impls.split(';')) - + generate_py(args.generator_arguments_file, args.typesupport_impls.split(';')) + return 0 if __name__ == '__main__': sys.exit(main()) diff --git a/rosidl_generator_py/package.xml b/rosidl_generator_py/package.xml index 84c6c73b..acc6284b 100644 --- a/rosidl_generator_py/package.xml +++ b/rosidl_generator_py/package.xml @@ -26,6 +26,7 @@ rosidl_typesupport_interface python3-numpy + rosidl_cli rosidl_generator_c rosidl_parser rosidl_runtime_c diff --git a/rosidl_generator_py/rosidl_generator_py/cli.py b/rosidl_generator_py/rosidl_generator_py/cli.py new file mode 100644 index 00000000..bec5483d --- /dev/null +++ b/rosidl_generator_py/rosidl_generator_py/cli.py @@ -0,0 +1,71 @@ +# 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 ament_index_python import get_resources + +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_py import generate_py + + +class GeneratePython(GenerateCommandExtension): + + def generate( + self, + package_name, + interface_files, + include_paths, + output_path + ): + package_share_path = \ + pathlib.Path(get_package_share_directory('rosidl_generator_py')) + 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 + typesupport_implementations = ['rosidl_typesupport_c'] + typesupport_implementations.extend( + get_resources('rosidl_typesupport_c') + ) + 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_py( + path_to_arguments_file, + typesupport_implementations) diff --git a/rosidl_generator_py/rosidl_generator_py/generate_py_impl.py b/rosidl_generator_py/rosidl_generator_py/generate_py_impl.py index 809a5cfa..dfa2d94c 100644 --- a/rosidl_generator_py/rosidl_generator_py/generate_py_impl.py +++ b/rosidl_generator_py/rosidl_generator_py/generate_py_impl.py @@ -58,7 +58,7 @@ def generate_py(generator_arguments_file, typesupport_impls): '_idl.py.em': '_%s.py', '_idl_support.c.em': '_%s_s.c', } - generate_files(generator_arguments_file, mapping) + generated_files = generate_files(generator_arguments_file, mapping) args = read_generator_arguments(generator_arguments_file) package_name = args['package_name'] @@ -157,8 +157,9 @@ def print_warning_if_reserved_keyword(member_name, interface_type, interface_nam expand_template( template_file, data, generated_file, minimum_timestamp=latest_target_timestamp) + generated_files.append(generated_file) - return 0 + return generated_files def value_to_py(type_, value, array_as_tuple=False): diff --git a/rosidl_generator_py/setup.cfg b/rosidl_generator_py/setup.cfg new file mode 100644 index 00000000..b8fd0181 --- /dev/null +++ b/rosidl_generator_py/setup.cfg @@ -0,0 +1,3 @@ +[options.entry_points] +rosidl_cli.command.generate.type_extensions = + py = rosidl_generator_py.cli:GeneratePython