Skip to content
This repository was archived by the owner on Dec 9, 2021. It is now read-only.

Commit

Permalink
change generators to IDL-based pipeline (#11)
Browse files Browse the repository at this point in the history
* update includes and type mapping

* update includes and type mapping

* remove service check for feedback suffix

* Update python, cmake, and msg resource files

* Messages working now

* Update service EmPy files

* cleanup

* [wip] typesupport for opensplice c refactor

* Update typsupport_opensplice_cpp script to accept output path for converted IDL files

* Add function for converting from IDL to OpenSplice compatible IDL

* Minor fixups in cpp typesupport

* Update c typesupport message template

* Update C typesupport EmPy files

* Fixes to C++ typesupport

* Update C typesupport service templates

* Update C++ typesupport service templates

* Offload conversion stuff to rosidl_dds

* Rename generated external files in C ts

* Refactor rosidl_generator_dds_idl extension

* Fix C typesupport

* Fix C++ typesupport (messages compiling now!)

* Fixes post-rebase

* Fix template bug

* More fixes to C++ templates

* Fixes to templates (services compiling now)

* Pass in additional service template wrappers to rosidl_generator_dds_idl

* More fixes to templates

Moved header guards to top-level files.
Prepend type names to static variables.

* Add missing conversion function implementations and remove debug prints

* Call msg template from inside srv template

* Call msg template from inside srv template for C type support

* Fix lint

* add missing action symbols

* Fix lint

* add missing C action symbols

* Fix typo

* fix missing C service request/response symbols

* Replace defintions in C++ service header template with equivalent expansion of message templates

* match renamed action types

* remove commented stuff

* deterministic order

* readd explicit dependency on absolute paths of idl files

* include non-nested namespaced types, fix forward declaration

* strip action suffix

* remove dead block of code

* remove duplicate variable

* simplify logic

* proper syntax

* fix target dependency

* simplify diff

* remove unused/invalid operator
  • Loading branch information
dirk-thomas authored Mar 12, 2019
1 parent 6aed9f6 commit 2fea5d7
Show file tree
Hide file tree
Showing 23 changed files with 1,222 additions and 1,002 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,11 @@ def main(argv=sys.argv[1:]):
help='The location of the file containing the generator arguments')
args = parser.parse_args(argv)

generator_args = read_generator_arguments(args.generator_arguments_file)

try:
rc = generate_typesupport_opensplice_c(generator_args)
return generate_typesupport_opensplice_c(args.generator_arguments_file)
except UnknownMessageType as e:
print(str(e), file=sys.stderr)
return 1
if rc:
return rc
return 0


if __name__ == '__main__':
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,115 +15,56 @@
set(_target_suffix "__rosidl_typesupport_opensplice_c")

