Skip to content

Commit 48ce690

Browse files
Маслов Александр АлександровичEsipovPA
authored andcommitted
Using C extention base class for every message
Signed-off-by: Маслов Александр Александрович <aamaslov@sberautotech.ru>
1 parent 4dda0a4 commit 48ce690

File tree

9 files changed

+582
-82
lines changed

9 files changed

+582
-82
lines changed

rosidl_generator_py/cmake/custom_command.cmake

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
# a different CMake subdirectory, and this command is invoked after an
2020
# add_subdirectory() call.
2121
add_custom_command(
22-
OUTPUT ${_generated_extension_files} ${_generated_py_files} ${_generated_c_files}
22+
OUTPUT ${_generated_extension_files} ${_generated_py_files} ${_generated_c_files} ${_generated_c_base_files}
2323
# This assumes that python_cmake_module was found, which is always the case since this is only
2424
# called from rosidl_generator_py_generate_interfaces.cmake
2525
COMMAND Python3::Interpreter ${rosidl_generator_py_BIN}
@@ -39,5 +39,6 @@ else()
3939
${_generated_extension_files}
4040
${_generated_py_files}
4141
${_generated_c_files}
42+
${_generated_c_base_files}
4243
)
4344
endif()

rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces.cmake

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ set(_output_path
4848
set(_generated_extension_files "")
4949
set(_generated_py_files "")
5050
set(_generated_c_files "")
51+
set(_generated_c_base_files "")
5152

5253
foreach(_typesupport_impl ${_typesupport_impls})
5354
set(_generated_extension_${_typesupport_impl}_files "")
@@ -63,6 +64,8 @@ foreach(_abs_idl_file ${rosidl_generate_interfaces_ABS_IDL_FILES})
6364
list(APPEND _generated_c_files
6465
"${_output_path}/${_parent_folder}/_${_module_name}_s.c")
6566
endforeach()
67+
list(APPEND _generated_c_base_files
68+
"${_output_path}/_${PROJECT_NAME}_bases.c")
6669

6770
file(MAKE_DIRECTORY "${_output_path}")
6871
file(WRITE "${_output_path}/__init__.py" "")
@@ -106,9 +109,11 @@ set(target_dependencies
106109
${rosidl_generator_py_GENERATOR_FILES}
107110
"${rosidl_generator_py_TEMPLATE_DIR}/_action_pkg_typesupport_entry_point.c.em"
108111
"${rosidl_generator_py_TEMPLATE_DIR}/_action.py.em"
112+
"${rosidl_generator_py_TEMPLATE_DIR}/_idl_pkg_bases.c.em"
109113
"${rosidl_generator_py_TEMPLATE_DIR}/_idl_pkg_typesupport_entry_point.c.em"
110114
"${rosidl_generator_py_TEMPLATE_DIR}/_idl_support.c.em"
111115
"${rosidl_generator_py_TEMPLATE_DIR}/_idl.py.em"
116+
"${rosidl_generator_py_TEMPLATE_DIR}/_msg_base.c.em"
112117
"${rosidl_generator_py_TEMPLATE_DIR}/_msg_pkg_typesupport_entry_point.c.em"
113118
"${rosidl_generator_py_TEMPLATE_DIR}/_msg_support.c.em"
114119
"${rosidl_generator_py_TEMPLATE_DIR}/_msg.py.em"
@@ -147,7 +152,7 @@ file(WRITE "${_subdir}/CMakeLists.txt" "${_custom_command}")
147152
add_subdirectory("${_subdir}" ${rosidl_generate_interfaces_TARGET}${_target_suffix})
148153
set_property(
149154
SOURCE
150-
${_generated_extension_files} ${_generated_py_files} ${_generated_c_files}
155+
${_generated_extension_files} ${_generated_py_files} ${_generated_c_files} ${_generated_c_base_files}
151156
PROPERTY GENERATED 1)
152157

153158
set(_target_name_lib "${rosidl_generate_interfaces_TARGET}__rosidl_generator_py")
@@ -179,6 +184,29 @@ endif()
179184
rosidl_get_typesupport_target(c_typesupport_target "${rosidl_generate_interfaces_TARGET}" "rosidl_typesupport_c")
180185
target_link_libraries(${_target_name_lib} PRIVATE ${c_typesupport_target})
181186

187+
188+
set(_target_name_bases_lib "${rosidl_generate_interfaces_TARGET}__bases")
189+
add_library(${_target_name_bases_lib} SHARED ${_generated_c_base_files})
190+
add_dependencies(
191+
${_target_name_bases_lib}
192+
${rosidl_generate_interfaces_TARGET}${_target_suffix})
193+
target_link_libraries(${_target_name_bases_lib} ${PythonExtra_LIBRARIES})
194+
target_include_directories(${_target_name_bases_lib} PRIVATE ${PythonExtra_INCLUDE_DIRS})
195+
196+
set_target_properties(${_target_name_bases_lib} PROPERTIES
197+
COMPILE_OPTIONS "${_extension_compile_flags}"
198+
PREFIX ""
199+
LIBRARY_OUTPUT_DIRECTORY${_build_type} ${_output_path}
200+
RUNTIME_OUTPUT_DIRECTORY${_build_type} ${_output_path}
201+
OUTPUT_NAME "_${PROJECT_NAME}_bases${PythonExtra_EXTENSION_SUFFIX}"
202+
SUFFIX "${PythonExtra_EXTENSION_EXTENSION}"
203+
)
204+
if(NOT rosidl_generate_interfaces_SKIP_INSTALL)
205+
install(TARGETS ${_target_name_bases_lib}
206+
DESTINATION "${PYTHON_INSTALL_DIR}/${PROJECT_NAME}")
207+
endif()
208+
209+
182210
foreach(_typesupport_impl ${_typesupport_impls})
183211
find_package(${_typesupport_impl} REQUIRED)
184212
# a typesupport package might not be able to generated a target anymore
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
// generated from rosidl_generator_py/resource/_idl_pkg_bases.c.em
2+
// generated code does not contain a copyright notice
3+
@
4+
@#######################################################################
5+
@# EmPy template for generating _<idl>_bases.c files
6+
@#
7+
@# Context:
8+
@# - package_name (string)
9+
@# - content (IdlContent, list of elements, e.g. Messages or Services)
10+
@#######################################################################
11+
@
12+
@#######################################################################
13+
@# Handle messages
14+
@#######################################################################
15+
@{
16+
from rosidl_parser.definition import Message
17+
from rosidl_pycommon import convert_camel_case_to_lower_case_underscore
18+
19+
include_directives = set()
20+
register_functions = []
21+
22+
}@
23+
@[for message in content.get_elements_of_type(Message)]@
24+
@{
25+
26+
TEMPLATE(
27+
'_msg_base.c.em',
28+
package_name=package_name,
29+
message=message, include_directives=include_directives,
30+
register_functions=register_functions)
31+
}@
32+
@[end for]@
33+
@
34+
@#######################################################################
35+
@# Handle services
36+
@#######################################################################
37+
@{
38+
from rosidl_parser.definition import Service
39+
}@
40+
@[for service in content.get_elements_of_type(Service)]@
41+
@{
42+
43+
TEMPLATE(
44+
'_msg_base.c.em',
45+
package_name=package_name,
46+
message=service.request_message, include_directives=include_directives,
47+
register_functions=register_functions)
48+
}@
49+
50+
@{
51+
TEMPLATE(
52+
'_msg_base.c.em',
53+
package_name=package_name,
54+
message=service.response_message, include_directives=include_directives,
55+
register_functions=register_functions)
56+
}@
57+
58+
@{
59+
TEMPLATE(
60+
'_msg_base.c.em',
61+
package_name=package_name,
62+
message=service.event_message, include_directives=include_directives,
63+
register_functions=register_functions)
64+
}@
65+
@[end for]@
66+
@
67+
@#######################################################################
68+
@# Handle actions
69+
@#######################################################################
70+
@{
71+
from rosidl_parser.definition import Action
72+
}@
73+
@[for action in content.get_elements_of_type(Action)]@
74+
@{
75+
76+
TEMPLATE(
77+
'_msg_base.c.em',
78+
package_name=package_name,
79+
message=action.goal, include_directives=include_directives,
80+
register_functions=register_functions)
81+
}@
82+
83+
@{
84+
TEMPLATE(
85+
'_msg_base.c.em',
86+
package_name=package_name,
87+
message=action.result, include_directives=include_directives,
88+
register_functions=register_functions)
89+
}@
90+
91+
@{
92+
TEMPLATE(
93+
'_msg_base.c.em',
94+
package_name=package_name,
95+
message=action.feedback, include_directives=include_directives,
96+
register_functions=register_functions)
97+
}@
98+
99+
@{
100+
TEMPLATE(
101+
'_msg_base.c.em',
102+
package_name=package_name,
103+
message=action.send_goal_service.request_message,
104+
include_directives=include_directives,
105+
register_functions=register_functions)
106+
}@
107+
108+
@{
109+
TEMPLATE(
110+
'_msg_base.c.em',
111+
package_name=package_name,
112+
message=action.send_goal_service.response_message,
113+
include_directives=include_directives,
114+
register_functions=register_functions)
115+
}@
116+
117+
@{
118+
TEMPLATE(
119+
'_msg_base.c.em',
120+
package_name=package_name,
121+
message=action.send_goal_service.event_message,
122+
include_directives=include_directives,
123+
register_functions=register_functions)
124+
}@
125+
126+
@{
127+
TEMPLATE(
128+
'_msg_base.c.em',
129+
package_name=package_name,
130+
message=action.get_result_service.request_message,
131+
include_directives=include_directives,
132+
register_functions=register_functions)
133+
}@
134+
135+
@{
136+
TEMPLATE(
137+
'_msg_base.c.em',
138+
package_name=package_name,
139+
message=action.get_result_service.response_message,
140+
include_directives=include_directives,
141+
register_functions=register_functions)
142+
}@
143+
144+
@{
145+
TEMPLATE(
146+
'_msg_base.c.em',
147+
package_name=package_name,
148+
message=action.get_result_service.event_message,
149+
include_directives=include_directives,
150+
register_functions=register_functions)
151+
}@
152+
153+
@{
154+
TEMPLATE(
155+
'_msg_base.c.em',
156+
package_name=package_name,
157+
message=action.feedback_message, include_directives=include_directives,
158+
register_functions=register_functions)
159+
}@
160+
@[end for]@
161+
162+
163+
static PyModuleDef _module = {
164+
PyModuleDef_HEAD_INIT,
165+
.m_name = "_@(package_name)_bases",
166+
.m_doc = "Extention module for @(package_name) messages",
167+
.m_size = -1,
168+
};
169+
170+
171+
PyMODINIT_FUNC
172+
PyInit__@(package_name)_bases(void)
173+
{
174+
PyObject * pymodule = NULL;
175+
pymodule = PyModule_Create(&_module);
176+
if (!pymodule) {
177+
return NULL;
178+
}
179+
int8_t err;
180+
@[for register_function in register_functions]@
181+
182+
err = @(register_function)(pymodule);
183+
if (err) {
184+
Py_XDECREF(pymodule);
185+
return NULL;
186+
}
187+
@[end for]@
188+
189+
return pymodule;
190+
}

0 commit comments

Comments
 (0)