Skip to content

Commit 6247167

Browse files
jacobperronesteve
authored andcommitted
Update rosidl_generator_java for Dashing compatibility (#66)
* Update rosidl_generator_java for new IDL pipeline Supporting ROS Dashing or later. Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Fix name JNI name mangling Accidentally broken during update. Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Remove java compile flags This remove some compile warnings. Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Refactor to support services Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Wide string support Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Avoid duplicate includes Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Use test_interface_files Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Support for actions Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Add suffix for long literals Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Handle unsigned literals Though Java supports unsigned values, it doesn't support unsigned literals (ie. literals that are larger than the max signed value). As a workaround, we can convert the literal to it's negative equivalent. Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Fix escape string function Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Use cast to workaround integer literals Otherwise the compiler complains about potential loss of data. Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Minor refactor Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Remove TODO Signed-off-by: Jacob Perron <jacob@openrobotics.org>
1 parent e45e1e0 commit 6247167

File tree

18 files changed

+994
-620
lines changed

18 files changed

+994
-620
lines changed

rcljava_common/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ set(${PROJECT_NAME}_java_sources
3636
"src/main/java/org/ros2/rcljava/common/JNIUtils.java"
3737
"src/main/java/org/ros2/rcljava/exceptions/RCLException.java"
3838
"src/main/java/org/ros2/rcljava/exceptions/RCLReturn.java"
39+
"src/main/java/org/ros2/rcljava/interfaces/ActionDefinition.java"
3940
"src/main/java/org/ros2/rcljava/interfaces/Disposable.java"
4041
"src/main/java/org/ros2/rcljava/interfaces/MessageDefinition.java"
4142
"src/main/java/org/ros2/rcljava/interfaces/ServiceDefinition.java"
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/* Copyright 2019 Open Source Robotics Foundation, Inc.
2+
*
3+
* Licensed under the Apache License, Version 2.0 (the "License");
4+
* you may not use this file except in compliance with the License.
5+
* You may obtain a copy of the License at
6+
*
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* Unless required by applicable law or agreed to in writing, software
10+
* distributed under the License is distributed on an "AS IS" BASIS,
11+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
* See the License for the specific language governing permissions and
13+
* limitations under the License.
14+
*/
15+
16+
package org.ros2.rcljava.interfaces;
17+
18+
public interface ActionDefinition {}

rosidl_generator_java/CMakeLists.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,17 @@ endif()
2424
include(UseJava)
2525
include(JavaExtra)
2626

27-
set(CMAKE_JAVA_COMPILE_FLAGS "-source" "1.6" "-target" "1.6")
28-
2927
ament_index_register_resource("rosidl_generator_packages")
3028

3129
if(BUILD_TESTING)
3230
find_package(rosidl_cmake REQUIRED)
3331
find_package(rosidl_generator_c REQUIRED)
34-
35-
find_package(ament_lint_auto REQUIRED)
32+
find_package(test_interface_files REQUIRED)
3633

3734
find_package(ament_lint_auto REQUIRED)
3835
ament_lint_auto_find_test_dependencies()
3936

37+
# TODO(jacobperron): Use test_interface_files instead and update tests
4038
set(message_files
4139
"msg/Bool.msg"
4240
"msg/Byte.msg"
@@ -70,7 +68,9 @@ if(BUILD_TESTING)
7068
"${CMAKE_CURRENT_SOURCE_DIR}/resource"
7169
)
7270

73-
rosidl_generate_interfaces(${PROJECT_NAME} ${message_files}
71+
rosidl_generate_interfaces(${PROJECT_NAME}
72+
${message_files}
73+
${test_interface_files_SRV_FILES}
7474
SKIP_INSTALL
7575
)
7676

rosidl_generator_java/bin/rosidl_generator_java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,13 @@ def main(argv=sys.argv[1:]):
2727
'--generator-arguments-file',
2828
required=True,
2929
help='The location of the file containing the generator arguments')
30-
parser.add_argument(
31-
'--typesupport-impl',
32-
required=True,
33-
help='The typesupport implementation targeted by the C interface')
3430
parser.add_argument(
3531
'--typesupport-impls',
3632
required=True,
3733
help='All the available typesupport implementations')
3834
args = parser.parse_args(argv)
3935

40-
return generate_java(args.generator_arguments_file, args.typesupport_impl, args.typesupport_impls)
36+
return generate_java(args.generator_arguments_file, args.typesupport_impls.split(';'))
4137

4238

4339
if __name__ == '__main__':

rosidl_generator_java/cmake/custom_command.cmake

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,14 @@
1111
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
14-
15-
1614
add_custom_command(
1715
OUTPUT
18-
${_generated_msg_java_files}
19-
${_generated_msg_cpp_files}
20-
${_generated_srv_java_files}
21-
${_generated_srv_cpp_files}
16+
${_generated_extension_files}
17+
${_generated_java_files}
2218
COMMAND ${PYTHON_EXECUTABLE} ${rosidl_generator_java_BIN}
2319
--generator-arguments-file "${generator_arguments_file}"
24-
--typesupport-impl "${_typesupport_impl}"
2520
--typesupport-impls "${_typesupport_impls}"
26-
DEPENDS ${target_dependencies}
21+
DEPENDS ${target_dependencies} ${rosidl_generate_interfaces_TARGET}
2722
COMMENT "Generating Java code for ROS interfaces"
2823
VERBATIM
2924
)
@@ -34,17 +29,14 @@ else()
3429
add_custom_target(
3530
${rosidl_generate_interfaces_TARGET}${_target_suffix}
3631
DEPENDS
37-
${_generated_msg_java_files}
38-
${_generated_msg_cpp_files}
39-
${_generated_srv_java_files}
40-
${_generated_srv_cpp_files}
32+
${_generated_extension_files}
33+
${_generated_java_files}
4134
)
4235
endif()
4336

4437
add_jar("${PROJECT_NAME}_messages_jar"
4538
SOURCES
46-
${_generated_msg_java_files}
47-
${_generated_srv_java_files}
39+
${_generated_java_files}
4840
OUTPUT_NAME
4941
${PROJECT_NAME}_messages
5042
INCLUDE_JARS

rosidl_generator_java/cmake/register_java.cmake

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
# limitations under the License.
1414

1515
macro(rosidl_generator_java_extras BIN GENERATOR_FILES TEMPLATE_DIR)
16-
find_package(ament_cmake_core QUIET REQUIRED)
16+
find_package(ament_cmake_core REQUIRED)
1717
ament_register_extension(
18-
"rosidl_generate_interfaces"
18+
"rosidl_generate_idl_interfaces"
1919
"rosidl_generator_java"
2020
"rosidl_generator_java_generate_interfaces.cmake")
2121

rosidl_generator_java/cmake/rosidl_generator_java_generate_interfaces.cmake

Lines changed: 59 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@ if(NOT WIN32)
3939
endif()
4040
endif()
4141

42-
set(CMAKE_JAVA_COMPILE_FLAGS "-source" "1.6" "-target" "1.6")
43-
4442
# Get a list of typesupport implementations from valid rmw implementations.
4543
rosidl_generator_java_get_typesupports(_typesupport_impls)
4644

@@ -51,48 +49,53 @@ endif()
5149

5250
set(_output_path
5351
"${CMAKE_CURRENT_BINARY_DIR}/rosidl_generator_java/${PROJECT_NAME}")
54-
set(_generated_cpp_files "")
55-
set(_generated_msg_java_files "")
56-
set(_generated_msg_cpp_files "")
57-
set(_generated_srv_java_files "")
58-
set(_generated_srv_cpp_files "")
52+
set(_generated_extension_files "")
53+
set(_generated_java_files "")
5954

60-
foreach(_idl_file ${rosidl_generate_interfaces_IDL_FILES})
61-
get_filename_component(_parent_folder "${_idl_file}" DIRECTORY)
62-
get_filename_component(_parent_folder "${_parent_folder}" NAME)
63-
get_filename_component(_module_name "${_idl_file}" NAME_WE)
55+
foreach(_typesupport_impl ${_typesupport_impls})
56+
set(_generated_extension_${_typesupport_impl}_files "")
57+
endforeach()
6458

65-
if(_parent_folder STREQUAL "msg")
66-
list(APPEND _generated_msg_java_files
67-
"${_output_path}/${_parent_folder}/${_module_name}.java"
59+
foreach(_abs_idl_file ${rosidl_generate_interfaces_ABS_IDL_FILES})
60+
get_filename_component(_parent_folder "${_abs_idl_file}" DIRECTORY)
61+
get_filename_component(_parent_folder "${_parent_folder}" NAME)
62+
get_filename_component(_idl_name "${_abs_idl_file}" NAME_WE)
63+
list(APPEND _generated_java_files
64+
"${_output_path}/${_parent_folder}/${_idl_name}.java"
65+
)
66+
# TODO(jacobperron): Is there a more robust way of detecting services and actions
67+
# Services generate extra files
68+
if(_parent_folder STREQUAL "srv")
69+
list(APPEND _generated_java_files
70+
"${_output_path}/${_parent_folder}/${_idl_name}_Request.java"
71+
"${_output_path}/${_parent_folder}/${_idl_name}_Response.java"
6872
)
69-
70-
foreach(_typesupport_impl ${_typesupport_impls})
71-
list_append_unique(_generated_msg_cpp_files
72-
"${_output_path}/${_parent_folder}/${_module_name}.ep.${_typesupport_impl}.cpp"
73-
)
74-
list(APPEND _type_support_by_generated_msg_cpp_files "${_typesupport_impl}")
75-
endforeach()
76-
elseif(_parent_folder STREQUAL "srv")
77-
list(APPEND _generated_srv_java_files
78-
"${_output_path}/${_parent_folder}/${_module_name}.java"
73+
endif()
74+
# Actions generate extra files
75+
if(_parent_folder STREQUAL "action")
76+
list(APPEND _generated_java_files
77+
"${_output_path}/${_parent_folder}/${_idl_name}_Goal.java"
78+
"${_output_path}/${_parent_folder}/${_idl_name}_Result.java"
79+
"${_output_path}/${_parent_folder}/${_idl_name}_Feedback.java"
7980
)
80-
81-
foreach(_typesupport_impl ${_typesupport_impls})
82-
list_append_unique(_generated_srv_cpp_files
83-
"${_output_path}/${_parent_folder}/${_module_name}.ep.${_typesupport_impl}.cpp"
84-
)
85-
list(APPEND _type_support_by_generated_srv_cpp_files "${_typesupport_impl}")
86-
endforeach()
87-
else()
88-
message(FATAL_ERROR "Interface file with unknown parent folder: ${_idl_file}")
8981
endif()
82+
83+
foreach(_typesupport_impl ${_typesupport_impls})
84+
list(APPEND _generated_extension_${_typesupport_impl}_files "${_output_path}/${_parent_folder}/${_idl_name}.ep.${_typesupport_impl}.cpp")
85+
endforeach()
86+
endforeach()
87+
88+
foreach(_typesupport_impl ${_typesupport_impls})
89+
foreach(_generated_file ${_generated_extension_${_typesupport_impl}_files})
90+
list(APPEND _generated_extension_files "${_generated_file}")
91+
list(APPEND _typesupport_by_generated_cpp_files "${_typesupport_impl}")
92+
endforeach()
9093
endforeach()
9194

9295
set(_dependency_files "")
9396
set(_dependencies "")
9497
foreach(_pkg_name ${rosidl_generate_interfaces_DEPENDENCY_PACKAGE_NAMES})
95-
foreach(_idl_file ${${_pkg_name}_INTERFACE_FILES})
98+
foreach(_idl_file ${${_pkg_name}_IDL_FILES})
9699
set(_abs_idl_file "${${_pkg_name}_DIR}/../${_idl_file}")
97100
normalize_path(_abs_idl_file "${_abs_idl_file}")
98101
list(APPEND _dependency_files "${_abs_idl_file}")
@@ -103,11 +106,15 @@ endforeach()
103106
set(target_dependencies
104107
"${rosidl_generator_java_BIN}"
105108
${rosidl_generator_java_GENERATOR_FILES}
109+
"${rosidl_generator_java_TEMPLATE_DIR}/action.cpp.em"
110+
"${rosidl_generator_java_TEMPLATE_DIR}/idl.cpp.em"
106111
"${rosidl_generator_java_TEMPLATE_DIR}/msg.cpp.em"
107112
"${rosidl_generator_java_TEMPLATE_DIR}/srv.cpp.em"
113+
"${rosidl_generator_java_TEMPLATE_DIR}/action.java.em"
114+
"${rosidl_generator_java_TEMPLATE_DIR}/idl.java.em"
108115
"${rosidl_generator_java_TEMPLATE_DIR}/msg.java.em"
109116
"${rosidl_generator_java_TEMPLATE_DIR}/srv.java.em"
110-
${rosidl_generate_interfaces_IDL_FILES}
117+
${rosidl_generate_interfaces_ABS_IDL_FILES}
111118
${_dependency_files})
112119
foreach(dep ${target_dependencies})
113120
if(NOT EXISTS "${dep}")
@@ -119,7 +126,7 @@ set(generator_arguments_file "${CMAKE_BINARY_DIR}/rosidl_generator_java__argumen
119126
rosidl_write_generator_arguments(
120127
"${generator_arguments_file}"
121128
PACKAGE_NAME "${PROJECT_NAME}"
122-
ROS_INTERFACE_FILES "${rosidl_generate_interfaces_IDL_FILES}"
129+
IDL_TUPLES "${rosidl_generate_interfaces_IDL_TUPLES}"
123130
ROS_INTERFACE_DEPENDENCIES "${_dependencies}"
124131
OUTPUT_DIR "${_output_path}"
125132
TEMPLATE_DIR "${rosidl_generator_java_TEMPLATE_DIR}"
@@ -128,7 +135,6 @@ rosidl_write_generator_arguments(
128135

129136
file(MAKE_DIRECTORY "${_output_path}")
130137

131-
set(_generated_extension_files "")
132138
set(_extension_dependencies "")
133139
set(_target_suffix "__java")
134140

@@ -156,10 +162,8 @@ add_subdirectory("${_subdir}" ${rosidl_generate_interfaces_TARGET}${_target_suff
156162

157163
set_property(
158164
SOURCE
159-
${_generated_msg_java_files}
160-
${_generated_msg_cpp_files}
161-
${_generated_srv_java_files}
162-
${_generated_srv_cpp_files}
165+
${_generated_extension_files}
166+
${_generated_java_files}
163167
PROPERTY GENERATED 1)
164168

165169
macro(set_properties _build_type)
@@ -172,35 +176,29 @@ macro(set_properties _build_type)
172176
OUTPUT_NAME "${_library_path}")
173177
endmacro()
174178

175-
set(_type_support_by_generated_cpp_files ${_type_support_by_generated_msg_cpp_files} ${_type_support_by_generated_srv_cpp_files})
176-
set(_generated_cpp_files ${_generated_msg_cpp_files} ${_generated_srv_cpp_files})
177-
178-
set(_javaext_suffix "__javaext")
179-
foreach(_generated_cpp_file ${_generated_cpp_files})
180-
get_filename_component(_full_folder "${_generated_cpp_file}" DIRECTORY)
181-
get_filename_component(_package_folder "${_full_folder}" DIRECTORY)
182-
get_filename_component(_package_name "${_package_folder}" NAME)
183-
get_filename_component(_parent_folder "${_full_folder}" NAME)
184-
get_filename_component(_base_msg_name "${_generated_cpp_file}" NAME_WE)
185-
list(FIND _generated_cpp_files ${_generated_cpp_file} _file_index)
186-
list(GET _type_support_by_generated_cpp_files ${_file_index} _typesupport_impl)
179+
foreach(_generated_cpp_file ${_generated_extension_files})
180+
list(FIND _generated_extension_files ${_generated_cpp_file} _file_index)
181+
list(GET _typesupport_by_generated_cpp_files ${_file_index} _typesupport_impl)
187182
find_package(${_typesupport_impl} REQUIRED)
188-
set(_generated_msg_cpp_common_file "${_full_folder}/${_base_msg_name}.cpp")
183+
get_filename_component(_parent_folder "${_generated_cpp_file}" DIRECTORY)
184+
get_filename_component(_parent_folder "${_parent_folder}" NAME)
185+
get_filename_component(_parent_folder "${_parent_folder}" NAME)
186+
get_filename_component(_base_name "${_generated_cpp_file}" NAME_WE)
189187
string(REGEX REPLACE "^rosidl_typesupport_" "" _short_typesupport_impl ${_typesupport_impl})
190-
set(_library_name
191-
"${_parent_folder}${_base_msg_name}${_short_typesupport_impl}"
192-
)
188+
set(_library_name "${_parent_folder}${_base_name}${_short_typesupport_impl}")
193189
set(_library_path
194-
"${_package_name}_${_parent_folder}_${_base_msg_name}__jni__${_typesupport_impl}"
190+
"${rosidl_generate_interfaces_TARGET}_${_parent_folder}_${_base_name}__jni__${_typesupport_impl}"
195191
)
196192
string_camel_case_to_lower_case_underscore(${_library_path} _library_path)
193+
197194
add_library(${_library_name} SHARED
198195
${_generated_cpp_file}
199196
)
200197
add_dependencies(
201198
${_library_name}
202199
${rosidl_generate_interfaces_TARGET}${_target_suffix}
203200
${rosidl_generate_interfaces_TARGET}__rosidl_typesupport_c
201+
${_target_dependencies}
204202
)
205203
set(_extension_compile_flags "")
206204
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
@@ -248,9 +246,6 @@ foreach(_generated_cpp_file ${_generated_cpp_files})
248246
)
249247
target_link_libraries(${_library_name} ${${_pkg_name}_JNI_LIBRARIES})
250248
endforeach()
251-
add_dependencies(${_library_name}
252-
${rosidl_generate_interfaces_TARGET}__${_typesupport_impl}
253-
)
254249
if(NOT rosidl_generate_interfaces_SKIP_INSTALL)
255250
install(TARGETS ${_library_name}
256251
ARCHIVE DESTINATION lib/jni
@@ -277,18 +272,16 @@ add_custom_command(
277272

278273
if(NOT rosidl_generate_interfaces_SKIP_INSTALL)
279274
set(_install_jar_dir "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}")
280-
if(NOT _generated_msg_java_files STREQUAL "" OR NOT _generated_srv_java_files STREQUAL "")
275+
if(NOT _generated_java_files STREQUAL "")
281276
install_jar("${PROJECT_NAME}_messages_jar" "share/${PROJECT_NAME}/java")
282277
ament_export_jars("share/${PROJECT_NAME}/java/${PROJECT_NAME}_messages.jar")
283278
endif()
284279
endif()
285280

286281
if(BUILD_TESTING AND rosidl_generate_interfaces_ADD_LINTER_TESTS)
287282
if(
288-
NOT _generated_msg_java_files STREQUAL "" OR
289-
NOT _generated_msg_cpp_files STREQUAL "" OR
290-
NOT _generated_srv_java_files STREQUAL "" OR
291-
NOT _generated_srv_cpp_files STREQUAL ""
283+
NOT _generated_java_files STREQUAL "" OR
284+
NOT _generated_extension_files STREQUAL ""
292285
)
293286
find_package(ament_cmake_cppcheck REQUIRED)
294287
ament_cppcheck(

rosidl_generator_java/package.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,18 @@
3535
<test_depend>rmw_implementation_cmake</test_depend>
3636
<test_depend>rosidl_generator_c</test_depend>
3737

38-
<test_depend>rosidl_parser</test_depend>
3938
<test_depend>rosidl_cmake</test_depend>
39+
<test_depend>rosidl_parser</test_depend>
4040
<!-- Duplicated from rosidl_default_generator in order to avoid a circular dependency. -->
4141
<test_depend>rosidl_typesupport_c</test_depend>
4242
<test_depend>rosidl_typesupport_connext_c</test_depend>
43+
<test_depend>rosidl_typesupport_fastrtps_c</test_depend>
4344
<test_depend>rosidl_typesupport_introspection_c</test_depend>
4445
<test_depend>rosidl_typesupport_opensplice_c</test_depend>
46+
<test_depend>test_interface_files</test_depend>
4547

4648
<member_of_group>rosidl_generator_packages</member_of_group>
49+
<member_of_group>rosidl_runtime_packages</member_of_group>
4750

4851
<export>
4952
<build_type>ament_cmake</build_type>

0 commit comments

Comments
 (0)