set(_output_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_opensplice_c/${PROJECT_NAME}")

set(_dds_idl_files "")
set(_dds_idl_base_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_generator_dds_idl")
foreach(_idl_file ${rosidl_generate_interfaces_IDL_FILES})
get_filename_component(_extension "${_idl_file}" EXT)
get_filename_component(_name "${_idl_file}" NAME_WE)
get_filename_component(_parent_folder "${_idl_file}" DIRECTORY)
get_filename_component(_parent_folder "${_parent_folder}" NAME)
if(_extension STREQUAL ".msg")
list(APPEND _dds_idl_files
"${_dds_idl_base_path}/${PROJECT_NAME}/${_parent_folder}/dds_opensplice/${_name}_.idl")
elseif(_extension STREQUAL ".srv")
list(APPEND _dds_idl_files
"${_dds_idl_base_path}/${PROJECT_NAME}/${_parent_folder}/dds_opensplice/Sample_${_name}_Request_.idl")
list(APPEND _dds_idl_files
"${_dds_idl_base_path}/${PROJECT_NAME}/${_parent_folder}/dds_opensplice/Sample_${_name}_Response_.idl")
endif()
endforeach()

set(_dds_idl_files "")
set(_generated_files "")
set(_generated_external_files "")
set(_dds_output_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_opensplice_cpp/${PROJECT_NAME}")
foreach(_idl_file ${rosidl_generate_interfaces_IDL_FILES})
get_filename_component(_parent_folder "${_idl_file}" DIRECTORY)
foreach(_abs_idl_file ${rosidl_generate_interfaces_ABS_IDL_FILES})
get_filename_component(_parent_folder "${_abs_idl_file}" DIRECTORY)
get_filename_component(_parent_folder "${_parent_folder}" NAME)
get_filename_component(_extension "${_idl_file}" EXT)
get_filename_component(_msg_name "${_idl_file}" NAME_WE)
string_camel_case_to_lower_case_underscore("${_msg_name}" _header_name)
if(_extension STREQUAL ".msg")
set(_allowed_parent_folders "msg" "srv" "action")
if(NOT _parent_folder IN_LIST _allowed_parent_folders)
message(FATAL_ERROR "Interface file with unknown parent folder: ${_idl_file}")
endif()
list(APPEND _generated_external_files
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_msg_name}_.h"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_msg_name}_.cpp"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_msg_name}_Dcps.h"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_msg_name}_Dcps.cpp"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_msg_name}_Dcps_impl.h"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_msg_name}_Dcps_impl.cpp"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_msg_name}_SplDcps.h"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_msg_name}_SplDcps.cpp"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/ccpp_${_msg_name}_.h")
list(APPEND _generated_files
"${_output_path}/${_parent_folder}/${_header_name}__rosidl_typesupport_opensplice_c.h"
"${_output_path}/${_parent_folder}/dds_opensplice_c/${_header_name}__type_support_c.cpp")
elseif(_extension STREQUAL ".srv")
set(_allowed_parent_folders "srv" "action")
if(NOT _parent_folder IN_LIST _allowed_parent_folders)
message(FATAL_ERROR "Interface file with unknown parent folder: ${_idl_file}")
endif()
list(APPEND _generated_files "${_output_path}/${_parent_folder}/${_header_name}__rosidl_typesupport_opensplice_c.h")
list(APPEND _generated_files "${_output_path}/${_parent_folder}/dds_opensplice_c/${_header_name}__type_support_c.cpp")

foreach(_suffix "_Request" "_Response")
list(APPEND _generated_external_files
"${_dds_output_path}/${_parent_folder}/dds_opensplice/Sample_${_msg_name}${_suffix}_.h"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/Sample_${_msg_name}${_suffix}_.cpp"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/Sample_${_msg_name}${_suffix}_Dcps.h"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/Sample_${_msg_name}${_suffix}_Dcps.cpp"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/Sample_${_msg_name}${_suffix}_Dcps_impl.h"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/Sample_${_msg_name}${_suffix}_Dcps_impl.cpp"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/Sample_${_msg_name}${_suffix}_SplDcps.h"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/Sample_${_msg_name}${_suffix}_SplDcps.cpp"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/ccpp_Sample_${_msg_name}${_suffix}_.h")
endforeach()
else()
message(FATAL_ERROR "Interface file with unknown extension: ${_idl_file}")
endif()
get_filename_component(_idl_name "${_abs_idl_file}" NAME_WE)
string_camel_case_to_lower_case_underscore("${_idl_name}" _header_name)
list(APPEND _dds_idl_files
"${_dds_idl_base_path}/${PROJECT_NAME}/${_parent_folder}/dds_opensplice/${_idl_name}_.idl")
list(APPEND _generated_files "${_output_path}/${_parent_folder}/${_header_name}__rosidl_typesupport_opensplice_c.h")
list(APPEND _generated_files "${_output_path}/${_parent_folder}/dds_opensplice_c/${_header_name}__type_support_c.cpp")
list(APPEND _generated_external_files
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_idl_name}_.h"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_idl_name}_.cpp"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_idl_name}_Dcps.h"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_idl_name}_Dcps.cpp"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_idl_name}_Dcps_impl.h"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_idl_name}_Dcps_impl.cpp"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_idl_name}_SplDcps.h"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_idl_name}_SplDcps.cpp"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/ccpp_${_idl_name}_.h")
endforeach()

