Skip to content

Commit 9ce13e4

Browse files
committed
Add 'rosidl_generator_rs/' from commit 'ba3f6b039a546fb34317ff83d18eee1466bd4003'
git-subtree-dir: rosidl_generator_rs git-subtree-mainline: b7711bd git-subtree-split: ba3f6b0
2 parents b7711bd + ba3f6b0 commit 9ce13e4

18 files changed

+1479
-0
lines changed

rosidl_generator_rs/CMakeLists.txt

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
cmake_minimum_required(VERSION 3.5)
2+
3+
project(rosidl_generator_rs)
4+
5+
find_package(ament_cmake REQUIRED)
6+
find_package(ament_cmake_python REQUIRED)
7+
find_package(rosidl_generator_c REQUIRED)
8+
find_package(rosidl_typesupport_interface REQUIRED)
9+
find_package(rosidl_typesupport_introspection_c REQUIRED)
10+
11+
if("$ENV{ROS_DISTRO}" STRLESS_EQUAL "humble")
12+
find_package(rosidl_cmake REQUIRED)
13+
ament_export_dependencies(rosidl_cmake)
14+
endif()
15+
16+
ament_export_dependencies(rmw)
17+
ament_export_dependencies(rosidl_generator_c)
18+
19+
ament_index_register_resource("rosidl_generator_packages")
20+
ament_index_register_resource("rosidl_runtime_packages")
21+
22+
ament_python_install_package(${PROJECT_NAME})
23+
24+
ament_package(
25+
CONFIG_EXTRAS
26+
"rosidl_generator_rs-extras.cmake.in"
27+
"cmake/register_rs.cmake"
28+
)
29+
30+
install(DIRECTORY cmake
31+
DESTINATION share/${PROJECT_NAME})
32+
ament_register_extension(
33+
"rosidl_generate_idl_interfaces"
34+
"rosidl_generator_rs"
35+
"${PROJECT_SOURCE_DIR}/cmake/rosidl_generator_rs_generate_interfaces.cmake")
36+
37+
install(
38+
PROGRAMS bin/rosidl_generator_rs
39+
DESTINATION lib/rosidl_generator_rs
40+
)
41+
install(
42+
DIRECTORY cmake resource
43+
DESTINATION share/${PROJECT_NAME}
44+
)
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#!/usr/bin/env python3
2+
3+
import argparse
4+
import os
5+
import sys
6+
7+
try:
8+
from rosidl_generator_rs import generate_rs
9+
except ImportError:
10+
# modifying sys.path and importing the Rust package with the same
11+
# name as this script does not work on Windows
12+
rosidl_generator_rs_root = os.path.dirname(os.path.dirname(__file__))
13+
rosidl_generator_rs_module = os.path.join(
14+
rosidl_generator_rs_root, 'rosidl_generator_rs', '__init__.py')
15+
if not os.path.exists(rosidl_generator_rs_module):
16+
raise
17+
from importlib.machinery import SourceFileLoader
18+
19+
loader = SourceFileLoader('rosidl_generator_rs', rosidl_generator_rs_module)
20+
rosidl_generator_rs = loader.load_module()
21+
generate_rs = rosidl_generator_rs.generate_rs
22+
23+
24+
def main(argv=sys.argv[1:]):
25+
parser = argparse.ArgumentParser(description='Generate the Rust ROS interfaces.')
26+
parser.add_argument(
27+
'--generator-arguments-file',
28+
required=True,
29+
help='The location of the file containing the generator arguments')
30+
parser.add_argument(
31+
'--typesupport-impls',
32+
required=True,
33+
help='All the available typesupport implementations')
34+
args = parser.parse_args(argv)
35+
36+
return generate_rs(
37+
args.generator_arguments_file,
38+
args.typesupport_impls,
39+
)
40+
41+
42+
if __name__ == '__main__':
43+
sys.exit(main())
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# Copyright 2017 Esteve Fernandez <esteve@apache.org>
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+
add_custom_command(
16+
OUTPUT
17+
${_generated_common_rs_files}
18+
${_generated_msg_rs_files}
19+
${_generated_srv_rs_files}
20+
${_generated_action_rs_files}
21+
COMMAND ${PYTHON_EXECUTABLE} ${rosidl_generator_rs_BIN}
22+
--generator-arguments-file "${generator_arguments_file}"
23+
--typesupport-impls "${_typesupport_impls}"
24+
DEPENDS ${target_dependencies}
25+
COMMENT "Generating Rust code for ROS interfaces"
26+
VERBATIM
27+
)
28+
29+
if(TARGET ${rosidl_generate_interfaces_TARGET}${_target_suffix})
30+
message(WARNING "Custom target ${rosidl_generate_interfaces_TARGET}${_target_suffix} already exists")
31+
else()
32+
add_custom_target(
33+
${rosidl_generate_interfaces_TARGET}${_target_suffix} ALL
34+
DEPENDS
35+
${_generated_common_rs_files}
36+
${_generated_msg_rs_files}
37+
${_generated_srv_rs_files}
38+
${_generated_action_rs_files}
39+
)
40+
endif()
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Copyright 2016-2017 Esteve Fernandez <esteve@apache.org>
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+
macro(rosidl_generator_rs_extras BIN GENERATOR_FILES TEMPLATE_DIR)
16+
find_package(ament_cmake_core QUIET REQUIRED)
17+
ament_register_extension(
18+
"rosidl_generate_idl_interfaces"
19+
"rosidl_generator_rs"
20+
"rosidl_generator_rs_generate_interfaces.cmake")
21+
22+
normalize_path(BIN "${BIN}")
23+
set(rosidl_generator_rs_BIN "${BIN}")
24+
25+
normalize_path(GENERATOR_FILES "${GENERATOR_FILES}")
26+
set(rosidl_generator_rs_GENERATOR_FILES "${GENERATOR_FILES}")
27+
28+
normalize_path(TEMPLATE_DIR "${TEMPLATE_DIR}")
29+
set(rosidl_generator_rs_TEMPLATE_DIR "${TEMPLATE_DIR}")
30+
endmacro()
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
# Copyright 2016-2017 Esteve Fernandez <esteve@apache.org>
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+
if(NOT WIN32)
16+
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
17+
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined")
18+
elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
19+
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-undefined,error")
20+
endif()
21+
endif()
22+
23+
set(_output_path
24+
"${CMAKE_CURRENT_BINARY_DIR}/rosidl_generator_rs/${PROJECT_NAME}")
25+
set(_generated_common_rs_files "")
26+
27+
set(_generated_msg_rs_files "")
28+
set(_generated_srv_rs_files "")
29+
set(_generated_action_rs_files "")
30+
31+
set(_has_msg FALSE)
32+
set(_has_srv FALSE)
33+
set(_has_action FALSE)
34+
35+
foreach(_idl_file ${rosidl_generate_interfaces_ABS_IDL_FILES})
36+
get_filename_component(_parent_folder "${_idl_file}" DIRECTORY)
37+
get_filename_component(_parent_folder "${_parent_folder}" NAME)
38+
get_filename_component(_module_name "${_idl_file}" NAME_WE)
39+
40+
if(_parent_folder STREQUAL "msg")
41+
set(_has_msg TRUE)
42+
set(_idl_files ${_idl_files} ${_idl_file})
43+
elseif(_parent_folder STREQUAL "srv")
44+
set(_has_srv TRUE)
45+
set(_idl_files ${_idl_files} ${_idl_file})
46+
elseif(_parent_folder STREQUAL "action")
47+
set(_has_action TRUE)
48+
set(_idl_files ${_idl_files} ${_idl_file})
49+
else()
50+
message(FATAL_ERROR "Interface file with unknown parent folder: ${_idl_file}")
51+
endif()
52+
endforeach()
53+
54+
list(APPEND _generated_common_rs_files
55+
"${_output_path}/rust/src/lib.rs"
56+
"${_output_path}/rust/build.rs"
57+
"${_output_path}/rust/Cargo.toml"
58+
)
59+
60+
if(${_has_msg})
61+
list(APPEND _generated_msg_rs_files
62+
"${_output_path}/rust/src/msg.rs"
63+
)
64+
endif()
65+
66+
if(${_has_srv})
67+
list(APPEND _generated_srv_rs_files
68+
"${_output_path}/rust/src/srv.rs"
69+
)
70+
endif()
71+
72+
if(${_has_action})
73+
list(APPEND _generated_action_rs_files
74+
"${_output_path}/rust/src/action.rs"
75+
)
76+
endif()
77+
78+
set(_dependency_files "")
79+
set(_dependencies "")
80+
foreach(_pkg_name ${rosidl_generate_interfaces_DEPENDENCY_PACKAGE_NAMES})
81+
foreach(_idl_file ${${_pkg_name}_IDL_FILES})
82+
set(_abs_idl_file "${${_pkg_name}_DIR}/../${_idl_file}")
83+
normalize_path(_abs_idl_file "${_abs_idl_file}")
84+
list(APPEND _dependency_files "${_abs_idl_file}")
85+
list(APPEND _dependencies "${_pkg_name}:${_abs_idl_file}")
86+
endforeach()
87+
endforeach()
88+
89+
set(target_dependencies
90+
"${rosidl_generator_rs_BIN}"
91+
${rosidl_generator_rs_GENERATOR_FILES}
92+
"${rosidl_generator_rs_TEMPLATE_DIR}/action.rs.em"
93+
"${rosidl_generator_rs_TEMPLATE_DIR}/msg_idiomatic.rs.em"
94+
"${rosidl_generator_rs_TEMPLATE_DIR}/msg_rmw.rs.em"
95+
"${rosidl_generator_rs_TEMPLATE_DIR}/msg.rs.em"
96+
"${rosidl_generator_rs_TEMPLATE_DIR}/srv_idiomatic.rs.em"
97+
"${rosidl_generator_rs_TEMPLATE_DIR}/srv_rmw.rs.em"
98+
"${rosidl_generator_rs_TEMPLATE_DIR}/srv.rs.em"
99+
${rosidl_generate_interfaces_ABS_IDL_FILES}
100+
${_idl_files}
101+
${_dependency_files})
102+
foreach(dep ${target_dependencies})
103+
if(NOT EXISTS "${dep}")
104+
message(FATAL_ERROR "Target dependency '${dep}' does not exist")
105+
endif()
106+
endforeach()
107+
108+
set(generator_arguments_file "${CMAKE_CURRENT_BINARY_DIR}/rosidl_generator_rs__arguments.json")
109+
rosidl_write_generator_arguments(
110+
"${generator_arguments_file}"
111+
PACKAGE_NAME "${PROJECT_NAME}"
112+
IDL_TUPLES "${rosidl_generate_interfaces_IDL_TUPLES}"
113+
ROS_INTERFACE_FILES "${_idl_files}"
114+
ROS_INTERFACE_DEPENDENCIES "${_dependencies}"
115+
OUTPUT_DIR "${_output_path}"
116+
TEMPLATE_DIR "${rosidl_generator_rs_TEMPLATE_DIR}"
117+
TARGET_DEPENDENCIES ${target_dependencies}
118+
)
119+
120+
file(READ ${generator_arguments_file} contents)
121+
string(REPLACE "\n}"
122+
",\n \"package_version\": \"${${PROJECT_NAME}_VERSION}\"\n}" contents ${contents})
123+
file(WRITE ${generator_arguments_file} ${contents})
124+
125+
file(MAKE_DIRECTORY "${_output_path}")
126+
127+
set(_target_suffix "__rs")
128+
129+
# needed to avoid multiple calls to the Rust generator trick copied from
130+
# https://github.com/ros2/rosidl/blob/master/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces.cmake
131+
set(_subdir "${CMAKE_CURRENT_BINARY_DIR}/${rosidl_generate_interfaces_TARGET}${_target_suffix}")
132+
file(MAKE_DIRECTORY "${_subdir}")
133+
file(READ "${rosidl_generator_rs_DIR}/custom_command.cmake" _custom_command)
134+
file(WRITE "${_subdir}/CMakeLists.txt" "${_custom_command}")
135+
add_subdirectory("${_subdir}" ${rosidl_generate_interfaces_TARGET}${_target_suffix})
136+
137+
add_dependencies(${rosidl_generate_interfaces_TARGET} ${rosidl_generate_interfaces_TARGET}${_target_suffix})
138+
139+
set_property(
140+
SOURCE
141+
${_generated_common_rs_files}
142+
${_generated_msg_rs_files}
143+
${_generated_srv_rs_files}
144+
${_generated_action_rs_files}
145+
PROPERTY GENERATED 1)
146+
147+
set(_rsext_suffix "__rsext")
148+
if(NOT rosidl_generate_interfaces_SKIP_INSTALL)
149+
ament_index_register_resource("rust_packages")
150+
install(
151+
DIRECTORY "${_output_path}/rust"
152+
DESTINATION "share/${PROJECT_NAME}"
153+
)
154+
endif()
155+
156+
if(BUILD_TESTING AND rosidl_generate_interfaces_ADD_LINTER_TESTS)
157+
if(
158+
NOT _generated_msg_rs_files STREQUAL "" OR
159+
NOT _generated_srv_rs_files STREQUAL "" OR
160+
NOT _generated_action_rs_files STREQUAL ""
161+
)
162+
# TODO(esteve): add linters for Rust files
163+
endif()
164+
endif()

