diff --git a/rosidl_generator_c/bin/rosidl_generator_c b/rosidl_generator_c/bin/rosidl_generator_c index 20e7d3dc4..1b0def38d 100755 --- a/rosidl_generator_c/bin/rosidl_generator_c +++ b/rosidl_generator_c/bin/rosidl_generator_c @@ -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_c( - args.generator_arguments_file, - ) + generate_c(args.generator_arguments_file) if __name__ == '__main__': diff --git a/rosidl_generator_c/package.xml b/rosidl_generator_c/package.xml index 86a84c842..31d95919e 100644 --- a/rosidl_generator_c/package.xml +++ b/rosidl_generator_c/package.xml @@ -18,6 +18,8 @@ rosidl_typesupport_interface + ament_index_python + rosidl_cli rosidl_parser ament_cmake_gtest diff --git a/rosidl_generator_c/rosidl_generator_c/__init__.py b/rosidl_generator_c/rosidl_generator_c/__init__.py index 9628a15d7..838cc3766 100644 --- a/rosidl_generator_c/rosidl_generator_c/__init__.py +++ b/rosidl_generator_c/rosidl_generator_c/__init__.py @@ -34,7 +34,7 @@ def generate_c(generator_arguments_file): 'idl__struct.h.em': 'detail/%s__struct.h', 'idl__type_support.h.em': 'detail/%s__type_support.h', } - generate_files( + return generate_files( generator_arguments_file, mapping, post_process_callback=prefix_with_bom_if_necessary) diff --git a/rosidl_generator_c/rosidl_generator_c/cli.py b/rosidl_generator_c/rosidl_generator_c/cli.py new file mode 100644 index 000000000..f6c786d7d --- /dev/null +++ b/rosidl_generator_c/rosidl_generator_c/cli.py @@ -0,0 +1,81 @@ +# 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 generate_visibility_control_file +from rosidl_cli.command.helpers import legacy_generator_arguments_file +from rosidl_cli.command.translate.api import translate + +from rosidl_generator_c import generate_c + + +class GenerateC(GenerateCommandExtension): + + def generate( + self, + package_name, + interface_files, + include_paths, + output_path + ): + generated_files = [] + + package_share_path = \ + pathlib.Path(get_package_share_directory('rosidl_generator_c')) + 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 visibility control file + visibility_control_file_template_path = \ + templates_path / 'rosidl_generator_c__visibility_control.h.in' + visibility_control_file_path = \ + output_path / 'msg' / 'rosidl_generator_c__visibility_control.h' + + generate_visibility_control_file( + package_name=package_name, + template_path=visibility_control_file_template_path, + output_path=visibility_control_file_path + ) + generated_files.append(visibility_control_file_path) + + # 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: + generated_files.extend(generate_c(path_to_arguments_file)) + + return generated_files diff --git a/rosidl_generator_c/setup.cfg b/rosidl_generator_c/setup.cfg new file mode 100644 index 000000000..748fe9046 --- /dev/null +++ b/rosidl_generator_c/setup.cfg @@ -0,0 +1,3 @@ +[options.entry_points] +rosidl_cli.command.generate.type_extensions = + c = rosidl_generator_c.cli:GenerateC