set(_dependency_files "")
set(_dependencies "")
foreach(_pkg_name ${rosidl_generate_interfaces_DEPENDENCY_PACKAGE_NAMES})
foreach(_idl_file ${${_pkg_name}_INTERFACE_FILES})
get_filename_component(_extension "${_idl_file}" EXT)
get_filename_component(_parent_folder "${_idl_file}" DIRECTORY)
get_filename_component(_parent_folder "${_parent_folder}" NAME)
if(_extension STREQUAL ".msg")
get_filename_component(_name "${_idl_file}" NAME_WE)
set(_abs_idl_file "${${_pkg_name}_DIR}/../${_parent_folder}/dds_opensplice/${_name}_.idl")
normalize_path(_abs_idl_file "${_abs_idl_file}")
list(APPEND _dependency_files "${_abs_idl_file}")
set(_abs_idl_file "${${_pkg_name}_DIR}/../${_idl_file}")
normalize_path(_abs_idl_file "${_abs_idl_file}")
list(APPEND _dependencies "${_pkg_name}:${_abs_idl_file}")
elseif(_extension STREQUAL ".srv")
get_filename_component(_name "${_idl_file}" NAME_WE)

set(_abs_idl_file "${${_pkg_name}_DIR}/../${_parent_folder}/dds_opensplice/Sample_${_name}_Request_.idl")
normalize_path(_abs_idl_file "${_abs_idl_file}")
list(APPEND _dependency_files "${_abs_idl_file}")
list(APPEND _dependencies "${_pkg_name}:${_abs_idl_file}")

set(_abs_idl_file "${${_pkg_name}_DIR}/../${_parent_folder}/dds_opensplice/Sample_${_name}_Response_.idl")
normalize_path(_abs_idl_file "${_abs_idl_file}")
list(APPEND _dependency_files "${_abs_idl_file}")
list(APPEND _dependencies "${_pkg_name}:${_abs_idl_file}")
endif()
foreach(_idl_file ${${_pkg_name}_IDL_FILES})
# ${{_pkg_name}_DIR} is absolute path ending in 'share/<pkg_name>/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()