rosidl_generator_rs/package.xml

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?xml version="1.0"?>
2+
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
3+
<package format="3">
4+
<name>rosidl_generator_rs</name>
5+
<version>0.4.1</version>
6+
<description>Generate the ROS interfaces in Rust.</description>
7+
<maintainer email="esteve@apache.org">Esteve Fernandez</maintainer>
8+
<license>Apache License 2.0</license>
9+
<author email="esteve@apache.org">Esteve Fernandez</author>
10+
11+
<buildtool_depend>ament_cmake</buildtool_depend>
12+
<buildtool_depend>ros_environment</buildtool_depend>
13+
14+
<buildtool_depend>rosidl_runtime_rs</buildtool_depend>
15+
16+
<buildtool_export_depend>ament_cmake</buildtool_export_depend>
17+
<buildtool_export_depend>ros_environment</buildtool_export_depend>
18+
<buildtool_export_depend condition="humble >= $ROS_DISTRO">rosidl_cmake</buildtool_export_depend>
19+
<buildtool_export_depend condition="$ROS_DISTRO > humble">rosidl_pycommon</buildtool_export_depend>
20+
<buildtool_export_depend>rosidl_runtime_rs</buildtool_export_depend>
21+
<buildtool_export_depend>rosidl_typesupport_c</buildtool_export_depend>
22+
<buildtool_export_depend>rosidl_typesupport_interface</buildtool_export_depend>
23+
24+
<!-- This is needed for the rosidl_message_type_support_t struct and visibility macros -->
25+
<build_export_depend>rosidl_generator_c</build_export_depend>
26+
27+
<exec_depend>rosidl_parser</exec_depend>
28+
29+
<test_depend>ament_cmake_gtest</test_depend>
30+
<test_depend>ament_lint_auto</test_depend>
31+
<test_depend>ament_lint_common</test_depend>
32+
<test_depend condition="humble >= $ROS_DISTRO">rosidl_cmake</test_depend>
33+
<test_depend condition="$ROS_DISTRO > humble">rosidl_pycommon</test_depend>
34+
<test_depend>rosidl_generator_c</test_depend>
35+
36+
<member_of_group>rosidl_generator_packages</member_of_group>
37+
<member_of_group>rosidl_runtime_packages</member_of_group>
38+
39+
<export>
40+
<build_type>ament_cmake</build_type>
41+
</export>
42+
</package>
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
[package]
2+
name = "@(package_name)"
3+
version = "@(package_version)"
4+
edition = "2021"
5+
6+
[dependencies]
7+
rosidl_runtime_rs = "0.4"
8+
serde = { version = "1", optional = true, features = ["derive"] }
9+
serde-big-array = { version = "0.5.1", optional = true }
10+
@[for dep in dependency_packages]@
11+
@(dep) = "*"
12+
@[end for]@
13+
14+
[features]
15+
@{
16+
serde_features = ["dep:serde", "dep:serde-big-array", "rosidl_runtime_rs/serde"]
17+
for dep in dependency_packages:
18+
serde_features.append("{}/serde".format(dep))
19+
}@
20+
serde = @(serde_features)

0 commit comments

Comments
 (0)