Skip to content

Commit 6375caf

Browse files
author
Маслов Александр Александрович
committed
Using C extention base class for every message
Signed-off-by: Alexander Maslov <[email protected]>
1 parent 122b738 commit 6375caf

9 files changed

+588
-85
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
COMMAND ${PYTHON_EXECUTABLE} ${rosidl_generator_py_BIN}
2424
--generator-arguments-file "${generator_arguments_file}"
2525
--typesupport-impls "${_typesupport_impls}"
@@ -37,5 +37,6 @@ else()
3737
${_generated_extension_files}
3838
${_generated_py_files}
3939
${_generated_c_files}
40+
${_generated_c_base_files}
4041
)
4142
endif()

rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces.cmake

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ set(_output_path
3535
set(_generated_extension_files "")
3636
set(_generated_py_files "")
3737
set(_generated_c_files "")
38+
set(_generated_c_base_files "")
3839

3940
foreach(_typesupport_impl ${_typesupport_impls})
4041
set(_generated_extension_${_typesupport_impl}_files "")
@@ -50,6 +51,8 @@ foreach(_abs_idl_file ${rosidl_generate_interfaces_ABS_IDL_FILES})
5051
list(APPEND _generated_c_files
5152
"${_output_path}/${_parent_folder}/_${_module_name}_s.c")
5253
endforeach()
54+
list(APPEND _generated_c_base_files
55+
"${_output_path}/_${PROJECT_NAME}_bases.c")
5356

5457
file(MAKE_DIRECTORY "${_output_path}")
5558
file(WRITE "${_output_path}/__init__.py" "")
@@ -93,9 +96,11 @@ set(target_dependencies
9396
${rosidl_generator_py_GENERATOR_FILES}
9497
"${rosidl_generator_py_TEMPLATE_DIR}/_action_pkg_typesupport_entry_point.c.em"
9598
"${rosidl_generator_py_TEMPLATE_DIR}/_action.py.em"
99+
"${rosidl_generator_py_TEMPLATE_DIR}/_idl_pkg_bases.c.em"
96100
"${rosidl_generator_py_TEMPLATE_DIR}/_idl_pkg_typesupport_entry_point.c.em"
97101
"${rosidl_generator_py_TEMPLATE_DIR}/_idl_support.c.em"
98102
"${rosidl_generator_py_TEMPLATE_DIR}/_idl.py.em"
103+
"${rosidl_generator_py_TEMPLATE_DIR}/_msg_base.c.em"
99104
"${rosidl_generator_py_TEMPLATE_DIR}/_msg_pkg_typesupport_entry_point.c.em"
100105
"${rosidl_generator_py_TEMPLATE_DIR}/_msg_support.c.em"
101106
"${rosidl_generator_py_TEMPLATE_DIR}/_msg.py.em"
@@ -139,9 +144,15 @@ file(WRITE "${_subdir}/CMakeLists.txt" "${_custom_command}")
139144
add_subdirectory("${_subdir}" ${rosidl_generate_interfaces_TARGET}${_target_suffix})
140145
set_property(
141146
SOURCE
142-
${_generated_extension_files} ${_generated_py_files} ${_generated_c_files}
147+
${_generated_extension_files} ${_generated_py_files} ${_generated_c_files} ${_generated_c_base_files}
143148
PROPERTY GENERATED 1)
144149

150+
151+
set(_extension_compile_flags "")
152+
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
153+
set(_extension_compile_flags -Wall -Wextra)
154+
endif()
155+
145156
macro(set_properties _build_type)
146157
set_target_properties(${_target_name} PROPERTIES
147158
COMPILE_OPTIONS "${_extension_compile_flags}"
@@ -212,6 +223,29 @@ endif()
212223
rosidl_get_typesupport_target(c_typesupport_target "${rosidl_generate_interfaces_TARGET}" "rosidl_typesupport_c")
213224
target_link_libraries(${_target_name_lib} ${c_typesupport_target})
214225

226+
227+
set(_target_name_bases_lib "${rosidl_generate_interfaces_TARGET}__bases")
228+
add_library(${_target_name_bases_lib} SHARED ${_generated_c_base_files})
229+
add_dependencies(
230+
${_target_name_bases_lib}
231+
${rosidl_generate_interfaces_TARGET}${_target_suffix})
232+
target_link_libraries(${_target_name_bases_lib} ${PythonExtra_LIBRARIES})
233+
target_include_directories(${_target_name_bases_lib} PRIVATE ${PythonExtra_INCLUDE_DIRS})
234+
235+
set_target_properties(${_target_name_bases_lib} PROPERTIES
236+
COMPILE_OPTIONS "${_extension_compile_flags}"
237+
PREFIX ""
238+
LIBRARY_OUTPUT_DIRECTORY${_build_type} ${_output_path}
239+
RUNTIME_OUTPUT_DIRECTORY${_build_type} ${_output_path}
240+
OUTPUT_NAME "_${PROJECT_NAME}_bases${PythonExtra_EXTENSION_SUFFIX}"
241+
SUFFIX "${PythonExtra_EXTENSION_EXTENSION}"
242+
)
243+
if(NOT rosidl_generate_interfaces_SKIP_INSTALL)
244+
install(TARGETS ${_target_name_bases_lib}
245+
DESTINATION "${PYTHON_INSTALL_DIR}/${PROJECT_NAME}")
246+
endif()
247+
248+
215249
foreach(_typesupport_impl ${_typesupport_impls})
216250
find_package(${_typesupport_impl} REQUIRED)
217251
# a typesupport package might not be able to generated a target anymore
@@ -232,10 +266,6 @@ foreach(_typesupport_impl ${_typesupport_impls})
232266
${rosidl_generate_interfaces_TARGET}__rosidl_typesupport_c
233267
)
234268

235-
set(_extension_compile_flags "")
236-
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
237-
set(_extension_compile_flags -Wall -Wextra)
238-
endif()
239269
set_properties("")
240270
if(WIN32)
241271
set_properties("_DEBUG")
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)