set(target_dependencies
"${rosidl_typesupport_opensplice_c_BIN}"
${rosidl_typesupport_opensplice_c_GENERATOR_FILES}
"${rosidl_typesupport_opensplice_c_TEMPLATE_DIR}/idl__rosidl_typesupport_opensplice_c.h.em"
"${rosidl_typesupport_opensplice_c_TEMPLATE_DIR}/idl__dds_opensplice__type_support.c.em"
"${rosidl_typesupport_opensplice_c_TEMPLATE_DIR}/msg__rosidl_typesupport_opensplice_c.h.em"
"${rosidl_typesupport_opensplice_c_TEMPLATE_DIR}/msg__type_support_c.cpp.em"
"${rosidl_typesupport_opensplice_c_TEMPLATE_DIR}/srv__rosidl_typesupport_opensplice_c.h.em"
"${rosidl_typesupport_opensplice_c_TEMPLATE_DIR}/srv__type_support_c.cpp.em"
${rosidl_generate_interfaces_ABS_IDL_FILES}
${_dependency_files})
foreach(dep ${target_dependencies})
if(NOT EXISTS "${dep}")
Expand All @@ -139,23 +80,20 @@ set(generator_arguments_file "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_ope
rosidl_write_generator_arguments(
"${generator_arguments_file}"
PACKAGE_NAME "${PROJECT_NAME}"
ROS_INTERFACE_FILES "${rosidl_generate_interfaces_IDL_FILES}"
IDL_TUPLES "${rosidl_generate_interfaces_IDL_TUPLES}"
ROS_INTERFACE_DEPENDENCIES "${_dependencies}"
OUTPUT_DIR "${_output_path}"
TEMPLATE_DIR "${rosidl_typesupport_opensplice_c_TEMPLATE_DIR}"
TARGET_DEPENDENCIES ${target_dependencies}
ADDITIONAL_FILES
${_dds_idl_files}
ADDITIONAL_FILES ${_dds_idl_files}
)

add_custom_command(
OUTPUT
${_generated_files}
COMMAND ${PYTHON_EXECUTABLE} ${rosidl_typesupport_opensplice_c_BIN}
--generator-arguments-file "${generator_arguments_file}"
DEPENDS
${target_dependencies}
${_dds_idl_files}
DEPENDS ${target_dependencies} ${_dds_idl_files}
COMMENT "Generating C type support for PrismTech OpenSplice"
VERBATIM
)
Expand Down Expand Up @@ -185,7 +123,8 @@ endif()

link_directories(${OpenSplice_LIBRARY_DIRS})
add_library(${rosidl_generate_interfaces_TARGET}${_target_suffix} SHARED
${_generated_files})
${_generated_files}
${_generated_external_files})
if(rosidl_generate_interfaces_LIBRARY_NAME)
set_target_properties(${rosidl_generate_interfaces_TARGET}${_target_suffix}
PROPERTIES OUTPUT_NAME "${rosidl_generate_interfaces_LIBRARY_NAME}${_target_suffix}")
Expand Down Expand Up @@ -230,16 +169,10 @@ ament_target_dependencies(
"rosidl_typesupport_opensplice_c")
foreach(_pkg_name ${rosidl_generate_interfaces_DEPENDENCY_PACKAGE_NAMES})
set(_msg_include_dir "${${_pkg_name}_DIR}/../../../include/${_pkg_name}/msg/dds_opensplice_c")
set(_srv_include_dir "${${_pkg_name}_DIR}/../../../include/${_pkg_name}/srv/dds_opensplice_c")
set(_action_include_dir "${${_pkg_name}_DIR}/../../../include/${_pkg_name}/action/dds_opensplice_c")
normalize_path(_msg_include_dir "${_msg_include_dir}")
normalize_path(_srv_include_dir "${_srv_include_dir}")
normalize_path(_action_include_dir "${_action_include_dir}")
target_include_directories(${rosidl_generate_interfaces_TARGET}${_target_suffix}
PUBLIC
"${_msg_include_dir}"
"${_srv_include_dir}"
"${_action_include_dir}"
)
ament_target_dependencies(
${rosidl_generate_interfaces_TARGET}${_target_suffix}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
// generated from rosidl_typesupport_opensplice_c/resource/idl__dds_opensplice__type_support.c.em
// generated code does not contain a copyright notice

#include <cassert>
#include <cstring>
#include <iostream>
#include <limits>
#include <sstream>

#include <CdrTypeSupport.h>
#include <u_instanceHandle.h>

@{
#######################################################################
# EmPy template for generating <idl>__rosidl_typesupport.c files
#
# Context:
# - package_name (string)
# - content (rosidl_parser.definition.IdlContent result of parsing IDL file)
# - interface_path (Path relative to the directory named after the package)
#######################################################################

include_directives = set()

#######################################################################
# Handle message
#######################################################################
from rosidl_parser.definition import Message
for message in content.get_elements_of_type(Message):
TEMPLATE(
'msg__type_support_c.cpp.em',
package_name=package_name, interface_path=interface_path, message=message,
include_directives=include_directives)

#######################################################################
# Handle service
#######################################################################
from rosidl_parser.definition import Service
for service in content.get_elements_of_type(Service):
TEMPLATE(
'srv__type_support_c.cpp.em',
package_name=package_name, interface_path=interface_path, service=service,
include_directives=include_directives)

#######################################################################
# Handle action
#######################################################################
from rosidl_parser.definition import Action
for action in content.get_elements_of_type(Action):
TEMPLATE(
'msg__type_support_c.cpp.em',
package_name=package_name, interface_path=interface_path, message=action.goal,
include_directives=include_directives)
TEMPLATE(
'msg__type_support_c.cpp.em',
package_name=package_name, interface_path=interface_path, message=action.result,
include_directives=include_directives)
TEMPLATE(
'msg__type_support_c.cpp.em',
package_name=package_name, interface_path=interface_path, message=action.feedback,
include_directives=include_directives)
TEMPLATE(
'srv__type_support_c.cpp.em',
package_name=package_name, interface_path=interface_path, service=action.send_goal_service,
include_directives=include_directives)
TEMPLATE(
'srv__type_support_c.cpp.em',
package_name=package_name, interface_path=interface_path, service=action.get_result_service,
include_directives=include_directives)
TEMPLATE(
'msg__type_support_c.cpp.em',
package_name=package_name, interface_path=interface_path, message=action.feedback_message,
include_directives=include_directives)
}@
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
// generated from rosidl_typesupport_opensplice_c/resource/idl__rosidl_typesupport_c.h.em
// generated code does not contain a copyright notice
@{
from rosidl_cmake import convert_camel_case_to_lower_case_underscore
include_parts = [package_name] + list(interface_path.parents[0].parts) + \
[convert_camel_case_to_lower_case_underscore(interface_path.stem)]
header_guard_variable = '__'.join([x.upper() for x in include_parts]) + \
'__ROSIDL_TYPESUPPORT_OPENSPLICE_C_H_'
}@
#ifndef @(header_guard_variable)
#define @(header_guard_variable)
@{
#######################################################################
# EmPy template for generating <idl>__rosidl_typesupport_c.h files
#
# Context:
# - package_name (string)
# - content (rosidl_parser.definition.IdlContent result of parsing IDL file)
# - interface_path (Path relative to the directory named after the package)
#######################################################################

include_directives = set()

#######################################################################
# Handle message
#######################################################################
from rosidl_parser.definition import Message
for message in content.get_elements_of_type(Message):
TEMPLATE(
'msg__rosidl_typesupport_opensplice_c.h.em',
package_name=package_name, interface_path=interface_path, message=message,
include_directives=include_directives)

#######################################################################
# Handle service
#######################################################################
from rosidl_parser.definition import Service
for service in content.get_elements_of_type(Service):
TEMPLATE(
'srv__rosidl_typesupport_opensplice_c.h.em',
package_name=package_name, interface_path=interface_path, service=service,
include_directives=include_directives)

#######################################################################
# Handle action
#######################################################################
from rosidl_parser.definition import Action
for action in content.get_elements_of_type(Action):
TEMPLATE(
'msg__rosidl_typesupport_opensplice_c.h.em',
package_name=package_name, interface_path=interface_path, message=action.goal,
include_directives=include_directives)
TEMPLATE(
'msg__rosidl_typesupport_opensplice_c.h.em',
package_name=package_name, interface_path=interface_path, message=action.result,
include_directives=include_directives)
TEMPLATE(
'msg__rosidl_typesupport_opensplice_c.h.em',
package_name=package_name, interface_path=interface_path, message=action.feedback,
include_directives=include_directives)
TEMPLATE(
'srv__rosidl_typesupport_opensplice_c.h.em',
package_name=package_name, interface_path=interface_path, service=action.send_goal_service,
include_directives=include_directives)
TEMPLATE(
'srv__rosidl_typesupport_opensplice_c.h.em',
package_name=package_name, interface_path=interface_path, service=action.get_result_service,
include_directives=include_directives)
TEMPLATE(
'msg__rosidl_typesupport_opensplice_c.h.em',
package_name=package_name, interface_path=interface_path, message=action.feedback_message,
include_directives=include_directives)
}@
#endif // @(header_guard_variable)
Loading

0 comments on commit 2fea5d7

Please sign in to comment.