diff --git a/rosidl_typesupport_introspection_c/bin/rosidl_typesupport_introspection_c b/rosidl_typesupport_introspection_c/bin/rosidl_typesupport_introspection_c index 26615a6ee..c9504656a 100755 --- a/rosidl_typesupport_introspection_c/bin/rosidl_typesupport_introspection_c +++ b/rosidl_typesupport_introspection_c/bin/rosidl_typesupport_introspection_c @@ -16,7 +16,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_typesupport_introspection_c/package.xml b/rosidl_typesupport_introspection_c/package.xml index 2a0b5d7d7..2e1cef2da 100644 --- a/rosidl_typesupport_introspection_c/package.xml +++ b/rosidl_typesupport_introspection_c/package.xml @@ -18,6 +18,8 @@ rosidl_runtime_c + ament_index_python + rosidl_cli rosidl_cmake rosidl_parser diff --git a/rosidl_typesupport_introspection_c/rosidl_typesupport_introspection_c/__init__.py b/rosidl_typesupport_introspection_c/rosidl_typesupport_introspection_c/__init__.py index 2e9b5cf70..e47caee3b 100644 --- a/rosidl_typesupport_introspection_c/rosidl_typesupport_introspection_c/__init__.py +++ b/rosidl_typesupport_introspection_c/rosidl_typesupport_introspection_c/__init__.py @@ -21,4 +21,4 @@ def generate_c(generator_arguments_file): 'detail/%s__rosidl_typesupport_introspection_c.h', 'idl__type_support.c.em': 'detail/%s__type_support.c', } - generate_files(generator_arguments_file, mapping) + return generate_files(generator_arguments_file, mapping) diff --git a/rosidl_typesupport_introspection_c/rosidl_typesupport_introspection_c/cli.py b/rosidl_typesupport_introspection_c/rosidl_typesupport_introspection_c/cli.py new file mode 100644 index 000000000..4b5ebc54b --- /dev/null +++ b/rosidl_typesupport_introspection_c/rosidl_typesupport_introspection_c/cli.py @@ -0,0 +1,87 @@ +# 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_typesupport_introspection_c import generate_c + + +class GenerateIntrospectionCTypesupport(GenerateCommandExtension): + + def generate( + self, + package_name, + interface_files, + include_paths, + output_path + ): + generated_files = [] + + package_share_path = pathlib.Path( + get_package_share_directory('rosidl_typesupport_introspection_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 = \ + 'rosidl_typesupport_introspection_c__visibility_control.h.in' + visibility_control_file_template_path = \ + templates_path / visibility_control_file_template_path + visibility_control_file_path = \ + 'rosidl_typesupport_introspection_c__visibility_control.h' + visibility_control_file_path = \ + output_path / 'msg' / visibility_control_file_path + + 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 typesupport 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_typesupport_introspection_c/setup.cfg b/rosidl_typesupport_introspection_c/setup.cfg new file mode 100644 index 000000000..d11becb32 --- /dev/null +++ b/rosidl_typesupport_introspection_c/setup.cfg @@ -0,0 +1,3 @@ +[options.entry_points] +rosidl_cli.command.generate.typesupport_extensions = + introspection_c = rosidl_typesupport_introspection_c.cli:GenerateIntrospectionCTypesupport