├── .bazelversion
├── docs
├── .nojekyll
├── bazel_registry.json
├── README.md
└── index.html
├── example
├── .bazelversion
├── msg
│ ├── ExampleMessage.msg
│ └── BUILD.bazel
├── ros
│ ├── example_ros_subscriber.cc
│ └── example_ros_publisher.cc
├── proto
│ ├── example_proto_subscriber.cc
│ └── example_proto_publisher.cc
├── BUILD.bazel
├── .bazelrc
└── MODULE.bazel
├── .bazelignore
├── .gitignore
├── src
├── example_ros.py
├── example_ros.cc
├── example_proto.cc
├── example_ros.c
├── example_ros_subscriber.cc
├── example_ros_proto_subscriber.cc
├── example_ros_proto_publisher.cc
├── example_ros_publisher.cc
├── example_ros_publisher.c
└── example_ros_subscriber.c
├── tools
├── BUILD.bazel
├── registry_scraper_tool.py
└── registry_scraper_data.yaml
├── Dockerfile
├── .github
└── workflows
│ ├── build-test-macos-amd64.yml
│ ├── build-test-macos-arm64.yml
│ ├── build-test-windows-amd64.yml
│ ├── build-test-windows-arm64.yml
│ ├── deploy-gh-pages.yml
│ ├── build-test-linux-amd64.yml
│ └── build-test-linux-arm64.yml
├── .bazelrc
├── BUILD.bazel
├── distribution.txt
├── .gitmodules
├── LICENSE
├── README.md
└── MODULE.bazel
/.bazelversion:
--------------------------------------------------------------------------------
1 | 8.4.1
--------------------------------------------------------------------------------
/docs/.nojekyll:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/example/.bazelversion:
--------------------------------------------------------------------------------
1 | 8.4.1
--------------------------------------------------------------------------------
/docs/bazel_registry.json:
--------------------------------------------------------------------------------
1 | {
2 | "mirrors": []
3 | }
--------------------------------------------------------------------------------
/.bazelignore:
--------------------------------------------------------------------------------
1 | docs
2 | example
3 | thirdparty
4 | submodules
5 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | docs/modules
2 | bazel-*
3 | MODULE.bazel.lock
4 | *.sh
--------------------------------------------------------------------------------
/example/msg/ExampleMessage.msg:
--------------------------------------------------------------------------------
1 | # My example message containing four camera images.
2 | std_msgs/String message
3 | sensor_msgs/CompressedImage back_left
4 | sensor_msgs/CompressedImage back_right
5 | sensor_msgs/CompressedImage front_left
6 | sensor_msgs/CompressedImage front_right
--------------------------------------------------------------------------------
/docs/README.md:
--------------------------------------------------------------------------------
1 | All files in this folder are auto-generated by tooling. Contrary to the function suggested by the name 'docs', this folder is in fact a collection of static web pages that serves up a bazel central registry. There is an action on this repo that is configured to serve the files from this directory as a website.
--------------------------------------------------------------------------------
/docs/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
9 | Page Redirection
10 |
11 |
12 |
13 | If you are not redirected automatically, follow this link to example.
14 |
15 |
--------------------------------------------------------------------------------
/src/example_ros.py:
--------------------------------------------------------------------------------
1 | # Copyright 2025 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 | from sensor_msgs.msg import CompressedImage
16 |
17 | if __name__ == '__main__':
18 | msg = CompressedImage()
19 | print(msg)
20 |
--------------------------------------------------------------------------------
/src/example_ros.cc:
--------------------------------------------------------------------------------
1 | // Copyright 2025 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 | #include "sensor_msgs/msg/compressed_image.hpp"
16 |
17 | int main(int arg, char* argv[]) {
18 | sensor_msgs::msg::CompressedImage msg;
19 | return 0;
20 | }
--------------------------------------------------------------------------------
/src/example_proto.cc:
--------------------------------------------------------------------------------
1 | // Copyright 2025 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 | #include "sensor_msgs/msg/CompressedImage.pb.h"
16 |
17 | int main(int arg, char* argv[]) {
18 | sensor_msgs::msg::pb::CompressedImage msg;
19 | return 0;
20 | }
--------------------------------------------------------------------------------
/src/example_ros.c:
--------------------------------------------------------------------------------
1 | // Copyright 2025 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 | #include
16 |
17 | #include "sensor_msgs/msg/detail/compressed_image__struct.h"
18 | #include "sensor_msgs/msg/detail/compressed_image__functions.h"
19 |
20 |
21 | int main(int arg, char* argv[]) {
22 | sensor_msgs__msg__CompressedImage *msg = sensor_msgs__msg__CompressedImage__create();
23 | sensor_msgs__msg__CompressedImage__destroy(msg);
24 | return 0;
25 | }
--------------------------------------------------------------------------------
/example/msg/BUILD.bazel:
--------------------------------------------------------------------------------
1 | # Copyright 2025 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 | load("@rosidl_cmake//:rules.bzl", "ros_interface")
16 |
17 | package(default_visibility = ["//visibility:public"])
18 |
19 | # Interfaces - note that the interface we are declaring here relies on
20 | # subfields from two other ros packages. These must be imported in the
21 | # MODULES.bazel file for this to work.
22 |
23 | ros_interface(
24 | name = "ExampleMessage",
25 | src = "ExampleMessage.msg",
26 | deps = [
27 | "@sensor_msgs//msg:CompressedImage",
28 | "@std_msgs//msg:String",
29 | ],
30 | )
31 |
--------------------------------------------------------------------------------
/tools/BUILD.bazel:
--------------------------------------------------------------------------------
1 | # Copyright 2025 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 | load("@rules_python//python:defs.bzl", "py_binary")
16 |
17 | package(default_visibility = ["//visibility:public"])
18 |
19 | py_binary(
20 | name = "regenerate_modules",
21 | srcs = ["registry_scraper_tool.py"],
22 | main = "registry_scraper_tool.py",
23 | data = [
24 | "registry_scraper_data.yaml"
25 | ],
26 | deps = [
27 | "@rules_python//python/runfiles",
28 | "@rosdistro//bazel/python:gitpython",
29 | "@rosdistro//bazel/python:pyyaml",
30 | "@rosdistro//bazel/python:urllib3",
31 | ]
32 | )
33 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | # Copyright 2025 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 | # Our container inherits from the smallest Ubuntu 24.04 footprint.
16 | FROM ubuntu:24.04@sha256:278628f08d4979fb9af9ead44277dbc9c92c2465922310916ad0c46ec9999295
17 |
18 | # Install baseline tools that are needed to build code and run tests.
19 | RUN apt-get update \
20 | && apt-get install -y --no-install-recommends \
21 | automake \
22 | autoconf \
23 | libtool \
24 | python3 \
25 | sudo \
26 | valgrind \
27 | && sudo rm -rf /var/lib/apt/lists/*
28 |
--------------------------------------------------------------------------------
/src/example_ros_subscriber.cc:
--------------------------------------------------------------------------------
1 | // Copyright 2025 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 | #include
16 |
17 | #include "rclcpp/rclcpp.hpp"
18 | #include "std_msgs/msg/string.hpp"
19 |
20 | class MinimalSubscriber : public rclcpp::Node
21 | {
22 | public:
23 | MinimalSubscriber()
24 | : Node("minimal_subscriber")
25 | {
26 | auto topic_callback =
27 | [this](std_msgs::msg::String::UniquePtr msg) -> void {
28 | RCLCPP_INFO(this->get_logger(), "I heard: '%s'", msg->data.c_str());
29 | };
30 | subscription_ =
31 | this->create_subscription("topic", 10, topic_callback);
32 | }
33 |
34 | private:
35 | rclcpp::Subscription::SharedPtr subscription_;
36 | };
37 |
38 | int main(int argc, char * argv[])
39 | {
40 | rclcpp::init(argc, argv);
41 | rclcpp::spin(std::make_shared());
42 | rclcpp::shutdown();
43 | return 0;
44 | }
--------------------------------------------------------------------------------
/example/ros/example_ros_subscriber.cc:
--------------------------------------------------------------------------------
1 | // Copyright 2025 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 | #include
16 |
17 | #include "rclcpp/rclcpp.hpp"
18 |
19 | #include "example/msg/example_message.hpp"
20 |
21 | class ExampleRosSubscriber : public rclcpp::Node
22 | {
23 | public:
24 | ExampleRosSubscriber()
25 | : Node("example_ros_subscriber")
26 | {
27 | auto topic_callback =
28 | [this](example::msg::ExampleMessage::UniquePtr msg) -> void {
29 | RCLCPP_INFO(this->get_logger(), "I heard: '%s'", msg->message.data.c_str());
30 | };
31 | subscription_ =
32 | this->create_subscription("topic", 10, topic_callback);
33 | }
34 |
35 | private:
36 | rclcpp::Subscription::SharedPtr subscription_;
37 | };
38 |
39 | int main(int argc, char * argv[])
40 | {
41 | rclcpp::init(argc, argv);
42 | rclcpp::spin(std::make_shared());
43 | rclcpp::shutdown();
44 | return 0;
45 | }
--------------------------------------------------------------------------------
/src/example_ros_proto_subscriber.cc:
--------------------------------------------------------------------------------
1 | // Copyright 2025 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 | #include
16 |
17 | #include "rclcpp/rclcpp.hpp"
18 | #include "sensor_msgs/msg/compressed_image__typeadapter_protobuf_cpp.hpp"
19 |
20 | class MinimalSubscriber : public rclcpp::Node
21 | {
22 | public:
23 | MinimalSubscriber()
24 | : Node("minimal_subscriber")
25 | {
26 | auto topic_callback =
27 | [this](const sensor_msgs::msg::pb::CompressedImage & msg) -> void {
28 | RCLCPP_INFO(this->get_logger(), "Received protobuf message");
29 | };
30 | subscription_ =
31 | this->create_subscription("topic", 10, topic_callback);
32 | }
33 |
34 | private:
35 | rclcpp::Subscription::SharedPtr subscription_;
36 | };
37 |
38 | int main(int argc, char * argv[])
39 | {
40 | rclcpp::init(argc, argv);
41 | rclcpp::spin(std::make_shared());
42 | rclcpp::shutdown();
43 | return 0;
44 | }
--------------------------------------------------------------------------------
/example/proto/example_proto_subscriber.cc:
--------------------------------------------------------------------------------
1 | // Copyright 2025 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 | #include
16 |
17 | #include "rclcpp/rclcpp.hpp"
18 |
19 | #include "example/msg/example_message__typeadapter_protobuf_cpp.hpp"
20 |
21 | class ExampleProtoSubscriber : public rclcpp::Node
22 | {
23 | public:
24 | ExampleProtoSubscriber(): Node("example_proto_subscriber")
25 | {
26 | auto topic_callback =
27 | [this](const example::msg::pb::ExampleMessage & msg) -> void {
28 | RCLCPP_INFO(this->get_logger(), "Received protobuf message");
29 | };
30 | subscription_ =
31 | this->create_subscription("topic", 10, topic_callback);
32 | }
33 |
34 | private:
35 | rclcpp::Subscription::SharedPtr subscription_;
36 | };
37 |
38 | int main(int argc, char * argv[])
39 | {
40 | rclcpp::init(argc, argv);
41 | rclcpp::spin(std::make_shared());
42 | rclcpp::shutdown();
43 | return 0;
44 | }
--------------------------------------------------------------------------------
/.github/workflows/build-test-macos-amd64.yml:
--------------------------------------------------------------------------------
1 | # Copyright 2025 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 | name: build-test-macos-amd64
16 | run-name: ${{ github.actor }} tests code against a macos amd64 platform.
17 | on:
18 | push:
19 | branches:
20 | - main
21 | pull_request:
22 | branches:
23 | - main
24 | permissions:
25 | contents: read
26 | actions: read
27 | checks: write
28 | jobs:
29 | checkout-setup-build-test:
30 | runs-on: macos-15-intel
31 | steps:
32 |
33 | # Checkout this repository and all submodules.
34 | - name: Checkout repository and submodules
35 | uses: actions/checkout@v4
36 | with:
37 | submodules: recursive
38 |
39 | # Setup bazel as a tool for building.
40 | - name: Setup Bazel
41 | uses: bazel-contrib/setup-bazel@0.15.0
42 | with:
43 | bazelisk-cache: false
44 | disk-cache: ${{ github.workflow }}
45 | repository-cache: false
46 |
47 | # Build the ROS examples.
48 | - name: Run build
49 | run: bazel build //...
50 |
51 | # Test the distribution.
52 | - name: Run tests
53 | run: bazel test --config=distribution --test_output=all
--------------------------------------------------------------------------------
/.github/workflows/build-test-macos-arm64.yml:
--------------------------------------------------------------------------------
1 | # Copyright 2025 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 | name: build-test-macos-arm64
16 | run-name: ${{ github.actor }} tests code against a macos arm64 platform.
17 | on:
18 | push:
19 | branches:
20 | - main
21 | pull_request:
22 | branches:
23 | - main
24 | permissions:
25 | contents: read
26 | actions: read
27 | checks: write
28 | jobs:
29 | checkout-setup-build-test:
30 | runs-on: macos-15
31 | steps:
32 |
33 | # Checkout this repository and all submodules.
34 | - name: Checkout repository and submodules
35 | uses: actions/checkout@v4
36 | with:
37 | submodules: recursive
38 |
39 | # Setup bazel as a tool for building.
40 | - name: Setup Bazel
41 | uses: bazel-contrib/setup-bazel@0.15.0
42 | with:
43 | bazelisk-cache: false
44 | disk-cache: ${{ github.workflow }}
45 | repository-cache: false
46 |
47 | # Build the ROS examples.
48 | - name: Run build
49 | run: bazel build //...
50 |
51 | # Test the distribution.
52 | - name: Run tests
53 | run: bazel test --config=distribution --test_output=all
54 |
--------------------------------------------------------------------------------
/.github/workflows/build-test-windows-amd64.yml:
--------------------------------------------------------------------------------
1 | # Copyright 2025 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 | name: build-test-windows-amd64
16 | run-name: ${{ github.actor }} tests code against a windows amd64 platform.
17 | on:
18 | push:
19 | branches:
20 | - main
21 | pull_request:
22 | branches:
23 | - main
24 | permissions:
25 | contents: read
26 | actions: read
27 | checks: write
28 | jobs:
29 | checkout-setup-build-test:
30 | runs-on: windows-2025
31 | steps:
32 |
33 | # Checkout this repository and all submodules.
34 | - name: Checkout repository and submodules
35 | uses: actions/checkout@v4
36 | with:
37 | submodules: recursive
38 |
39 | # Setup bazel as a tool for building.
40 | - name: Setup Bazel
41 | uses: bazel-contrib/setup-bazel@0.15.0
42 | with:
43 | bazelisk-cache: false
44 | disk-cache: ${{ github.workflow }}
45 | repository-cache: false
46 |
47 | # Build the ROS examples.
48 | - name: Run build
49 | run: bazel build //...
50 |
51 | # Test the distribution.
52 | - name: Run tests
53 | run: bazel test --config=distribution --test_output=all
54 |
--------------------------------------------------------------------------------
/.github/workflows/build-test-windows-arm64.yml:
--------------------------------------------------------------------------------
1 | # Copyright 2025 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 | name: build-test-windows-arm64
16 | run-name: ${{ github.actor }} tests code against a windows arm64 platform.
17 | on:
18 | push:
19 | branches:
20 | - main
21 | pull_request:
22 | branches:
23 | - main
24 | permissions:
25 | contents: read
26 | actions: read
27 | checks: write
28 | jobs:
29 | checkout-setup-build-test:
30 | runs-on: windows-11-arm
31 | steps:
32 |
33 | # Checkout this repository and all submodules.
34 | - name: Checkout repository and submodules
35 | uses: actions/checkout@v4
36 | with:
37 | submodules: recursive
38 |
39 | # Setup bazel as a tool for building.
40 | - name: Setup Bazel
41 | uses: bazel-contrib/setup-bazel@0.15.0
42 | with:
43 | bazelisk-cache: false
44 | disk-cache: ${{ github.workflow }}
45 | repository-cache: false
46 |
47 | # Build the ROS examples.
48 | - name: Run build
49 | run: bazel build //...
50 |
51 | # Test the distribution.
52 | - name: Run tests
53 | run: bazel test --config=distribution --test_output=all
54 |
--------------------------------------------------------------------------------
/src/example_ros_proto_publisher.cc:
--------------------------------------------------------------------------------
1 | // Copyright 2025 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 | #include
16 | #include
17 | #include
18 |
19 | #include "rclcpp/rclcpp.hpp"
20 | #include "sensor_msgs/msg/compressed_image__typeadapter_protobuf_cpp.hpp"
21 |
22 | using namespace std::chrono_literals;
23 |
24 | class MinimalPublisher : public rclcpp::Node {
25 | public:
26 | MinimalPublisher() : Node("minimal_proto_publisher") {
27 | publisher_ = this->create_publisher("topic", 10);
28 | auto timer_callback =
29 | [this]() -> void {
30 | auto message = sensor_msgs::msg::pb::CompressedImage();
31 | RCLCPP_INFO(this->get_logger(), "Published protbuf message");
32 | this->publisher_->publish(message);
33 | };
34 | timer_ = this->create_wall_timer(1s, timer_callback);
35 | }
36 |
37 | private:
38 | rclcpp::TimerBase::SharedPtr timer_;
39 | rclcpp::Publisher::SharedPtr publisher_;
40 | };
41 |
42 | int main(int argc, char * argv[])
43 | {
44 | rclcpp::init(argc, argv);
45 | rclcpp::spin(std::make_shared());
46 | rclcpp::shutdown();
47 | return 0;
48 | }
--------------------------------------------------------------------------------
/example/proto/example_proto_publisher.cc:
--------------------------------------------------------------------------------
1 | // Copyright 2025 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 | #include
16 | #include
17 | #include
18 |
19 | #include "rclcpp/rclcpp.hpp"
20 |
21 | #include "example/msg/example_message__typeadapter_protobuf_cpp.hpp"
22 |
23 | using namespace std::chrono_literals;
24 |
25 | class ExampleProtoPublisher : public rclcpp::Node {
26 | public:
27 | ExampleProtoPublisher() : Node("minimal_proto_publisher") {
28 | publisher_ = this->create_publisher("topic", 10);
29 | auto timer_callback =
30 | [this]() -> void {
31 | auto message = example::msg::pb::ExampleMessage();
32 | RCLCPP_INFO(this->get_logger(), "Published protobuf message");
33 | this->publisher_->publish(message);
34 | };
35 | timer_ = this->create_wall_timer(1s, timer_callback);
36 | }
37 |
38 | private:
39 | rclcpp::TimerBase::SharedPtr timer_;
40 | rclcpp::Publisher::SharedPtr publisher_;
41 | };
42 |
43 | int main(int argc, char * argv[])
44 | {
45 | rclcpp::init(argc, argv);
46 | rclcpp::spin(std::make_shared());
47 | rclcpp::shutdown();
48 | return 0;
49 | }
--------------------------------------------------------------------------------
/example/ros/example_ros_publisher.cc:
--------------------------------------------------------------------------------
1 | // Copyright 2025 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 | #include
16 | #include
17 | #include
18 |
19 | #include "rclcpp/rclcpp.hpp"
20 |
21 | #include "example/msg/example_message.hpp"
22 |
23 | using namespace std::chrono_literals;
24 |
25 | class ExampleRosPublisher : public rclcpp::Node {
26 | public:
27 | ExampleRosPublisher() : Node("example_ros_publisher"), count_(0) {
28 | publisher_ = this->create_publisher("topic", 10);
29 | auto timer_callback =
30 | [this]() -> void {
31 | auto msg = example::msg::ExampleMessage();
32 | msg.message.data = "Hello, world! from C++ " + std::to_string(this->count_++);
33 | RCLCPP_INFO(this->get_logger(), "Published: '%s'", msg.message.data.c_str());
34 | this->publisher_->publish(msg);
35 | };
36 | timer_ = this->create_wall_timer(1s, timer_callback);
37 | }
38 |
39 | private:
40 | rclcpp::TimerBase::SharedPtr timer_;
41 | rclcpp::Publisher::SharedPtr publisher_;
42 | size_t count_;
43 | };
44 |
45 | int main(int argc, char * argv[])
46 | {
47 | rclcpp::init(argc, argv);
48 | rclcpp::spin(std::make_shared());
49 | rclcpp::shutdown();
50 | return 0;
51 | }
52 |
--------------------------------------------------------------------------------
/src/example_ros_publisher.cc:
--------------------------------------------------------------------------------
1 | // Copyright 2025 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 | #include
16 | #include
17 | #include
18 |
19 | #include "rclcpp/rclcpp.hpp"
20 | #include "std_msgs/msg/string.hpp"
21 |
22 | using namespace std::chrono_literals;
23 |
24 | /* This example creates a subclass of Node and uses a fancy C++11 lambda
25 | * function to shorten the callback syntax, at the expense of making the
26 | * code somewhat more difficult to understand at first glance. */
27 |
28 | class MinimalPublisher : public rclcpp::Node {
29 | public:
30 | MinimalPublisher() : Node("minimal_publisher"), count_(0) {
31 | publisher_ = this->create_publisher("topic", 10);
32 | auto timer_callback =
33 | [this]() -> void {
34 | auto message = std_msgs::msg::String();
35 | message.data = "Hello, world! from C++ " + std::to_string(this->count_++);
36 | RCLCPP_INFO(this->get_logger(), "Published: '%s'", message.data.c_str());
37 | this->publisher_->publish(message);
38 | };
39 | timer_ = this->create_wall_timer(1s, timer_callback);
40 | }
41 |
42 | private:
43 | rclcpp::TimerBase::SharedPtr timer_;
44 | rclcpp::Publisher::SharedPtr publisher_;
45 | size_t count_;
46 | };
47 |
48 | int main(int argc, char * argv[])
49 | {
50 | rclcpp::init(argc, argv);
51 | rclcpp::spin(std::make_shared());
52 | rclcpp::shutdown();
53 | return 0;
54 | }
--------------------------------------------------------------------------------
/example/BUILD.bazel:
--------------------------------------------------------------------------------
1 | # Copyright 2025 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 | load("@rosidl_adapter_proto//:rules.bzl", "proto_ros_library")
16 | load("@rosidl_generator_cpp//:rules.bzl", "cc_ros_library")
17 | load("@rules_cc//cc:defs.bzl", "cc_library", "cc_binary")
18 |
19 | package(default_visibility = ["//visibility:public"])
20 |
21 | # Generate .proto files for the ros_interface in ./msg/BUILD.bazel.
22 |
23 | proto_ros_library(
24 | name = "example_proto_files",
25 | deps = [
26 | "//msg:ExampleMessage",
27 | ],
28 | )
29 |
30 | # Generate C++ bindings to the ros_interface in ./msg/BUILD.bazel.
31 |
32 | cc_ros_library(
33 | name = "example_ros_cc_msgs",
34 | deps = [
35 | "//msg:ExampleMessage",
36 | ],
37 | )
38 |
39 | # C++ examples (note that cc_ros_library includes proto type support)
40 |
41 | cc_binary(
42 | name = "example_ros_publisher_cc",
43 | srcs = ["ros/example_ros_publisher.cc"],
44 | deps = [
45 | "@rclcpp",
46 | ":example_ros_cc_msgs"
47 | ],
48 | )
49 |
50 | cc_binary(
51 | name = "example_ros_subscriber_cc",
52 | srcs = ["ros/example_ros_subscriber.cc"],
53 | deps = [
54 | "@rclcpp",
55 | ":example_ros_cc_msgs"
56 | ],
57 | )
58 |
59 | # Protobuf pipeline
60 |
61 | cc_binary(
62 | name = "example_proto_publisher_cc",
63 | srcs = ["proto/example_proto_publisher.cc"],
64 | deps = [
65 | "@rclcpp",
66 | ":example_ros_cc_msgs"
67 | ],
68 | )
69 |
70 | cc_binary(
71 | name = "example_proto_subscriber_cc",
72 | srcs = ["proto/example_proto_subscriber.cc"],
73 | deps = [
74 | "@rclcpp",
75 | ":example_ros_cc_msgs"
76 | ],
77 | )
78 |
--------------------------------------------------------------------------------
/.github/workflows/deploy-gh-pages.yml:
--------------------------------------------------------------------------------
1 | # Copyright 2025 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 | name: deploy-gh-pages
16 | run-name: ${{ github.actor }} deploys documentation to GitHub Pages.
17 |
18 | # Only do this when a commit is made to the main branch.
19 | on:
20 | push:
21 | branches:
22 | - main
23 | - asymingt/trigger-the-rcr-ui-automatically # TODO remove before merge
24 |
25 | permissions:
26 | contents: write
27 |
28 | jobs:
29 | deploy-gh-pages:
30 | runs-on: ubuntu-24.04
31 | steps:
32 |
33 | # Checkout this repository and all submodules.
34 | - name: Checkout repository and submodules
35 | uses: actions/checkout@v4
36 |
37 | # Do a deep submodule initialization and update.
38 | - name: Initialize and update submodules
39 | run: git submodule update --init --recursive
40 |
41 | # Setup bazel as a tool for building.
42 | - name: Setup Bazel
43 | uses: bazel-contrib/setup-bazel@0.15.0
44 | with:
45 | bazelisk-cache: true
46 | disk-cache: ${{ github.workflow }}
47 | repository-cache: false
48 |
49 | # Regenerate the bazel module pages
50 | - name: Regenerate module pages
51 | run: bazel run //tools:regenerate_modules -- $PWD
52 |
53 | # Deploy the documentation to GitHub Pages.
54 | - name: Deploy to github pages
55 | uses: JamesIves/github-pages-deploy-action@v4
56 | with:
57 | folder: docs
58 |
59 | # Notify the RCR-UI that it needs to regenerate its pages.
60 | - name: Notify the RCR-UI that an update is needed
61 | uses: peter-evans/repository-dispatch@v4
62 | with:
63 | token: ${{ secrets.RCR_UI_PAT_TOKEN }}
64 | repository: intrinsic-opensource/rcr-ui
65 | event-type: on-rcr-trigger
66 |
--------------------------------------------------------------------------------
/example/.bazelrc:
--------------------------------------------------------------------------------
1 | # Copyright 2025 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 | # Add the ROS Central Registry (RCR) to our list of remote modules. We
16 | # also make sure to include the Bazel Central Registry here too!
17 | common --registry=https://intrinsic-opensource.github.io/ros-central-registry \
18 | --registry=https://bcr.bazel.build
19 |
20 | # Don't allow tests to access the network by default.
21 | test --sandbox_default_allow_network=false
22 |
23 | # Set ROS_HOME in a test context to something that is writable.
24 | test --test_env=ROS_HOME=$$TEST_UNDECLARED_OUTPUTS_DIR
25 |
26 | # Use C++17 standard by default across the whole repo.
27 | build --cxxopt="-std=c++17"
28 |
29 | # Ensure that we use toolchains_llvm instead of the host toolchain.
30 | build --action_env="BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1"
31 |
32 | # Force Bazel to use an environment with a static value for PATH, and not to
33 | # use the LD_LIBRARY_PATH. This makes builds robust to terminal refreshes.
34 | build --incompatible_strict_action_env
35 |
36 | # Build configuration for RMW implementations
37 | # --@rmw_implementation//:rmw=rmw_cyclonedds_cpp
38 | # --@rmw_implementation//:rmw=rmw_fastrtps_cpp
39 | # --@rmw_implementation//:rmw=rmw_fastrtps_dynamic_cpp
40 | # --@rmw_implementation//:rmw=rmw_zenoh_cpp
41 | build --@rmw_implementation//:rmw=rmw_fastrtps_cpp
42 |
43 | # ASAN
44 | build:asan --strip=never
45 | build:asan --copt=-fsanitize=address
46 | build:asan --copt=-O0
47 | build:asan --copt=-fno-omit-frame-pointer
48 | build:asan --linkopt=-fsanitize=address
49 |
50 | # MSAN
51 | build:msan --strip=never
52 | build:msan --copt=-fsanitize=memory
53 | build:msan --copt=-O0
54 | build:msan --copt=-fno-omit-frame-pointer
55 | build:msan --linkopt=-fsanitize=memory
56 |
57 | # TSAN
58 | build:tsan --strip=never
59 | build:tsan --copt=-fsanitize=thread
60 | build:tsan --copt=-O0
61 | build:tsan --copt=-fno-omit-frame-pointer
62 | build:tsan --linkopt=-fsanitize=thread
63 |
--------------------------------------------------------------------------------
/.github/workflows/build-test-linux-amd64.yml:
--------------------------------------------------------------------------------
1 | # Copyright 2025 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 | name: build-test-linux-amd64
16 | run-name: ${{ github.actor }} tests code against a linux amd64 platform.
17 | on:
18 | push:
19 | branches:
20 | - main
21 | pull_request:
22 | branches:
23 | - main
24 | permissions:
25 | contents: read
26 | actions: read
27 | checks: write
28 | jobs:
29 | checkout-setup-build-test:
30 | runs-on: ubuntu-24.04
31 | steps:
32 |
33 | # Remove unnecessary files to maximize build space.
34 | - name: Free disk space
35 | uses: jlumbroso/free-disk-space@v1.3.1
36 | with:
37 | tool-cache: true
38 | android: true
39 | dotnet: true
40 | haskell: true
41 | large-packages: true
42 | docker-images: true
43 | swap-storage: true
44 |
45 | # Checkout this repository and all submodules.
46 | - name: Checkout repository and submodules
47 | uses: actions/checkout@v4
48 | with:
49 | submodules: recursive
50 |
51 | # Setup bazel as a tool for building.
52 | - name: Setup Bazel
53 | uses: bazel-contrib/setup-bazel@0.15.0
54 | with:
55 | bazelisk-cache: true
56 | disk-cache: ${{ github.workflow }}
57 | repository-cache: false
58 |
59 | # Build the container image.
60 | - name: Build test container
61 | run: docker build -t ros-central-registry:24.04 .
62 |
63 | # Build the ROS examples.
64 | - name: Build code
65 | run: bazel build --config=distribution
66 |
67 | # Test the distribution.
68 | - name: Run tests
69 | run: bazel test --config=distribution
70 |
71 | # Summarize the results.
72 | - name: Test report
73 | uses: dorny/test-reporter@v2
74 | with:
75 | name: Bazel tests
76 | path: bazel-testlogs/**/test.xml
77 | reporter: java-junit
78 | if: always()
79 |
80 | # Upload test test logs
81 | - name: Upload test logs
82 | uses: actions/upload-artifact@v4
83 | with:
84 | name: Test Logs - Linux AMD64
85 | path: "bazel-testlogs/**/test.log"
86 | if: always()
87 |
--------------------------------------------------------------------------------
/.github/workflows/build-test-linux-arm64.yml:
--------------------------------------------------------------------------------
1 | # Copyright 2025 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 | name: build-test-linux-arm64
16 | run-name: ${{ github.actor }} tests code against a linux arm64 platform.
17 | on:
18 | push:
19 | branches:
20 | - main
21 | pull_request:
22 | branches:
23 | - main
24 | permissions:
25 | contents: read
26 | actions: read
27 | checks: write
28 | jobs:
29 | checkout-setup-build-test:
30 | runs-on: ubuntu-24.04-arm
31 | steps:
32 |
33 | # Remove unnecessary files to maximize build space.
34 | - name: Free disk space
35 | uses: jlumbroso/free-disk-space@v1.3.1
36 | with:
37 | tool-cache: true
38 | android: true
39 | dotnet: true
40 | haskell: true
41 | large-packages: true
42 | docker-images: true
43 | swap-storage: true
44 |
45 | # Checkout this repository and all submodules.
46 | - name: Checkout repository and submodules
47 | uses: actions/checkout@v4
48 | with:
49 | submodules: recursive
50 | fetch-depth: 1
51 |
52 | # Setup bazel as a tool for building.
53 | - name: Setup Bazel
54 | uses: bazel-contrib/setup-bazel@0.15.0
55 | with:
56 | bazelisk-cache: true
57 | disk-cache: ${{ github.workflow }}
58 | repository-cache: false
59 |
60 | # Build the container image.
61 | - name: Build test container
62 | run: docker build -t ros-central-registry:24.04 .
63 |
64 | # Build the ROS examples.
65 | - name: Build code
66 | run: bazel build --config=distribution
67 |
68 | # Test the distribution.
69 | - name: Run tests
70 | run: bazel test --config=distribution
71 |
72 | # Summarize the results.
73 | - name: Test report
74 | uses: dorny/test-reporter@v2
75 | with:
76 | name: Bazel tests
77 | path: bazel-testlogs/**/test.xml
78 | reporter: java-junit
79 | if: always()
80 |
81 | # Upload test test logs
82 | - name: Upload test logs
83 | uses: actions/upload-artifact@v4
84 | with:
85 | name: Test Logs - Linux ARM64
86 | path: "bazel-testlogs/**/test.log"
87 | if: always()
88 |
--------------------------------------------------------------------------------
/example/MODULE.bazel:
--------------------------------------------------------------------------------
1 | # Copyright 2025 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 | # Every ROS package must be a module for the IDL generation to work!
16 | # This is because any ros_interface or ros_data rules need a package
17 | # name in order to create a destination output folder.
18 |
19 | module(
20 | name = "example",
21 | version = "0.0.1",
22 | compatibility_level = 0,
23 | )
24 |
25 | # From the BCR -- these are found here: https://registry.bazel.build. These
26 | # are the minimal set of general modules needed for a functional workspace.
27 |
28 | bazel_dep(name = "protobuf", version = "32.0")
29 | bazel_dep(name = "rules_cc", version = "0.2.4")
30 | bazel_dep(name = "rules_python", version = "1.6.1")
31 | bazel_dep(name = "rules_rust", version = "0.64.0")
32 | bazel_dep(name = "toolchains_llvm", version = "1.5.0")
33 |
34 | # From the RCR - right now you need to use a compatible set of versioned
35 | # packages from a ROS release. In future we might use module-rules to
36 | # lazily-load a compatible collection from a @ros metapackage.
37 |
38 | bazel_dep(name = "rclcpp", version = "30.0.0")
39 | bazel_dep(name = "rmw_implementation", version = "3.1.1")
40 | bazel_dep(name = "rmw_zenoh_cpp", version = "0.8.1")
41 | bazel_dep(name = "rosidl_adapter_proto", version = "0.0.1")
42 | bazel_dep(name = "rosidl_cmake", version = "5.0.0")
43 | bazel_dep(name = "rosidl_generator_cpp", version = "5.0.0")
44 | bazel_dep(name = "sensor_msgs", version = "5.8.1")
45 | bazel_dep(name = "std_msgs", version = "5.8.1")
46 | bazel_dep(name = "zenoh-c", version = "1.4.0")
47 | bazel_dep(name = "zenoh-cpp", version = "1.4.0")
48 |
49 | # A lot of the tooling for IDL generation requires a Python 3.12 toolchain
50 | # to work. You need to configure your workspace correctly to provide one.
51 |
52 | python = use_extension("@rules_python//python/extensions:python.bzl", "python")
53 | python.toolchain(
54 | python_version = "3.12",
55 | is_default = True,
56 | )
57 |
58 | # Having a self-contained C++ toolchain prevents bazel from polling PATH
59 | # for a compiler, making the builds less reliant on the host environment.
60 |
61 | llvm = use_extension("@toolchains_llvm//toolchain/extensions:llvm.bzl", "llvm")
62 | llvm.toolchain(llvm_version = "20.1.7")
63 | use_repo(llvm, "llvm_toolchain")
64 | register_toolchains("@llvm_toolchain//:all")
65 |
--------------------------------------------------------------------------------
/.bazelrc:
--------------------------------------------------------------------------------
1 | # Copyright 2025 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 | # Augment the BCR with a few of our own modules in the docs folder.
16 | common --registry=file:///%workspace%/docs --registry=https://bcr.bazel.build
17 |
18 | # Define ROS_HOME so that tests don't try and write to ~/.ros_home by default.
19 | common --test_env=ROS_HOME=$$TEST_UNDECLARED_OUTPUTS_DIR
20 |
21 | # Don't allow tests to access the network by default.
22 | test --sandbox_default_allow_network=false
23 |
24 | # Use C++17 standard by default across the whole repo.
25 | build --cxxopt="-std=c++17"
26 |
27 | # Ensure that we use toolchains_llvm instead of the host toolchain.
28 | build --action_env="BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1"
29 |
30 | # Force Bazel to use an environment with a static value for PATH, and not to
31 | # use the LD_LIBRARY_PATH. This makes builds robust to terminal refreshes.
32 | build --incompatible_strict_action_env
33 |
34 | # Build configuration for RMW implementations.
35 | # --@rmw_implementation//:rmw=rmw_cyclonedds_cpp
36 | # --@rmw_implementation//:rmw=rmw_fastrtps_cpp
37 | # --@rmw_implementation//:rmw=rmw_fastrtps_dynamic_cpp
38 | # --@rmw_implementation//:rmw=rmw_zenoh_cpp
39 | build --@rmw_implementation//:rmw=rmw_fastrtps_cpp
40 |
41 | # ASAN
42 | build:asan --strip=never
43 | build:asan --copt=-fsanitize=address
44 | build:asan --copt=-O0
45 | build:asan --copt=-fno-omit-frame-pointer
46 | build:asan --linkopt=-fsanitize=address
47 |
48 | # MSAN
49 | build:msan --strip=never
50 | build:msan --copt=-fsanitize=memory
51 | build:msan --copt=-O0
52 | build:msan --copt=-fno-omit-frame-pointer
53 | build:msan --linkopt=-fsanitize=memory
54 |
55 | # TSAN
56 | build:tsan --strip=never
57 | build:tsan --copt=-fsanitize=thread
58 | build:tsan --copt=-O0
59 | build:tsan --copt=-fno-omit-frame-pointer
60 | build:tsan --linkopt=-fsanitize=thread
61 |
62 | # Helper for building and testing all modules in the workspace.
63 | build:distribution --target_pattern_file=distribution.txt
64 |
65 | # Run distribution tests in a container to make sure that those tests that
66 | # use network and shared memory are isolated from each other.
67 | test:distribution --target_pattern_file=distribution.txt
68 | test:distribution --spawn_strategy docker
69 | test:distribution --experimental_enable_docker_sandbox
70 | test:distribution --experimental_docker_image=ros-central-registry:24.04
71 |
--------------------------------------------------------------------------------
/src/example_ros_publisher.c:
--------------------------------------------------------------------------------
1 | // Copyright 2025 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 | #include
16 | #include // For sleep()
17 |
18 | #include "rcl/rcl.h"
19 | #include "rcl/error_handling.h"
20 | #include "rcl/node.h"
21 | #include "rosidl_runtime_c/string_functions.h"
22 | #include "std_msgs/msg/string.h"
23 |
24 | // Helper function to check return codes and print errors
25 | void check_ret(rcl_ret_t ret, const char * msg) {
26 | if (ret != RCL_RET_OK) {
27 | fprintf(stderr, "Error at %s: %s\n", msg, rcl_get_error_string().str);
28 | // Optional: exit or handle the error appropriately
29 | }
30 | }
31 |
32 | int main(int argc, const char * const* argv) {
33 | rcl_ret_t ret;
34 |
35 | // 1. Initialize RCL context and allocator
36 | rcl_init_options_t init_options = rcl_get_zero_initialized_init_options();
37 | ret = rcl_init_options_init(&init_options, rcl_get_default_allocator());
38 | check_ret(ret, "rcl_init_options_init");
39 |
40 | rcl_context_t context = rcl_get_zero_initialized_context();
41 | ret = rcl_init(argc, argv, &init_options, &context);
42 | check_ret(ret, "rcl_init");
43 |
44 | // 2. Create the Node
45 | rcl_node_t node = rcl_get_zero_initialized_node();
46 | rcl_node_options_t node_options = rcl_node_get_default_options();
47 | ret = rcl_node_init(&node, "minimal_c_node", "", &context, &node_options);
48 | check_ret(ret, "rcl_node_init");
49 |
50 | printf("Node created: %s\n", rcl_node_get_name(&node));
51 |
52 | // 3. Create a Publisher
53 | const char * topic_name = "chatter";
54 | const rosidl_message_type_support_t * type_support = ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, String);
55 |
56 | rcl_publisher_t publisher = rcl_get_zero_initialized_publisher();
57 | rcl_publisher_options_t publisher_options = rcl_publisher_get_default_options();
58 |
59 | ret = rcl_publisher_init(&publisher, &node, type_support, topic_name, &publisher_options);
60 | check_ret(ret, "rcl_publisher_init");
61 |
62 | // 4. Create and publish messages in a loop
63 | std_msgs__msg__String msg;
64 | std_msgs__msg__String__init(&msg);
65 | const char * hello_world_str = "Hello, world! from C";
66 | // Allocate and copy string data
67 | rosidl_runtime_c__String__assign(&msg.data, hello_world_str);
68 |
69 | int count = 0;
70 | while (rcl_context_is_valid(&context)) {
71 | char buffer[100];
72 | snprintf(buffer, sizeof(buffer), "%s %d", hello_world_str, count++);
73 | rosidl_runtime_c__String__assign(&msg.data, buffer);
74 |
75 | ret = rcl_publish(&publisher, &msg, NULL);
76 | check_ret(ret, "rcl_publish");
77 |
78 | printf("Published: '%s'\n", msg.data.data);
79 | sleep(1); // Sleep for 1 second
80 | }
81 |
82 | // 5. Cleanup and Shutdown
83 | printf("Cleaning up...\n");
84 | std_msgs__msg__String__fini(&msg);
85 | ret = rcl_publisher_fini(&publisher, &node);
86 | check_ret(ret, "rcl_publisher_fini");
87 | ret = rcl_node_fini(&node);
88 | check_ret(ret, "rcl_node_fini");
89 | ret = rcl_shutdown(&context);
90 | check_ret(ret, "rcl_shutdown");
91 | ret = rcl_init_options_fini(&init_options);
92 | check_ret(ret, "rcl_init_options_fini");
93 |
94 | return 0;
95 | }
--------------------------------------------------------------------------------
/src/example_ros_subscriber.c:
--------------------------------------------------------------------------------
1 | // Copyright 2025 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 | #include
16 |
17 | #include "rcl/rcl.h"
18 | #include "rcl/error_handling.h"
19 | #include "rcl/node.h"
20 | #include "rcl/subscription.h"
21 | #include "rcl/wait.h"
22 | #include "std_msgs/msg/string.h"
23 | #include "rosidl_runtime_c/string_functions.h"
24 |
25 | // Helper function to check return codes and print errors
26 | void check_ret(rcl_ret_t ret, const char * msg) {
27 | if (ret != RCL_RET_OK) {
28 | fprintf(stderr, "Error at %s: %s\n", msg, rcl_get_error_string().str);
29 | // In a real application, you might want more robust error handling
30 | }
31 | }
32 |
33 | int main(int argc, const char * const* argv) {
34 | rcl_ret_t ret;
35 |
36 | // 1. Initialize RCL context and allocator
37 | rcl_init_options_t init_options = rcl_get_zero_initialized_init_options();
38 | ret = rcl_init_options_init(&init_options, rcl_get_default_allocator());
39 | check_ret(ret, "rcl_init_options_init");
40 |
41 | rcl_context_t context = rcl_get_zero_initialized_context();
42 | ret = rcl_init(argc, argv, &init_options, &context);
43 | check_ret(ret, "rcl_init");
44 |
45 | // 2. Create the Node
46 | rcl_node_t node = rcl_get_zero_initialized_node();
47 | rcl_node_options_t node_options = rcl_node_get_default_options();
48 | ret = rcl_node_init(&node, "minimal_c_subscriber", "", &context, &node_options);
49 | check_ret(ret, "rcl_node_init");
50 |
51 | printf("Node created: %s\n", rcl_node_get_name(&node));
52 |
53 | // 3. Create a Subscriber
54 | const char * topic_name = "chatter";
55 | const rosidl_message_type_support_t * type_support = ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, String);
56 |
57 | rcl_subscription_t subscriber = rcl_get_zero_initialized_subscription();
58 | rcl_subscription_options_t subscription_options = rcl_subscription_get_default_options();
59 |
60 | ret = rcl_subscription_init(&subscriber, &node, type_support, topic_name, &subscription_options);
61 | check_ret(ret, "rcl_subscription_init");
62 | printf("Subscriber created for topic '%s'\n", topic_name);
63 |
64 |
65 | // 4. Create a Wait Set to wait for messages
66 | rcl_wait_set_t wait_set = rcl_get_zero_initialized_wait_set();
67 | // Initialize with 1 subscription, and 0 of everything else.
68 | ret = rcl_wait_set_init(&wait_set, 1, 0, 0, 0, 0, 0, &context, rcl_get_default_allocator());
69 | check_ret(ret, "rcl_wait_set_init");
70 |
71 | // 5. Main loop to wait for and process messages
72 | printf("Listening for messages...\n");
73 | while (rcl_context_is_valid(&context)) {
74 | // Clear the wait set
75 | ret = rcl_wait_set_clear(&wait_set);
76 | check_ret(ret, "rcl_wait_set_clear");
77 |
78 | // Add the subscription to the wait set
79 | size_t index;
80 | ret = rcl_wait_set_add_subscription(&wait_set, &subscriber, &index);
81 | check_ret(ret, "rcl_wait_set_add_subscription");
82 |
83 | // Wait for a new message to arrive (blocking call)
84 | // A timeout of 1 second is used here.
85 | ret = rcl_wait(&wait_set, RCL_MS_TO_NS(1000));
86 |
87 | if (ret == RCL_RET_TIMEOUT) {
88 | // If timeout, just continue the loop
89 | continue;
90 | }
91 | check_ret(ret, "rcl_wait");
92 |
93 | // Check if our subscription has received a message
94 | if (wait_set.subscriptions[0]) {
95 | std_msgs__msg__String msg;
96 | std_msgs__msg__String__init(&msg);
97 |
98 | rmw_message_info_t message_info; // Not used, but required by rcl_take
99 |
100 | ret = rcl_take(&subscriber, &msg, &message_info, NULL);
101 |
102 | if (ret == RCL_RET_OK) {
103 | printf("I heard: '%s'\n", msg.data.data);
104 | } else if (ret != RCL_RET_SUBSCRIPTION_TAKE_FAILED) {
105 | // This error means no message was available, which can happen.
106 | // Other errors are more serious and should be checked.
107 | check_ret(ret, "rcl_take");
108 | }
109 |
110 | // Clean up the message memory
111 | std_msgs__msg__String__fini(&msg);
112 | }
113 | }
114 |
115 | // 6. Cleanup and Shutdown
116 | printf("Cleaning up...\n");
117 | ret = rcl_subscription_fini(&subscriber, &node);
118 | check_ret(ret, "rcl_subscription_fini");
119 | ret = rcl_wait_set_fini(&wait_set);
120 | check_ret(ret, "rcl_wait_set_fini");
121 | ret = rcl_node_fini(&node);
122 | check_ret(ret, "rcl_node_fini");
123 | ret = rcl_shutdown(&context);
124 | check_ret(ret, "rcl_shutdown");
125 | ret = rcl_init_options_fini(&init_options);
126 | check_ret(ret, "rcl_init_options_fini");
127 |
128 | return 0;
129 | }
130 |
--------------------------------------------------------------------------------
/BUILD.bazel:
--------------------------------------------------------------------------------
1 | # Copyright 2025 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 | load("@protobuf//bazel:cc_proto_library.bzl", "cc_proto_library")
16 | load("@rosidl_adapter//:rules.bzl", "idl_ros_library")
17 | load("@rosidl_adapter_proto//:rules.bzl", "proto_ros_library")
18 | load("@rosidl_generator_c//:rules.bzl", "c_ros_library")
19 | load("@rosidl_generator_cpp//:rules.bzl", "cc_ros_library")
20 | load("@rosidl_generator_py//:rules.bzl", "py_ros_library")
21 | load("@rosidl_generator_type_description//:rules.bzl", "type_description_ros_library")
22 | load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
23 | load("@rules_python//python:defs.bzl", "py_binary")
24 |
25 | package(default_visibility = ["//visibility:public"])
26 |
27 | # Intermediary artifact examples
28 |
29 | idl_ros_library(
30 | name = "example_ros_idl",
31 | deps = [
32 | "@geometry_msgs//msg:PoseStamped",
33 | "@ros2cli_test_interfaces//action:ShortVariedMultiNested",
34 | "@ros2cli_test_interfaces//msg:ShortVariedMultiNested",
35 | "@ros2cli_test_interfaces//srv:ShortVariedMultiNested",
36 | "@std_msgs//msg:String",
37 | ],
38 | )
39 |
40 | type_description_ros_library(
41 | name = "example_ros_type_description",
42 | deps = [
43 | "@geometry_msgs//msg:PoseStamped",
44 | "@ros2cli_test_interfaces//action:ShortVariedMultiNested",
45 | "@ros2cli_test_interfaces//msg:ShortVariedMultiNested",
46 | "@ros2cli_test_interfaces//srv:ShortVariedMultiNested",
47 | "@std_msgs//msg:String",
48 | ],
49 | )
50 |
51 | # C examples
52 |
53 | c_ros_library(
54 | name = "example_ros_c_msgs",
55 | deps = [
56 | "@rcl_interfaces//srv:SetLoggerLevels",
57 | "@sensor_msgs//msg:CompressedImage",
58 | "@std_msgs//msg:String",
59 | ],
60 | )
61 |
62 | cc_binary(
63 | name = "example_ros_c",
64 | srcs = ["src/example_ros.c"],
65 | deps = [":example_ros_c_msgs"],
66 | )
67 |
68 | cc_binary(
69 | name = "example_ros_publisher_c",
70 | srcs = ["src/example_ros_publisher.c"],
71 | deps = [
72 | ":example_ros_c_msgs",
73 | "@rcl",
74 | ],
75 | )
76 |
77 | cc_binary(
78 | name = "example_ros_subscriber_c",
79 | srcs = ["src/example_ros_subscriber.c"],
80 | deps = [
81 | ":example_ros_c_msgs",
82 | "@rcl",
83 | ],
84 | )
85 |
86 | alias(
87 | name = "example_ros_node_c",
88 | actual = ":example_ros_publisher_c",
89 | )
90 |
91 | # C++ examples (note that cc_ros_library includes proto type support)
92 |
93 | cc_ros_library(
94 | name = "example_ros_cc_msgs",
95 | deps = [
96 | "@sensor_msgs//msg:CompressedImage",
97 | "@std_msgs//msg:String",
98 | ],
99 | )
100 |
101 | cc_binary(
102 | name = "example_ros_cc",
103 | srcs = ["src/example_ros.cc"],
104 | deps = [":example_ros_cc_msgs"],
105 | )
106 |
107 | cc_binary(
108 | name = "example_ros_publisher_cc",
109 | srcs = ["src/example_ros_publisher.cc"],
110 | deps = [
111 | ":example_ros_cc_msgs",
112 | "@rclcpp",
113 | ],
114 | )
115 |
116 | cc_binary(
117 | name = "example_ros_subscriber_cc",
118 | srcs = ["src/example_ros_subscriber.cc"],
119 | deps = [
120 | ":example_ros_cc_msgs",
121 | "@rclcpp",
122 | ],
123 | )
124 |
125 | alias(
126 | name = "example_ros_node_cc",
127 | actual = ":example_ros_publisher_cc",
128 | )
129 |
130 | cc_binary(
131 | name = "example_ros_proto_publisher_cc",
132 | srcs = ["src/example_ros_proto_publisher.cc"],
133 | deps = [
134 | ":example_ros_cc_msgs",
135 | "@rclcpp",
136 | ],
137 | )
138 |
139 | cc_binary(
140 | name = "example_ros_proto_subscriber_cc",
141 | srcs = ["src/example_ros_proto_subscriber.cc"],
142 | deps = [
143 | ":example_ros_cc_msgs",
144 | "@rclcpp",
145 | ],
146 | )
147 |
148 | # Python - we cannot add these until we have refactored the IDL pipelines
149 | # to avoid constructing and passing CcInfo providers.
150 |
151 | py_ros_library(
152 | name = "example_ros_py_msgs",
153 | deps = [
154 | "@sensor_msgs//msg:CompressedImage",
155 | ],
156 | )
157 |
158 | py_binary(
159 | name = "example_ros_py",
160 | srcs = ["src/example_ros.py"],
161 | main = "src/example_ros.py",
162 | deps = [":example_ros_py_msgs"],
163 | )
164 |
165 | # Protobuf pipeline
166 |
167 | proto_ros_library(
168 | name = "example_proto",
169 | deps = [
170 | "@sensor_msgs//msg:CompressedImage",
171 | ],
172 | )
173 |
174 | cc_proto_library(
175 | name = "example_proto_cc_msgs",
176 | deps = [":example_proto"],
177 | )
178 |
179 | cc_binary(
180 | name = "example_proto_cc",
181 | srcs = ["src/example_proto.cc"],
182 | deps = [":example_proto_cc_msgs"],
183 | )
184 |
185 | # TF2 examples
186 |
187 | proto_ros_library(
188 | name = "example_tf2_proto",
189 | deps = [
190 | "@tf2_msgs//msg:TFMessage",
191 | ],
192 | )
193 |
--------------------------------------------------------------------------------
/distribution.txt:
--------------------------------------------------------------------------------
1 | # NOTE: we'll uncomment the packages below as their tests are ported to Bazel.
2 | # @action_msgs//... (NO TESTS)
3 | # @ament_clang_format//...
4 | # @ament_clang_tidy//...
5 | # @ament_cmake_auto//...
6 | # @ament_cmake_clang_format//...
7 | # @ament_cmake_clang_tidy//...
8 | # @ament_cmake_copyright//...
9 | # @ament_cmake_core//...
10 | # @ament_cmake_cppcheck//...
11 | # @ament_cmake_cpplint//...
12 | # @ament_cmake_export_definitions//...
13 | # @ament_cmake_export_dependencies//...
14 | # @ament_cmake_export_include_directories//...
15 | # @ament_cmake_export_libraries//...
16 | # @ament_cmake_export_link_flags//...
17 | # @ament_cmake_export_targets//...
18 | # @ament_cmake_flake8//...
19 | # @ament_cmake_gen_version_h//...
20 | # @ament_cmake_gmock//...
21 | # @ament_cmake_google_benchmark//...
22 | # @ament_cmake_gtest//...
23 | # @ament_cmake_include_directories//...
24 | # @ament_cmake_libraries//...
25 | # @ament_cmake_lint_cmake//...
26 | # @ament_cmake_mypy//...
27 | # @ament_cmake_pclint//...
28 | # @ament_cmake_pep257//...
29 | # @ament_cmake_pycodestyle//...
30 | # @ament_cmake_pyflakes//...
31 | # @ament_cmake_pytest//...
32 | # @ament_cmake_python//...
33 | # @ament_cmake_ros_core//...
34 | # @ament_cmake_ros//...
35 | # @ament_cmake_target_dependencies//...
36 | # @ament_cmake_test//...
37 | # @ament_cmake_uncrustify//...
38 | # @ament_cmake_vendor_package//...
39 | # @ament_cmake_version//...
40 | # @ament_cmake_xmllint//...
41 | # @ament_cmake//...
42 | # @ament_copyright//...
43 | # @ament_cppcheck//...
44 | # @ament_cpplint//...
45 | # @ament_flake8//...
46 | # @ament_lint_auto//...
47 | # @ament_lint_cmake//...
48 | # @ament_lint_common//...
49 | # @ament_lint//...
50 | # @ament_mypy//...
51 | # @ament_package//...
52 | # @ament_pclint//...
53 | # @ament_pep257//...
54 | # @ament_pycodestyle//...
55 | # @ament_pyflakes//...
56 | # @ament_uncrustify//...
57 | # @ament_xmllint//...
58 | # @builtin_interfaces//... (NO TESTS)
59 | # @class_loader//...
60 | # @common_interfaces//... (NO TESTS)
61 | # @composition_interfaces//... (NO TESTS)
62 | # @cyclonedds//...
63 | # @desktop_full//...
64 | # @desktop//...
65 | # @diagnostic_msgs//... (NO TESTS)
66 | # @domain_coordinator//...
67 | # @examples_tf2_py//...
68 | # @fastcdr//...
69 | # @fastdds//...
70 | # @geometry_msgs//... (NO TESTS)
71 | # @geometry2//...
72 | # @iceoryx//...
73 | # @launch_pytest//...
74 | # @launch_ros//...
75 | # @launch_testing_ament_cmake//...
76 | # @launch_testing_ros//...
77 | # @launch_testing//...
78 | # @launch_xml//...
79 | # @launch_yaml//...
80 | # @launch//...
81 | # @libstatistics_collector//...
82 | # @lifecycle_msgs//... (NO TESTS)
83 | # @lttng-ust//...
84 | # @lttngpy//...
85 | # @nav_msgs//... (NO TESTS)
86 | # @osrf_pycommon//...
87 | # @osrf_testing_tools_cpp//...
88 | # @perception//...
89 | # @performance_test_fixture//...
90 | # @pluginlib//...
91 | # @rcl_interfaces//... (NO TESTS)
92 | # @rcl_logging_noop//... (NO TESTS)
93 | # @rclcpp_components//...
94 | # @rmw_connextdds_common//...
95 | # @rmw_connextdds//...
96 | # @rmw_connextddsmicro//...
97 | # @rmw_cyclonedds_cpp//...
98 | # @rmw_dds_common//...
99 | # @rmw_fastrtps_cpp//...
100 | # @rmw_fastrtps_dynamic_cpp//...
101 | # @rmw_fastrtps_shared_cpp//...
102 | # @rmw_implementation_cmake//...
103 | # @rmw_implementation//...
104 | # @rmw_security_common//...
105 | # @rmw_test_fixture_implementation//...
106 | # @rmw_test_fixture//...
107 | # @rmw_zenoh_cpp//...
108 | # @rmw//...
109 | # @ros_base//...
110 | # @ros_core//...
111 | # @ros_environment//...
112 | # @ros_testing//...
113 | # @ros2action//...
114 | # @ros2cli_common_extensions//...
115 | # @ros2cli_test_interfaces//...
116 | # @ros2cli//...
117 | # @ros2component//...
118 | # @ros2doctor//...
119 | # @ros2interface//...
120 | # @ros2launch//...
121 | # @ros2lifecycle_test_fixtures//...
122 | # @ros2lifecycle//...
123 | # @ros2multicast//...
124 | # @ros2node//...
125 | # @ros2param//...
126 | # @ros2pkg//...
127 | # @ros2run//...
128 | # @ros2service//...
129 | # @ros2test//...
130 | # @ros2topic//...
131 | # @ros2trace//...
132 | # @rosdistro//...
133 | # @rosgraph_msgs//... (NO TESTS)
134 | # @rosidl_adapter_proto//...
135 | # @rosidl_cmake//...
136 | # @rosidl_core_generators//...
137 | # @rosidl_core_runtime//...
138 | # @rosidl_default_generators//...
139 | # @rosidl_default_runtime//...
140 | # @rosidl_dynamic_typesupport_fastrtps//...
141 | # @rosidl_dynamic_typesupport//...
142 | # @rosidl_generator_c//...
143 | # @rosidl_generator_cpp//...
144 | # @rosidl_generator_py//...
145 | # @rosidl_generator_tests//...
146 | # @rosidl_pycommon//...
147 | # @rosidl_runtime_py//...
148 | # @rosidl_typeadapter_protobuf_test//...
149 | # @rosidl_typesupport_c//...
150 | # @rosidl_typesupport_cpp//...
151 | # @rosidl_typesupport_fastrtps_c//...
152 | # @rosidl_typesupport_fastrtps_cpp//...
153 | # @rosidl_typesupport_interface//...
154 | # @rosidl_typesupport_introspection_c//...
155 | # @rosidl_typesupport_introspection_cpp//...
156 | # @rosidl_typesupport_introspection_tests//...
157 | # @rosidl_typesupport_protobuf_c//...
158 | # @rosidl_typesupport_protobuf_cpp//...
159 | # @rosidl_typesupport_protobuf//...
160 | # @rosidl_typesupport_tests//...
161 | # @rti_connext_dds_cmake_module//...
162 | # @sensor_msgs_py//...
163 | # @service_msgs//... (NO TESTS)
164 | # @shape_msgs//... (NO TESTS)
165 | # @simulation//...
166 | # @sros2_cmake//...
167 | # @sros2//...
168 | # @statistics_msgs//... (NO TESTS)
169 | # @std_msgs//... (NO TESTS)
170 | # @std_srvs//... (NO TESTS)
171 | # @stereo_msgs//... (NO TESTS)
172 | # @test_interface_files//... (NO TESTS)
173 | # @test_launch_ros//...
174 | # @test_launch_testing//...
175 | # @test_osrf_testing_tools_cpp//...
176 | # @test_rmw_implementation//...
177 | # @test_ros2trace//...
178 | # @test_tf2//...
179 | # @test_tracetools_launch//...
180 | # @test_tracetools//...
181 | # @tf2_bullet//...
182 | # @tf2_eigen_kdl//...
183 | # @tf2_eigen//...
184 | # @tf2_geometry_msgs//...
185 | # @tf2_kdl//...
186 | # @tf2_msgs//...
187 | # @tf2_py//...
188 | # @tf2_ros_py//...
189 | # @tf2_ros//...
190 | # @tf2_sensor_msgs//...
191 | # @tf2_tools//...
192 | # @tf2//...
193 | # @tracetools_launch//...
194 | # @tracetools_read//...
195 | # @tracetools_test//...
196 | # @tracetools_trace//...
197 | # @tracetools//...
198 | # @trajectory_msgs//... (NO TESTS)
199 | # @type_description_interfaces//... (NO TESTS)
200 | # @unique_identifier_msgs//...
201 | # @visualization_msgs//... (NO TESTS)
202 | # @zenoh_security_tools//...
203 | @ament_index_cpp//...
204 | @ament_index_python//...
205 | @console_bridge_vendor//...
206 | @mimick//...
207 | @rosidl_adapter//...
208 | @rosidl_cli//...
209 | @rosidl_generator_type_description//...
210 | @rosidl_parser//...
211 | @rosidl_runtime_c//...
212 | @rosidl_runtime_cpp//...
213 | @rcl_action//...
214 | @rcl_lifecycle//...
215 | @rcl_logging_interface//...
216 | @rcl_logging_spdlog//...
217 | @rcl_yaml_param_parser//...
218 | @rcl//...
219 | @rclcpp_action//...
220 | @rclcpp_lifecycle//...
221 | @rclcpp//...
222 | @rcpputils//...
223 | @rcutils//...
224 | @rpyutils//...
225 | @sensor_msgs//...
226 | @test_msgs//...
227 | @zenoh-c//...
228 | @zenoh-cpp//...
229 | //...
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "submodules/ament_cmake_ros"]
2 | path = submodules/ament_cmake_ros
3 | url = https://github.com/asymingt/ament_cmake_ros.git
4 | [submodule "submodules/ament_index"]
5 | path = submodules/ament_index
6 | url = https://github.com/asymingt/ament_index.git
7 | [submodule "submodules/common_interfaces"]
8 | path = submodules/common_interfaces
9 | url = https://github.com/asymingt/common_interfaces.git
10 | [submodule "submodules/geometry2"]
11 | path = submodules/geometry2
12 | url = https://github.com/asymingt/geometry2.git
13 | [submodule "submodules/libstatistics_collector"]
14 | path = submodules/libstatistics_collector
15 | url = https://github.com/asymingt/libstatistics_collector.git
16 | [submodule "submodules/osrf_testing_tools_cpp"]
17 | path = submodules/osrf_testing_tools_cpp
18 | url = https://github.com/asymingt/osrf_testing_tools_cpp.git
19 | [submodule "submodules/performance_test_fixture"]
20 | path = submodules/performance_test_fixture
21 | url = https://github.com/asymingt/performance_test_fixture.git
22 | [submodule "submodules/rcl"]
23 | path = submodules/rcl
24 | url = https://github.com/asymingt/rcl.git
25 | [submodule "submodules/rcl_interfaces"]
26 | path = submodules/rcl_interfaces
27 | url = https://github.com/asymingt/rcl_interfaces.git
28 | [submodule "submodules/rmw_connextdds"]
29 | path = submodules/rmw_connextdds
30 | url = https://github.com/asymingt/rmw_connextdds.git
31 | [submodule "submodules/rmw_cyclonedds"]
32 | path = submodules/rmw_cyclonedds
33 | url = https://github.com/asymingt/rmw_cyclonedds.git
34 | [submodule "submodules/rmw_dds_common"]
35 | path = submodules/rmw_dds_common
36 | url = https://github.com/asymingt/rmw_dds_common.git
37 | [submodule "submodules/rmw_fastrtps"]
38 | path = submodules/rmw_fastrtps
39 | url = https://github.com/asymingt/rmw_fastrtps.git
40 | [submodule "submodules/rmw_implementation"]
41 | path = submodules/rmw_implementation
42 | url = https://github.com/asymingt/rmw_implementation.git
43 | [submodule "submodules/rmw_zenoh"]
44 | path = submodules/rmw_zenoh
45 | url = https://github.com/asymingt/rmw_zenoh.git
46 | [submodule "submodules/ros2_tracing"]
47 | path = submodules/ros2_tracing
48 | url = https://github.com/asymingt/ros2_tracing.git
49 | [submodule "submodules/ros2cli"]
50 | path = submodules/ros2cli
51 | url = https://github.com/asymingt/ros2cli.git
52 | [submodule "submodules/rosidl"]
53 | path = submodules/rosidl
54 | url = https://github.com/asymingt/rosidl.git
55 | [submodule "submodules/rosidl_dynamic_typesupport"]
56 | path = submodules/rosidl_dynamic_typesupport
57 | url = https://github.com/asymingt/rosidl_dynamic_typesupport.git
58 | [submodule "submodules/rosidl_python"]
59 | path = submodules/rosidl_python
60 | url = https://github.com/asymingt/rosidl_python.git
61 | [submodule "submodules/rosidl_typesupport"]
62 | path = submodules/rosidl_typesupport
63 | url = https://github.com/asymingt/rosidl_typesupport.git
64 | [submodule "submodules/rosidl_typesupport_fastrtps"]
65 | path = submodules/rosidl_typesupport_fastrtps
66 | url = https://github.com/asymingt/rosidl_typesupport_fastrtps.git
67 | [submodule "submodules/rosidl_typesupport_protobuf"]
68 | path = submodules/rosidl_typesupport_protobuf
69 | url = https://github.com/asymingt/rosidl_typesupport_protobuf.git
70 | [submodule "submodules/rpyutils"]
71 | path = submodules/rpyutils
72 | url = https://github.com/asymingt/rpyutils.git
73 | [submodule "submodules/test_interface_files"]
74 | path = submodules/test_interface_files
75 | url = https://github.com/asymingt/test_interface_files.git
76 | [submodule "submodules/unique_identifier_msgs"]
77 | path = submodules/unique_identifier_msgs
78 | url = https://github.com/asymingt/unique_identifier_msgs.git
79 | [submodule "submodules/rcl_logging"]
80 | path = submodules/rcl_logging
81 | url = https://github.com/asymingt/rcl_logging.git
82 | [submodule "submodules/rclcpp"]
83 | path = submodules/rclcpp
84 | url = https://github.com/asymingt/rclcpp.git
85 | [submodule "submodules/rcpputils"]
86 | path = submodules/rcpputils
87 | url = https://github.com/asymingt/rcpputils.git
88 | [submodule "submodules/rcutils"]
89 | path = submodules/rcutils
90 | url = https://github.com/asymingt/rcutils.git
91 | [submodule "submodules/rmw"]
92 | path = submodules/rmw
93 | url = https://github.com/asymingt/rmw.git
94 | [submodule "submodules/rosidl_runtime_py"]
95 | path = submodules/rosidl_runtime_py
96 | url = https://github.com/asymingt/rosidl_runtime_py.git
97 | [submodule "submodules/rosidl_dynamic_typesupport_fastrtps"]
98 | path = submodules/rosidl_dynamic_typesupport_fastrtps
99 | url = https://github.com/asymingt/rosidl_dynamic_typesupport_fastrtps.git
100 | [submodule "submodules/ament_package"]
101 | path = submodules/ament_package
102 | url = https://github.com/asymingt/ament_package.git
103 | [submodule "submodules/ament_cmake"]
104 | path = submodules/ament_cmake
105 | url = https://github.com/asymingt/ament_cmake.git
106 | [submodule "submodules/ament_lint"]
107 | path = submodules/ament_lint
108 | url = https://github.com/asymingt/ament_lint.git
109 | [submodule "submodules/class_loader"]
110 | path = submodules/class_loader
111 | url = https://github.com/asymingt/class_loader.git
112 | [submodule "submodules/console_bridge_vendor"]
113 | path = submodules/console_bridge_vendor
114 | url = https://github.com/asymingt/console_bridge_vendor.git
115 | [submodule "submodules/iceoryx"]
116 | path = thirdparty/iceoryx
117 | url = https://github.com/asymingt/iceoryx.git
118 | [submodule "submodules/launch"]
119 | path = submodules/launch
120 | url = https://github.com/asymingt/launch.git
121 | [submodule "submodules/launch_ros"]
122 | path = submodules/launch_ros
123 | url = https://github.com/asymingt/launch_ros.git
124 | [submodule "submodules/osrf_pycommon"]
125 | path = submodules/osrf_pycommon
126 | url = https://github.com/asymingt/osrf_pycommon.git
127 | [submodule "submodules/pluginlib"]
128 | path = submodules/pluginlib
129 | url = https://github.com/asymingt/pluginlib.git
130 | [submodule "submodules/ros2cli_common_extensions"]
131 | path = submodules/ros2cli_common_extensions
132 | url = https://github.com/asymingt/ros2cli_common_extensions.git
133 | [submodule "submodules/ros_environment"]
134 | path = submodules/ros_environment
135 | url = https://github.com/asymingt/ros_environment.git
136 | [submodule "submodules/variants"]
137 | path = submodules/variants
138 | url = https://github.com/asymingt/variants.git
139 | [submodule "submodules/sros2"]
140 | path = submodules/sros2
141 | url = https://github.com/asymingt/sros2.git
142 | [submodule "submodules/ros_testing"]
143 | path = submodules/ros_testing
144 | url = https://github.com/asymingt/ros_testing.git
145 | [submodule "submodules/rosidl_core"]
146 | path = submodules/rosidl_core
147 | url = https://github.com/asymingt/rosidl_core.git
148 | [submodule "submodules/rosidl_defaults"]
149 | path = submodules/rosidl_defaults
150 | url = https://github.com/asymingt/rosidl_defaults.git
151 | [submodule "thirdparty/cyclonedds"]
152 | path = thirdparty/cyclonedds
153 | url = https://github.com/asymingt/cyclonedds.git
154 | [submodule "thirdparty/lttng-ust"]
155 | path = thirdparty/lttng-ust
156 | url = https://github.com/asymingt/lttng-ust.git
157 | [submodule "thirdparty/mimick"]
158 | path = thirdparty/mimick
159 | url = https://github.com/asymingt/mimick.git
160 | [submodule "thirdparty/zenoh-cpp"]
161 | path = thirdparty/zenoh-cpp
162 | url = https://github.com/asymingt/zenoh-cpp.git
163 | [submodule "thirdparty/zenoh-c"]
164 | path = thirdparty/zenoh-c
165 | url = https://github.com/asymingt/zenoh-c.git
166 | [submodule "submodules/rosdistro"]
167 | path = submodules/rosdistro
168 | url = https://github.com/asymingt/rosdistro.git
169 | [submodule "thirdparty/fastdds"]
170 | path = thirdparty/fastdds
171 | url = https://github.com/asymingt/fastdds.git
172 | [submodule "thirdparty/fastcdr"]
173 | path = thirdparty/fastcdr
174 | url = https://github.com/asymingt/fastcdr.git
175 |
--------------------------------------------------------------------------------
/tools/registry_scraper_tool.py:
--------------------------------------------------------------------------------
1 | # Copyright 2025 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 | This tool parses a `registry_scraper_data.yaml` file to determine all of
17 | the repos and packages in this project. Using this, it calculates a diff
18 | between the upstream package version and the changes needed to get a
19 | Bazel build working, and transforms this to a Bazel module.
20 | """
21 |
22 | import argparse
23 | import hashlib
24 | import base64
25 | import json
26 | import shutil
27 | import yaml
28 | import urllib3
29 | from git import Repo
30 | from pathlib import Path
31 | from python.runfiles import runfiles
32 |
33 |
34 | def calculate_bazel_integrity(uri):
35 | """Given a local or remote file URI, download and calculate integrity"""
36 | file_path = uri
37 | # Special case, this is probably a URL.
38 | if not Path(uri).exists():
39 | uri_split = uri.split("/")
40 | file_path = Path("/tmp/downloads/" + "-".join([uri_split[-5], uri_split[-1]]))
41 | # If we haven't yet downloaded this file, let's go ahead and do it.
42 | if not file_path.exists():
43 | file_path.parent.mkdir(parents=True, exist_ok=True)
44 | http = urllib3.PoolManager()
45 | r = http.request('GET', uri, preload_content=False)
46 | with open(file_path, 'wb') as out:
47 | while True:
48 | data = r.read(212992) # cat /proc/sys/net/core/rmem_default
49 | if not data:
50 | break
51 | out.write(data)
52 | r.release_conn()
53 | # Calculate the hash for the file.
54 | sha256_hash = hashlib.sha256()
55 | block_size = 65536 # 64 KB
56 | try:
57 | with open(file_path, "rb") as f:
58 | for chunk in iter(lambda: f.read(block_size), b""):
59 | sha256_hash.update(chunk)
60 | except IOError as e:
61 | print(f"Error reading file: {e}")
62 | return None
63 | return f"sha256-" + str(base64.b64encode(sha256_hash.digest()).decode('utf-8'))
64 |
65 | def update_metadata_json(metadata_json, ghsuffix, version):
66 | """Update a metadata.json file for a given module"""
67 | metadata_json.parent.mkdir(parents=True, exist_ok=True)
68 | if metadata_json.exists():
69 | with open(metadata_json, 'r') as f:
70 | module_data = json.load(f)
71 | module_versions = set(module_data["versions"])
72 | module_versions.add(version)
73 | module_data["versions"] = sorted(list(module_versions))
74 | else:
75 | module_data = {
76 | "homepage": f"https://github.com/{ghsuffix}",
77 | "maintainers": [
78 | {
79 | "email": "intrinsic-opensource@users.noreply.github.com",
80 | "name": "intrinsic-opensource"
81 | }
82 | ],
83 | "repository": [
84 | f"github:{ghsuffix}"
85 | ],
86 | "versions": [
87 | version
88 | ],
89 | "yanked_versions": {}
90 | }
91 | with open(metadata_json, 'w') as f:
92 | json.dump(module_data, f, indent=4)
93 |
94 | def update_source_json(source_json, ghsuffix, upstream, overlay = {}, patches = {}, strip = ""):
95 | """Update a metadata.json file for a given module"""
96 | source_json.parent.mkdir(parents=True, exist_ok=True)
97 | url = f"https://github.com/{ghsuffix}/archive/refs/tags/{upstream}.tar.gz"
98 | strip_prefix = ghsuffix.split("/")[-1] + "-" + upstream.removeprefix("v").replace("/", "-")
99 | if strip != "":
100 | strip_prefix += "/" + strip
101 | source_data = {
102 | "url": url,
103 | "integrity": calculate_bazel_integrity(url),
104 | "strip_prefix": strip_prefix,
105 | }
106 | if overlay:
107 | source_data["overlay"] = overlay
108 | if patches:
109 | source_data["patches"] = patches
110 | source_data["patch_strip"] = len(strip_prefix.split("/"))
111 | with open(source_json, 'w') as f:
112 | json.dump(source_data, f, indent=4)
113 |
114 | def update_overlay_file(overlay_dest, overlay_src):
115 | """Update a metadata.json file for a given module"""
116 | overlay_dest.parent.mkdir(parents=True, exist_ok=True)
117 | shutil.copy(overlay_src, overlay_dest)
118 |
119 | def update_patch_file(patch_dest, patch_content):
120 | """Update a patch file with content"""
121 | patch_dest.parent.mkdir(parents=True, exist_ok=True)
122 | patch_content = patch_content.replace("\n\\ No newline at end of file", "")
123 | with open(patch_dest, "w") as file:
124 | file.write(patch_content)
125 |
126 | def repos_from_submodules(repo_base_path, repo_yaml_file, package=None):
127 | """Process all repos in the yaml file"""
128 | base_out_path = repo_base_path / 'docs' / 'modules'
129 |
130 | # Try and open the file with all the repos
131 | try:
132 | with repo_yaml_file.open('r') as f:
133 | yaml_data = yaml.safe_load(f)
134 | print("YAML data loaded successfully:")
135 | except FileNotFoundError:
136 | print(f"Error: The YAML file '{repo_yaml_file}' was not found.")
137 | except yaml.YAMLError as e:
138 | print(f"Error parsing YAML file: {e}")
139 |
140 | for repo_name, repo_data in yaml_data.items():
141 | print("Processing", repo_name)
142 | repo_folder = repo_data.get('folder', 'submodules')
143 | repo_version = repo_data["version"]
144 | repo_ghsuffix = repo_data["github"]
145 | repo_upstream = repo_data.get('upstream', repo_version)
146 | repo_path = repo_base_path / repo_folder / repo_name
147 |
148 | # Collect diffs
149 | repo = Repo(repo_path)
150 | commit_base = repo.commit(repo_upstream)
151 | commit_feat = repo.commit("HEAD")
152 | diff_index = commit_base.diff(commit_feat)
153 | repo_overlay = {}
154 | repo_patches = {}
155 | for diff in diff_index:
156 | if diff.change_type == 'M': # 'M' for modified
157 | repo_patches[diff.b_path] = repo.git.diff(commit_base, commit_feat, diff.b_path)
158 | else:
159 | overlay_path = str(repo_path / diff.b_path)
160 | repo_overlay[diff.b_path] = calculate_bazel_integrity(overlay_path)
161 |
162 | # Extract modules for this repo.
163 | repo_modules = {}
164 | if 'modules' in repo_data.keys():
165 | for module_name, module_path in repo_data['modules'].items():
166 | repo_modules[module_name] = module_path
167 | else:
168 | repo_modules[repo_name] = ""
169 |
170 | # Process modules
171 | for module_name, module_subfolder in repo_modules.items():
172 | if package is not None and package != module_name:
173 | continue
174 | print("+", module_name)
175 |
176 | # Clear anything that's already there.
177 | shutil.rmtree(base_out_path / module_name, ignore_errors=True)
178 |
179 | # Get the path to the module folder of the repo
180 | module_path = repo_base_path / repo_folder / repo_name / module_subfolder
181 |
182 | # Update the metadata.json file.
183 | metadata_json = base_out_path / module_name / 'metadata.json'
184 | update_metadata_json(metadata_json, repo_ghsuffix, repo_version)
185 |
186 | # Create overlay files.
187 | overlay = {}
188 | for overlay_rel_path, overlay_integrity in repo_overlay.items():
189 | overlay_src_path = repo_path / overlay_rel_path
190 | if not str(overlay_src_path).startswith(str(module_path) + "/"):
191 | continue
192 | strip_prefix = str(overlay_src_path).removeprefix(str(module_path) + "/")
193 | overlay_dst_path = base_out_path / module_name / repo_version / 'overlay' / strip_prefix
194 | update_overlay_file(overlay_dst_path, overlay_src_path)
195 | overlay[strip_prefix] = overlay_integrity
196 |
197 | # Create patch files
198 | patches = {}
199 | for patch_rel_path, patch_content in repo_patches.items():
200 | patch_src_path = repo_path / patch_rel_path
201 | if not str(patch_src_path).startswith(str(module_path) + "/"):
202 | continue
203 | strip_prefix = str(patch_src_path).removeprefix(str(module_path) + "/")
204 | patch_name = "fix_" + str(strip_prefix).replace("/", "_").replace(".", "_") + ".patch"
205 | patch_dst_path = base_out_path / module_name / repo_version / 'patches' / patch_name
206 | update_patch_file(patch_dst_path, patch_content)
207 | patches[patch_name] = calculate_bazel_integrity(patch_dst_path)
208 |
209 | # Copy over the MODULE.bazel file.
210 | src_module_bazel = base_out_path / module_name / repo_version / 'overlay' / 'MODULE.bazel'
211 | dst_module_bazel = base_out_path / module_name / repo_version / 'MODULE.bazel'
212 | dst_module_bazel.parent.mkdir(parents=True, exist_ok=True)
213 | shutil.copy(src_module_bazel, dst_module_bazel)
214 |
215 | # Patches are done at the repo level, so we need to strip out the subfolder.
216 | strip = module_subfolder
217 |
218 | # Update the source.json file.
219 | source_json = base_out_path / module_name / repo_version / 'source.json'
220 | update_source_json(source_json, repo_ghsuffix, repo_upstream, overlay, patches, strip)
221 |
222 | if __name__ == "__main__":
223 | parser = argparse.ArgumentParser()
224 | parser.add_argument("workspace", help="Path to the bazel workspace")
225 | parser.add_argument("-p", "--package", type=str, help="Target package name (optional)")
226 | args = parser.parse_args()
227 | repo_base_path = Path(args.workspace)
228 | repo_yaml_file = Path(runfiles.Create().Rlocation('_main/tools/registry_scraper_data.yaml'))
229 | repos_from_submodules(repo_base_path, repo_yaml_file, args.package)
230 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright [yyyy] [name of copyright owner]
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Overview
2 |
3 | The goal of the [ROS Central Registry](http://intrinsic-opensource.github.io/ros-central-registry) is to provide a [Bazel](https://bazel.build) build system for [Robot Operating System (ROS)](https://ros.org) applications. Our philosophy is to build everything from source, using the dependency management system provided by the [Bazel modules](https://bazel.build/external/module) ecosystem to ensure consistency across ROS releases. In our approach, every ROS package has a corresponding Bazel module. A lot of the work in this project is inspired by Milan Vukov's [rules_ros2](https://github.com/mvukov/rules_ros2) project, one of [several existing Bazel build systems for ROS](https://github.com/RobotLocomotion/drake-ros/blob/main/bazel_ros2_rules/lib/README.md).
4 |
5 | > [!WARNING]
6 | > This repository is a proof of concept and under active open development, and so no guarantees are made about stability. Please do not depend on this code until we have an official release!
7 |
8 | # Status
9 |
10 | The table below summarizes the status of the github workflows exercising various platforms:
11 |
12 | | Platform | x64 | arm64 |
13 | | :---------------- | :-----------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------: |
14 | | Ubuntu 24.04 |  |  |
15 | | MacOS 15 |  |  |
16 | | Windows 11 |  |  |
17 |
18 | In terms of features, this is what we currently support:
19 |
20 | - Message language bindings
21 | - [x] `c`
22 | - [x] `cpp`
23 | - [x] `py`
24 | - [ ] `rust`
25 | - Type supports:
26 | - [x] `rosidl_typesupport_introspection`
27 | - [x] `rosidl_typesupport_fastrtps`
28 | - [x] `rosidl_typesupport_protobuf`
29 | - Middleware:
30 | - [x] `rmw_cyclonedds_cpp`
31 | - [x] `rmw_fastrtps_cpp`
32 | - [x] `rmw_fastrtps_dynamic_cpp`
33 | - [x] `rmw_zenoh_cpp`
34 | - [ ] `rmw_connextdds_cpp`
35 | - Core:
36 | - [x] `rcl`
37 | - [x] `rcl_action`
38 | - [x] `rcl_lifecycle`
39 | - [x] `rclcpp`
40 | - [x] `rclcpp_action`
41 | - [x] `rclcpp_lifecycle`
42 | - [ ] `rclpy`
43 | - [ ] `rclrs`
44 |
45 | Our intention is to ultimately host a CI plan that responds to new ROS releases by automatically creating a set of Bazel modules and running tests. For now, however, we are working off a snapshot of the rolling release from June 2025 to determine the long term feasibility of this concept.
46 |
47 | # Prerequisites
48 |
49 | ## Ubuntu Linux 24.04 (functional, recommended)
50 |
51 | Right now, we only support Ubuntu 24.04. You must first install `git` and and [bazelisk](https://github.com/bazelbuild/bazelisk) in order to run or edit code. The project downloads a LLVM toolchain with clang, which means that you don't need any compiler or toolchains installed in your host environment. Th only thing you will need is a functioning build environment, because some packages use `rules_foreign_cc` and require `autoconf` to build correctly. To add this tool, run the following:
52 |
53 | ```
54 | apt install build-essential automake autoconf libtool valgrind
55 | ```
56 |
57 | ## MacOS 15 (broken, unsupported)
58 |
59 | You will need need to install homebrew first, and then add a few packages before trying to build any examples.
60 |
61 | ```
62 | brew install automake autoconf libtool zstd rust bazelisk
63 | ```
64 |
65 | The `automake`, `autoconf`, and `libtool` packages are needed by `rules_foreign_cc` to detect system features when generating Makefiles. The `zstd` package is needed by the protocol buffer rules. The `rust` package provides the `cargo` binary, which is needed for a Zenoh build. The `bazelisk` package provides the `bazel` command, which bootstraps a bazel build tool for this project.
66 |
67 | ## Windows 11 (broken, unsupported)
68 |
69 | Currently the `toolchains_llvm` project does not offer a functional compiler setup for windows environments. For more information, please see [this issue](https://github.com/bazel-contrib/toolchains_llvm/issues/395).
70 |
71 | # Examples
72 |
73 | First, checkout this repository:
74 |
75 | ```
76 | git clone https://github.com/intrinsic-opensource/ros-central-registry.git
77 | ```
78 |
79 | If you're goign to be developing add `--recurse-submodules` but it's not necessary for just the examples.
80 |
81 | ## Custom message with minimal publisher and subscriber
82 |
83 | We have included a small self-contained example workspace showing a minimal C++ publisher and subscriber exchanging a custom message. By default we use the FastRTPS middleware. Start by opening two terminals at the `example` directory from within this project.
84 |
85 | In terminal 1, start a ROS node to publish a custom message.
86 |
87 | ```
88 | cd example
89 | bazel run //:example_ros_publisher_cc
90 | ```
91 |
92 | In terminal 2, start a ROS node to subscribe to the custom message.
93 |
94 | ```
95 | cd example
96 | bazel run //:example_ros_subscriber_cc
97 | ```
98 |
99 | We also support several other RMW middleware implementations -- `rmw_cyclonedds_cpp`, `rmw_zenoh_cpp` and `rmw_fastrtps_dynamic_cpp`. You must specify which one you want to use, either permanently in the `.bazelrc` or as an argument to *every* Bazel action. For zenoh you must also run the `zenohd` router, like this:
100 |
101 | ```
102 | In terminal 1, start the zenohd router.
103 | cd example
104 | bazel run @rmw_zenoh_cpp//:rmw_zenohd
105 |
106 | # In terminal 2
107 | cd example
108 | bazel run //:example_ros_publisher_cc \
109 | --@rmw_implementation//:rmw=rmw_zenoh_cpp
110 |
111 | # In terminal 3
112 | cd example
113 | bazel run //:example_ros_subscriber_cc \
114 | --@rmw_implementation//:rmw=rmw_zenoh_cpp
115 | ```
116 |
117 | ## Protocol buffer support
118 |
119 | We have also included protocol buffer type support, which allows you to interact with messages, services and actions through the protocol buffer C++ API. The protocol buffer type adapter automatically converts to and from the protocol buffer bindings, preventing the developer from having to write message-specific type converters, which is both laborious and prone to error.
120 |
121 | # Setting up a development environment
122 |
123 | ROS is a federated system, which means that its code is spread across multiple repositories. This makes managing a feature branch more challenging, because you have to keep several repositories in sync with each other. While we migrate to using the `wstool` or `vcs` tools, this repo uses submodules.
124 |
125 | Each Bazel test is spawned in a separate sandbox environment. Since many ROS packages use the network, their tests may interfere with each other. To prevent this from happening, we force tests to use a `docker` sandbox, which runs the test in a container from the [Dockerfile](Dockerfile) image.
126 |
127 | ```
128 | docker build -t ros-central-registry:24.04 .
129 | ```
130 |
131 | To setup your developer environment, simply do this from the root directory of this project. This will take a bit of time recursively pulling all dependent projects to the `submodules` folders. The `submodule` folder is where our ROS packages live, while the `thirdparty` folder contains vendored dependencies.
132 |
133 | ```
134 | git submodule update --init --recursive
135 | ```
136 |
137 | Now, take a look at the base folder structure of this project.
138 |
139 | ```
140 | + .github/ # CI workflows for checking various platforms.
141 | + docs/ # Output modules from the scraping process.
142 | + example/ # Standalone example showing how to use our modules.
143 | + src/ # Some examples showing how to use the developer environment.
144 | + tools/ # Tools for transforming repos into Bazel modules.
145 | + submodules/ # Bazel modules we expect to always live in the RCR ***
146 | + thirdparty/ # Bazel modules we expect to eventually live in the BCR ***
147 | ```
148 |
149 | Right now the developer workflow is to modify the submodules directly as you test. If you look at the `MODULE.bazel` file in the root of this project you will see that a `local_path_override` masks the Bazel module with a local copy while you test. Once you have finished making changes and testing, you must commit your changes to the `rolling-bazel` branch of each repo you modified:
150 |
151 | As an example, lets assume you made a change to `rclcpp`. To push the change upstream, you will need write permission to the repo. Right now we are in the process of setting up a better way of handling this.
152 |
153 | ```
154 | cd submodules/rclcpp
155 | git pull
156 | git checkout rolling-bazel
157 | git commit -m "Added new tests"
158 | git push
159 | ```
160 |
161 | Note that you will also need to push the updated submodule commit hash on this repo, so that the developer workspace now points to a `rclcpp` repo commit containing your change. Before we do this, however, we want to first make sure that we have regenerated our bazel modules files:
162 |
163 | ```
164 | bazel run //tools:regenerate_modules -- $PWD
165 | ```
166 |
167 | This tool iterates over all submodules in `submodules` and `thirdparty` and calculates a diff between the upstream versioned release and the `rolling-bazel` branch, and then transforms this into Bazel module in the `docs` folder. If you run `git diff` you should see changes in `docs` to the `rclcpp` package.
168 |
169 | Once you are happy with the change to the submodule commit and `docs` folder, you can commit and push your code to a new branch and setup a PR.
170 |
171 | ```
172 | git checkout -b feature/rclcpp-test-fixes
173 | git add .
174 | git commit -m "Add some rclcpp fixes"
175 | git push
176 | ```
177 |
178 | When you open a pull request containing your changes, you will see some CI plans run. These let you know whether the changes you have made are functional across a variety of different platforms.
179 |
180 | ## Notes
181 |
182 | ### Module locking failures
183 |
184 | Right now we will periodically update modules but keep the same version number. Bazel aggressively caches based on the version numbers. If you find that you are getting a download hash mismatch for modules, make sure that you remove the `MODULE.bazel.lock` file in the root workspace. If you still have issues, clean the workspace by running `bazel clean` followed by `bazel shutdown`. If you still have issues, you can try running `rm -rf $(bazel info repository_cache)` but note that this will clear all repository cache, and a build will need to re-download the LLVM toolchain.
185 |
186 | ### Module testing failures
187 |
188 | If you are running in docker, there is a known issue with valgrind. Before running any tests you must set your ulimit down from the default of 1073741804 to something more reasonable. Since you cannot pass `--ulimit` to the docker run args of a Bazel sandbox, you must set this globally in your docker daemon. Thankfully, GitHub appears to already do this. But for a local install you will need to add the following to the `daemon.json` file and restart docker.
189 |
190 | ```
191 | {
192 | "default-ulimits": {
193 | "nofile": {
194 | "Name": "nofile",
195 | "Soft": 65536
196 | "Hard": 65536,
197 | }
198 | }
199 | }
200 | ```
201 |
202 | ### Testing the full distribution of packages
203 |
204 | There is no straightforward way of running a full test suite across all package imports. Bazel doesn't support to support a wildcard expansion for test targets that span multiple modules. For this reason we have a [Distribution File](distribution.txt) and supporting rule in our `.bazelrc` file that enables you to run all tests across all repos in the following way:
205 |
206 | ```
207 | bazel test --config=distribution
208 | ```
--------------------------------------------------------------------------------
/tools/registry_scraper_data.yaml:
--------------------------------------------------------------------------------
1 | ament_cmake_ros:
2 | github: ros2/ament_cmake_ros
3 | version: 0.15.1
4 | modules:
5 | ament_cmake_ros_core: ament_cmake_ros_core
6 | ament_cmake_ros: ament_cmake_ros
7 | domain_coordinator: domain_coordinator
8 | rmw_test_fixture_implementation: rmw_test_fixture_implementation
9 | rmw_test_fixture: rmw_test_fixture
10 | ament_cmake:
11 | github: ament/ament_cmake
12 | version: 2.8.4
13 | modules:
14 | ament_cmake_auto : ament_cmake_auto
15 | ament_cmake_core : ament_cmake_core
16 | ament_cmake_export_definitions : ament_cmake_export_definitions
17 | ament_cmake_export_dependencies : ament_cmake_export_dependencies
18 | ament_cmake_export_include_directories : ament_cmake_export_include_directories
19 | ament_cmake_export_libraries : ament_cmake_export_libraries
20 | ament_cmake_export_link_flags : ament_cmake_export_link_flags
21 | ament_cmake_export_targets : ament_cmake_export_targets
22 | ament_cmake_gen_version_h : ament_cmake_gen_version_h
23 | ament_cmake_gmock : ament_cmake_gmock
24 | ament_cmake_google_benchmark : ament_cmake_google_benchmark
25 | ament_cmake_gtest : ament_cmake_gtest
26 | ament_cmake_include_directories : ament_cmake_include_directories
27 | ament_cmake_libraries : ament_cmake_libraries
28 | ament_cmake_pytest : ament_cmake_pytest
29 | ament_cmake_python : ament_cmake_python
30 | ament_cmake_target_dependencies : ament_cmake_target_dependencies
31 | ament_cmake_test : ament_cmake_test
32 | ament_cmake_vendor_package : ament_cmake_vendor_package
33 | ament_cmake_version : ament_cmake_version
34 | ament_cmake : ament_cmake
35 | ament_index:
36 | github: ament/ament_index
37 | version: 1.12.0
38 | modules:
39 | ament_index_cpp: ament_index_cpp
40 | ament_index_python: ament_index_python
41 | ament_lint:
42 | github: ament/ament_lint
43 | version: 0.20.1
44 | modules:
45 | ament_clang_format : ament_clang_format
46 | ament_clang_tidy : ament_clang_tidy
47 | ament_cmake_clang_format : ament_cmake_clang_format
48 | ament_cmake_clang_tidy : ament_cmake_clang_tidy
49 | ament_cmake_copyright : ament_cmake_copyright
50 | ament_cmake_cppcheck : ament_cmake_cppcheck
51 | ament_cmake_cpplint : ament_cmake_cpplint
52 | ament_cmake_flake8 : ament_cmake_flake8
53 | ament_cmake_lint_cmake : ament_cmake_lint_cmake
54 | ament_cmake_mypy : ament_cmake_mypy
55 | ament_cmake_pclint : ament_cmake_pclint
56 | ament_cmake_pep257 : ament_cmake_pep257
57 | ament_cmake_pycodestyle : ament_cmake_pycodestyle
58 | ament_cmake_pyflakes : ament_cmake_pyflakes
59 | ament_cmake_uncrustify : ament_cmake_uncrustify
60 | ament_cmake_xmllint : ament_cmake_xmllint
61 | ament_copyright : ament_copyright
62 | ament_cppcheck : ament_cppcheck
63 | ament_cpplint : ament_cpplint
64 | ament_flake8 : ament_flake8
65 | ament_lint_auto : ament_lint_auto
66 | ament_lint_cmake : ament_lint_cmake
67 | ament_lint_common : ament_lint_common
68 | ament_lint : ament_lint
69 | ament_mypy : ament_mypy
70 | ament_pclint : ament_pclint
71 | ament_pep257 : ament_pep257
72 | ament_pycodestyle : ament_pycodestyle
73 | ament_pyflakes : ament_pyflakes
74 | ament_uncrustify : ament_uncrustify
75 | ament_xmllint : ament_xmllint
76 | ament_package:
77 | github: ament/ament_package
78 | version: 0.18.0
79 | class_loader:
80 | github: ros/class_loader
81 | version: 2.9.0
82 | common_interfaces:
83 | github: ros2/common_interfaces
84 | version: 5.8.1
85 | modules:
86 | common_interfaces: common_interfaces
87 | diagnostic_msgs: diagnostic_msgs
88 | geometry_msgs: geometry_msgs
89 | nav_msgs: nav_msgs
90 | sensor_msgs_py: sensor_msgs_py
91 | sensor_msgs: sensor_msgs
92 | shape_msgs: shape_msgs
93 | std_msgs: std_msgs
94 | std_srvs: std_srvs
95 | stereo_msgs: stereo_msgs
96 | trajectory_msgs: trajectory_msgs
97 | visualization_msgs: visualization_msgs
98 | console_bridge_vendor:
99 | github: ros2/console_bridge_vendor
100 | version: 1.9.1
101 | geometry2:
102 | github: ros2/geometry2
103 | version: 0.43.0
104 | modules:
105 | examples_tf2_py: examples_tf2_py
106 | geometry2: geometry2
107 | test_tf2: test_tf2
108 | tf2_bullet: tf2_bullet
109 | tf2_eigen_kdl: tf2_eigen_kdl
110 | tf2_eigen: tf2_eigen
111 | tf2_geometry_msgs: tf2_geometry_msgs
112 | tf2_kdl: tf2_kdl
113 | tf2_msgs: tf2_msgs
114 | tf2_py: tf2_py
115 | tf2_ros_py: tf2_ros_py
116 | tf2_ros: tf2_ros
117 | tf2_sensor_msgs: tf2_sensor_msgs
118 | tf2_tools: tf2_tools
119 | tf2: tf2
120 | launch_ros:
121 | github: ros2/launch_ros
122 | version: 0.29.1
123 | modules:
124 | launch_ros: launch_ros
125 | launch_testing_ros: launch_testing_ros
126 | ros2launch: ros2launch
127 | test_launch_ros: test_launch_ros
128 | launch:
129 | github: ros2/launch
130 | version: 3.9.1
131 | modules:
132 | launch_pytest: launch_pytest
133 | launch_testing_ament_cmake: launch_testing_ament_cmake
134 | launch_testing: launch_testing
135 | launch_xml: launch_xml
136 | launch_yaml: launch_yaml
137 | launch: launch
138 | test_launch_testing: test_launch_testing
139 | libstatistics_collector:
140 | github: ros-tooling/libstatistics_collector
141 | version: 2.1.1
142 | osrf_pycommon:
143 | github: osrf/osrf_pycommon
144 | version: 2.1.4
145 | osrf_testing_tools_cpp:
146 | github: osrf/osrf_testing_tools_cpp
147 | version: 2.3.0
148 | modules:
149 | osrf_testing_tools_cpp: osrf_testing_tools_cpp
150 | test_osrf_testing_tools_cpp: test_osrf_testing_tools_cpp
151 | performance_test_fixture:
152 | github: ros2/performance_test_fixture
153 | version: 0.4.0
154 | pluginlib:
155 | github: ros/pluginlib
156 | version: 5.7.0
157 | rcl_interfaces:
158 | github: ros2/rcl_interfaces
159 | version: 2.4.1
160 | modules:
161 | action_msgs: action_msgs
162 | builtin_interfaces: builtin_interfaces
163 | composition_interfaces: composition_interfaces
164 | lifecycle_msgs: lifecycle_msgs
165 | rcl_interfaces: rcl_interfaces
166 | rosgraph_msgs: rosgraph_msgs
167 | service_msgs: service_msgs
168 | statistics_msgs: statistics_msgs
169 | test_msgs: test_msgs
170 | type_description_interfaces: type_description_interfaces
171 | rcl_logging:
172 | github: ros2/rcl_logging
173 | version: 3.3.0
174 | modules:
175 | rcl_logging_interface: rcl_logging_interface
176 | rcl_logging_noop: rcl_logging_noop
177 | rcl_logging_spdlog: rcl_logging_spdlog
178 | rcl:
179 | github: ros2/rcl
180 | version: 10.2.2
181 | modules:
182 | rcl_action: rcl_action
183 | rcl_lifecycle: rcl_lifecycle
184 | rcl_yaml_param_parser: rcl_yaml_param_parser
185 | rcl: rcl
186 | rclcpp:
187 | github: ros2/rclcpp
188 | version: 30.0.0
189 | modules:
190 | rclcpp_action: rclcpp_action
191 | rclcpp_components: rclcpp_components
192 | rclcpp_lifecycle: rclcpp_lifecycle
193 | rclcpp: rclcpp
194 | rcpputils:
195 | github: ros2/rcpputils
196 | version: 2.14.2
197 | rcutils:
198 | github: ros2/rcutils
199 | version: 7.0.0
200 | rmw_connextdds:
201 | github: ros2/rmw_connextdds
202 | version: 1.2.1
203 | modules:
204 | rmw_connextdds_common: rmw_connextdds_common
205 | rmw_connextdds: rmw_connextdds
206 | rmw_connextddsmicro: rmw_connextddsmicro
207 | rti_connext_dds_cmake_module: rti_connext_dds_cmake_module
208 | rmw_cyclonedds:
209 | github: ros2/rmw_cyclonedds
210 | version: 4.1.1
211 | modules:
212 | rmw_cyclonedds_cpp: rmw_cyclonedds_cpp
213 | rmw_dds_common:
214 | github: ros2/rmw_dds_common
215 | version: 4.0.0
216 | modules:
217 | rmw_dds_common: rmw_dds_common
218 | rmw_fastrtps:
219 | github: ros2/rmw_fastrtps
220 | version: 9.4.1
221 | modules:
222 | rmw_fastrtps_cpp: rmw_fastrtps_cpp
223 | rmw_fastrtps_dynamic_cpp: rmw_fastrtps_dynamic_cpp
224 | rmw_fastrtps_shared_cpp: rmw_fastrtps_shared_cpp
225 | rmw_implementation:
226 | github: ros2/rmw_implementation
227 | version: 3.1.1
228 | modules:
229 | rmw_implementation: rmw_implementation
230 | test_rmw_implementation: test_rmw_implementation
231 | rmw_zenoh:
232 | github: ros2/rmw_zenoh
233 | version: 0.8.1
234 | modules:
235 | rmw_zenoh_cpp: rmw_zenoh_cpp
236 | zenoh_security_tools: zenoh_security_tools
237 | rmw:
238 | github: ros2/rmw
239 | version: 7.9.0
240 | modules:
241 | rmw_implementation_cmake: rmw_implementation_cmake
242 | rmw_security_common: rmw_security_common
243 | rmw: rmw
244 | ros_environment:
245 | github: ros/ros_environment
246 | version: 4.4.1
247 | ros_testing:
248 | github: ros2/ros_testing
249 | version: 0.9.0
250 | modules:
251 | ros_testing: ros_testing
252 | ros2test: ros2test
253 | ros2_tracing:
254 | github: ros2/ros2_tracing
255 | version: 8.8.0
256 | modules:
257 | lttngpy: lttngpy
258 | ros2trace: ros2trace
259 | test_ros2trace: test_ros2trace
260 | test_tracetools_launch: test_tracetools_launch
261 | test_tracetools: test_tracetools
262 | tracetools_launch: tracetools_launch
263 | tracetools_read: tracetools_read
264 | tracetools_test: tracetools_test
265 | tracetools_trace: tracetools_trace
266 | tracetools: tracetools
267 | ros2cli_common_extensions:
268 | github: ros2/ros2cli_common_extensions
269 | version: 0.5.1
270 | modules:
271 | ros2cli_common_extensions: ros2cli_common_extensions
272 | ros2cli:
273 | github: ros2/ros2cli
274 | version: 0.39.2
275 | modules:
276 | ros2action: ros2action
277 | ros2cli_test_interfaces: ros2cli_test_interfaces
278 | ros2cli: ros2cli
279 | ros2component: ros2component
280 | ros2doctor: ros2doctor
281 | ros2interface: ros2interface
282 | ros2lifecycle_test_fixtures: ros2lifecycle_test_fixtures
283 | ros2lifecycle: ros2lifecycle
284 | ros2multicast: ros2multicast
285 | ros2node: ros2node
286 | ros2param: ros2param
287 | ros2pkg: ros2pkg
288 | ros2run: ros2run
289 | ros2service: ros2service
290 | ros2topic: ros2topic
291 | rosdistro:
292 | github: ros/rosdistro
293 | version: rolling-2025-09-05
294 | upstream: rolling/2025-09-05
295 | rosidl_core:
296 | github: ros2/rosidl_core
297 | version: 0.4.0
298 | modules:
299 | rosidl_core_generators: rosidl_core_generators
300 | rosidl_core_runtime: rosidl_core_runtime
301 | rosidl_defaults:
302 | github: ros2/rosidl_defaults
303 | version: 1.8.1
304 | modules:
305 | rosidl_default_generators: rosidl_default_generators
306 | rosidl_default_runtime: rosidl_default_runtime
307 | rosidl_dynamic_typesupport_fastrtps:
308 | github: ros2/rosidl_dynamic_typesupport_fastrtps
309 | version: 0.5.0
310 | rosidl_dynamic_typesupport:
311 | github: ros2/rosidl_dynamic_typesupport
312 | version: 0.4.0
313 | rosidl_python:
314 | github: ros2/rosidl_python
315 | version: 0.25.0
316 | modules:
317 | rosidl_generator_py: rosidl_generator_py
318 | rosidl_runtime_py:
319 | github: ros2/rosidl_runtime_py
320 | version: 0.15.0
321 | rosidl_typesupport_fastrtps:
322 | github: ros2/rosidl_typesupport_fastrtps
323 | version: 3.9.0
324 | modules:
325 | rosidl_typesupport_fastrtps_c: rosidl_typesupport_fastrtps_c
326 | rosidl_typesupport_fastrtps_cpp: rosidl_typesupport_fastrtps_cpp
327 | rosidl_typesupport_protobuf:
328 | github: asymingt/rosidl_typesupport_protobuf
329 | version: 0.0.1
330 | modules:
331 | rosidl_adapter_proto: rosidl_adapter_proto
332 | rosidl_typeadapter_protobuf_test: rosidl_typeadapter_protobuf_test
333 | rosidl_typesupport_protobuf_c: rosidl_typesupport_protobuf_c
334 | rosidl_typesupport_protobuf_cpp: rosidl_typesupport_protobuf_cpp
335 | rosidl_typesupport_protobuf: rosidl_typesupport_protobuf
336 | rosidl_typesupport:
337 | github: ros2/rosidl_typesupport
338 | version: 3.4.0
339 | modules:
340 | rosidl_typesupport_c: rosidl_typesupport_c
341 | rosidl_typesupport_cpp: rosidl_typesupport_cpp
342 | rosidl_typesupport_tests: rosidl_typesupport_tests
343 | rosidl:
344 | github: ros2/rosidl
345 | version: 5.0.0
346 | modules:
347 | rosidl_adapter: rosidl_adapter
348 | rosidl_cli: rosidl_cli
349 | rosidl_cmake: rosidl_cmake
350 | rosidl_generator_c: rosidl_generator_c
351 | rosidl_generator_cpp: rosidl_generator_cpp
352 | rosidl_generator_tests: rosidl_generator_tests
353 | rosidl_generator_type_description: rosidl_generator_type_description
354 | rosidl_parser: rosidl_parser
355 | rosidl_pycommon: rosidl_pycommon
356 | rosidl_runtime_c: rosidl_runtime_c
357 | rosidl_runtime_cpp: rosidl_runtime_cpp
358 | rosidl_typesupport_interface: rosidl_typesupport_interface
359 | rosidl_typesupport_introspection_c: rosidl_typesupport_introspection_c
360 | rosidl_typesupport_introspection_cpp: rosidl_typesupport_introspection_cpp
361 | rosidl_typesupport_introspection_tests: rosidl_typesupport_introspection_tests
362 | rpyutils:
363 | github: ros2/rpyutils
364 | version: 0.7.0
365 | sros2:
366 | github: ros2/sros2
367 | version: 0.16.1
368 | modules:
369 | sros2_cmake: sros2_cmake
370 | sros2: sros2
371 | test_interface_files:
372 | github: ros2/test_interface_files
373 | version: 0.14.1
374 | unique_identifier_msgs:
375 | github: ros2/unique_identifier_msgs
376 | version: 2.8.0
377 | variants:
378 | github: ros2/variants
379 | version: 0.13.0
380 | modules:
381 | desktop_full: desktop_full
382 | desktop: desktop
383 | perception: perception
384 | ros_base: ros_base
385 | ros_core: ros_core
386 | simulation: simulation
387 | cyclonedds:
388 | github: eclipse-cyclonedds/cyclonedds
389 | version: 0.10.5
390 | folder: thirdparty
391 | fastcdr:
392 | github: eProsima/Fast-CDR
393 | version: 2.3.0
394 | upstream: v2.3.0
395 | folder: thirdparty
396 | fastdds:
397 | github: eProsima/Fast-DDS
398 | version: 3.2.2
399 | upstream: v3.2.2
400 | folder: thirdparty
401 | iceoryx:
402 | github: eclipse-iceoryx/iceoryx
403 | version: 2.0.5
404 | upstream: v2.0.5
405 | folder: thirdparty
406 | lttng-ust:
407 | github: lttng/lttng-ust
408 | version: 2.14.0
409 | upstream: v2.14.0
410 | folder: thirdparty
411 | mimick:
412 | github: ros2/Mimick
413 | version: 0.9.0
414 | upstream: ros2
415 | folder: thirdparty
416 | zenoh-c:
417 | github: eclipse-zenoh/zenoh-c
418 | version: 1.4.0
419 | folder: thirdparty
420 | zenoh-cpp:
421 | github: eclipse-zenoh/zenoh-cpp
422 | version: 1.4.0
423 | folder: thirdparty
424 |
--------------------------------------------------------------------------------
/MODULE.bazel:
--------------------------------------------------------------------------------
1 | # Copyright 2025 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 | module(
16 | name = "bazel_ros_demo",
17 | version = "0.0.1",
18 | compatibility_level = 0,
19 | )
20 |
21 | # System dependencies
22 |
23 | bazel_dep(name = "bazel_skylib", version = "1.8.2")
24 | bazel_dep(name = "cmake_configure_file", version = "0.1.3")
25 | bazel_dep(name = "google_benchmark", version = "1.9.4")
26 | bazel_dep(name = "googletest", version = "1.17.0")
27 | bazel_dep(name = "platforms", version = "1.0.0")
28 | bazel_dep(name = "protobuf", version = "32.0")
29 | bazel_dep(name = "rules_cc", version = "0.2.4")
30 | bazel_dep(name = "rules_foreign_cc", version = "0.15.0")
31 | bazel_dep(name = "rules_python", version = "1.6.1")
32 | bazel_dep(name = "rules_rust", version = "0.64.0")
33 | bazel_dep(name = "rules_shell", version = "0.6.1")
34 | bazel_dep(name = "toolchains_llvm", version = "1.5.0")
35 | bazel_dep(name = "userspace_rcu", version = "0.15.4")
36 |
37 | # Third party (things we intend to add to the BCR)
38 |
39 | bazel_dep(name = "cyclonedds", version = "0.10.5")
40 | bazel_dep(name = "fastcdr", version = "2.3.0")
41 | bazel_dep(name = "fastdds", version = "3.2.2")
42 | bazel_dep(name = "iceoryx", version = "2.0.5")
43 | bazel_dep(name = "lttng-ust", version = "2.14.0")
44 | bazel_dep(name = "mimick", version = "0.9.0")
45 | bazel_dep(name = "zenoh-c", version = "1.4.0")
46 | bazel_dep(name = "zenoh-cpp", version = "1.4.0")
47 |
48 | # Dependencies for a specific rolling snapshot
49 |
50 | bazel_dep(name = "rosdistro", version = "rolling-2025-09-05")
51 |
52 | # ROS packages (things we intend to add to the RCR)
53 |
54 | bazel_dep(name = "action_msgs", version = "2.4.1")
55 | bazel_dep(name = "ament_clang_format", version = "0.20.1")
56 | bazel_dep(name = "ament_clang_tidy", version = "0.20.1")
57 | bazel_dep(name = "ament_cmake_auto", version = "2.8.4")
58 | bazel_dep(name = "ament_cmake_clang_format", version = "0.20.1")
59 | bazel_dep(name = "ament_cmake_clang_tidy", version = "0.20.1")
60 | bazel_dep(name = "ament_cmake_copyright", version = "0.20.1")
61 | bazel_dep(name = "ament_cmake_core", version = "2.8.4")
62 | bazel_dep(name = "ament_cmake_cppcheck", version = "0.20.1")
63 | bazel_dep(name = "ament_cmake_cpplint", version = "0.20.1")
64 | bazel_dep(name = "ament_cmake_export_definitions", version = "2.8.4")
65 | bazel_dep(name = "ament_cmake_export_dependencies", version = "2.8.4")
66 | bazel_dep(name = "ament_cmake_export_include_directories", version = "2.8.4")
67 | bazel_dep(name = "ament_cmake_export_libraries", version = "2.8.4")
68 | bazel_dep(name = "ament_cmake_export_link_flags", version = "2.8.4")
69 | bazel_dep(name = "ament_cmake_export_targets", version = "2.8.4")
70 | bazel_dep(name = "ament_cmake_flake8", version = "0.20.1")
71 | bazel_dep(name = "ament_cmake_gen_version_h", version = "2.8.4")
72 | bazel_dep(name = "ament_cmake_gmock", version = "2.8.4")
73 | bazel_dep(name = "ament_cmake_google_benchmark", version = "2.8.4")
74 | bazel_dep(name = "ament_cmake_gtest", version = "2.8.4")
75 | bazel_dep(name = "ament_cmake_include_directories", version = "2.8.4")
76 | bazel_dep(name = "ament_cmake_libraries", version = "2.8.4")
77 | bazel_dep(name = "ament_cmake_lint_cmake", version = "0.20.1")
78 | bazel_dep(name = "ament_cmake_mypy", version = "0.20.1")
79 | bazel_dep(name = "ament_cmake_pclint", version = "0.20.1")
80 | bazel_dep(name = "ament_cmake_pep257", version = "0.20.1")
81 | bazel_dep(name = "ament_cmake_pycodestyle", version = "0.20.1")
82 | bazel_dep(name = "ament_cmake_pyflakes", version = "0.20.1")
83 | bazel_dep(name = "ament_cmake_pytest", version = "2.8.4")
84 | bazel_dep(name = "ament_cmake_python", version = "2.8.4")
85 | bazel_dep(name = "ament_cmake_ros_core", version = "0.15.1")
86 | bazel_dep(name = "ament_cmake_ros", version = "0.15.1")
87 | bazel_dep(name = "ament_cmake_target_dependencies", version = "2.8.4")
88 | bazel_dep(name = "ament_cmake_test", version = "2.8.4")
89 | bazel_dep(name = "ament_cmake_uncrustify", version = "0.20.1")
90 | bazel_dep(name = "ament_cmake_vendor_package", version = "2.8.4")
91 | bazel_dep(name = "ament_cmake_version", version = "2.8.4")
92 | bazel_dep(name = "ament_cmake_xmllint", version = "0.20.1")
93 | bazel_dep(name = "ament_cmake", version = "2.8.4")
94 | bazel_dep(name = "ament_copyright", version = "0.20.1")
95 | bazel_dep(name = "ament_cppcheck", version = "0.20.1")
96 | bazel_dep(name = "ament_cpplint", version = "0.20.1")
97 | bazel_dep(name = "ament_flake8", version = "0.20.1")
98 | bazel_dep(name = "ament_index_cpp", version = "1.12.0")
99 | bazel_dep(name = "ament_index_python", version = "1.12.0")
100 | bazel_dep(name = "ament_lint_auto", version = "0.20.1")
101 | bazel_dep(name = "ament_lint_cmake", version = "0.20.1")
102 | bazel_dep(name = "ament_lint_common", version = "0.20.1")
103 | bazel_dep(name = "ament_lint", version = "0.20.1")
104 | bazel_dep(name = "ament_mypy", version = "0.20.1")
105 | bazel_dep(name = "ament_package", version = "0.18.0")
106 | bazel_dep(name = "ament_pclint", version = "0.20.1")
107 | bazel_dep(name = "ament_pep257", version = "0.20.1")
108 | bazel_dep(name = "ament_pycodestyle", version = "0.20.1")
109 | bazel_dep(name = "ament_pyflakes", version = "0.20.1")
110 | bazel_dep(name = "ament_uncrustify", version = "0.20.1")
111 | bazel_dep(name = "ament_xmllint", version = "0.20.1")
112 | bazel_dep(name = "builtin_interfaces", version = "2.4.1")
113 | bazel_dep(name = "class_loader", version = "2.9.0")
114 | bazel_dep(name = "common_interfaces", version = "5.8.1")
115 | bazel_dep(name = "composition_interfaces", version = "2.4.1")
116 | bazel_dep(name = "console_bridge_vendor", version = "1.9.1")
117 | bazel_dep(name = "desktop_full", version = "0.13.0")
118 | bazel_dep(name = "desktop", version = "0.13.0")
119 | bazel_dep(name = "diagnostic_msgs", version = "5.8.1")
120 | bazel_dep(name = "domain_coordinator", version = "0.15.1")
121 | bazel_dep(name = "examples_tf2_py", version = "0.43.0")
122 | bazel_dep(name = "geometry_msgs", version = "5.8.1")
123 | bazel_dep(name = "geometry2", version = "0.43.0")
124 | bazel_dep(name = "launch_pytest", version = "3.9.1")
125 | bazel_dep(name = "launch_ros", version = "0.29.1")
126 | bazel_dep(name = "launch_testing_ament_cmake", version = "3.9.1")
127 | bazel_dep(name = "launch_testing_ros", version = "0.29.1")
128 | bazel_dep(name = "launch_testing", version = "3.9.1")
129 | bazel_dep(name = "launch_xml", version = "3.9.1")
130 | bazel_dep(name = "launch_yaml", version = "3.9.1")
131 | bazel_dep(name = "launch", version = "3.9.1")
132 | bazel_dep(name = "libstatistics_collector", version = "2.1.1")
133 | bazel_dep(name = "lifecycle_msgs", version = "2.4.1")
134 | bazel_dep(name = "lttngpy", version = "8.8.0")
135 | bazel_dep(name = "nav_msgs", version = "5.8.1")
136 | bazel_dep(name = "osrf_pycommon", version = "2.1.4")
137 | bazel_dep(name = "osrf_testing_tools_cpp", version = "2.3.0")
138 | bazel_dep(name = "perception", version = "0.13.0")
139 | bazel_dep(name = "performance_test_fixture", version = "0.4.0")
140 | bazel_dep(name = "pluginlib", version = "5.7.0")
141 | bazel_dep(name = "rcl_action", version = "10.2.2")
142 | bazel_dep(name = "rcl_interfaces", version = "2.4.1")
143 | bazel_dep(name = "rcl_lifecycle", version = "10.2.2")
144 | bazel_dep(name = "rcl_logging_interface", version = "3.3.0")
145 | bazel_dep(name = "rcl_logging_noop", version = "3.3.0")
146 | bazel_dep(name = "rcl_logging_spdlog", version = "3.3.0")
147 | bazel_dep(name = "rcl_yaml_param_parser", version = "10.2.2")
148 | bazel_dep(name = "rcl", version = "10.2.2")
149 | bazel_dep(name = "rclcpp_action", version = "30.0.0")
150 | bazel_dep(name = "rclcpp_components", version = "30.0.0")
151 | bazel_dep(name = "rclcpp_lifecycle", version = "30.0.0")
152 | bazel_dep(name = "rclcpp", version = "30.0.0")
153 | bazel_dep(name = "rcpputils", version = "2.14.2")
154 | bazel_dep(name = "rcutils", version = "7.0.0")
155 | bazel_dep(name = "rmw_connextdds_common", version = "1.2.1")
156 | bazel_dep(name = "rmw_connextdds", version = "1.2.1")
157 | bazel_dep(name = "rmw_connextddsmicro", version = "1.2.1")
158 | bazel_dep(name = "rmw_cyclonedds_cpp", version = "4.1.1")
159 | bazel_dep(name = "rmw_dds_common", version = "4.0.0")
160 | bazel_dep(name = "rmw_fastrtps_cpp", version = "9.4.1")
161 | bazel_dep(name = "rmw_fastrtps_dynamic_cpp", version = "9.4.1")
162 | bazel_dep(name = "rmw_fastrtps_shared_cpp", version = "9.4.1")
163 | bazel_dep(name = "rmw_implementation_cmake", version = "7.9.0")
164 | bazel_dep(name = "rmw_implementation", version = "3.1.1")
165 | bazel_dep(name = "rmw_security_common", version = "7.9.0")
166 | bazel_dep(name = "rmw_test_fixture_implementation", version = "0.15.1")
167 | bazel_dep(name = "rmw_test_fixture", version = "0.15.1")
168 | bazel_dep(name = "rmw_zenoh_cpp", version = "0.8.1")
169 | bazel_dep(name = "rmw", version = "7.9.0")
170 | bazel_dep(name = "ros_base", version = "0.13.0")
171 | bazel_dep(name = "ros_core", version = "0.13.0")
172 | bazel_dep(name = "ros_environment", version = "4.4.1")
173 | bazel_dep(name = "ros_testing", version = "0.9.0")
174 | bazel_dep(name = "ros2action", version = "0.39.2")
175 | bazel_dep(name = "ros2cli_common_extensions", version = "0.5.1")
176 | bazel_dep(name = "ros2cli_test_interfaces", version = "0.39.2")
177 | bazel_dep(name = "ros2cli", version = "0.39.2")
178 | bazel_dep(name = "ros2component", version = "0.39.2")
179 | bazel_dep(name = "ros2doctor", version = "0.39.2")
180 | bazel_dep(name = "ros2interface", version = "0.39.2")
181 | bazel_dep(name = "ros2launch", version = "0.29.1")
182 | bazel_dep(name = "ros2lifecycle_test_fixtures", version = "0.39.2")
183 | bazel_dep(name = "ros2lifecycle", version = "0.39.2")
184 | bazel_dep(name = "ros2multicast", version = "0.39.2")
185 | bazel_dep(name = "ros2node", version = "0.39.2")
186 | bazel_dep(name = "ros2param", version = "0.39.2")
187 | bazel_dep(name = "ros2pkg", version = "0.39.2")
188 | bazel_dep(name = "ros2run", version = "0.39.2")
189 | bazel_dep(name = "ros2service", version = "0.39.2")
190 | bazel_dep(name = "ros2test", version = "0.9.0")
191 | bazel_dep(name = "ros2topic", version = "0.39.2")
192 | bazel_dep(name = "ros2trace", version = "8.8.0")
193 | bazel_dep(name = "rosgraph_msgs", version = "2.4.1")
194 | bazel_dep(name = "rosidl_adapter_proto", version = "0.0.1")
195 | bazel_dep(name = "rosidl_adapter", version = "5.0.0")
196 | bazel_dep(name = "rosidl_cli", version = "5.0.0")
197 | bazel_dep(name = "rosidl_cmake", version = "5.0.0")
198 | bazel_dep(name = "rosidl_core_generators", version = "0.4.0")
199 | bazel_dep(name = "rosidl_core_runtime", version = "0.4.0")
200 | bazel_dep(name = "rosidl_default_generators", version = "1.8.1")
201 | bazel_dep(name = "rosidl_default_runtime", version = "1.8.1")
202 | bazel_dep(name = "rosidl_dynamic_typesupport_fastrtps", version = "0.5.0")
203 | bazel_dep(name = "rosidl_dynamic_typesupport", version = "0.4.0")
204 | bazel_dep(name = "rosidl_generator_c", version = "5.0.0")
205 | bazel_dep(name = "rosidl_generator_cpp", version = "5.0.0")
206 | bazel_dep(name = "rosidl_generator_py", version = "0.25.0")
207 | bazel_dep(name = "rosidl_generator_tests", version = "5.0.0")
208 | bazel_dep(name = "rosidl_generator_type_description", version = "5.0.0")
209 | bazel_dep(name = "rosidl_parser", version = "5.0.0")
210 | bazel_dep(name = "rosidl_pycommon", version = "5.0.0")
211 | bazel_dep(name = "rosidl_runtime_c", version = "5.0.0")
212 | bazel_dep(name = "rosidl_runtime_cpp", version = "5.0.0")
213 | bazel_dep(name = "rosidl_runtime_py", version = "0.15.0")
214 | bazel_dep(name = "rosidl_typeadapter_protobuf_test", version = "0.0.1")
215 | bazel_dep(name = "rosidl_typesupport_c", version = "3.4.0")
216 | bazel_dep(name = "rosidl_typesupport_cpp", version = "3.4.0")
217 | bazel_dep(name = "rosidl_typesupport_fastrtps_c", version = "3.9.0")
218 | bazel_dep(name = "rosidl_typesupport_fastrtps_cpp", version = "3.9.0")
219 | bazel_dep(name = "rosidl_typesupport_interface", version = "5.0.0")
220 | bazel_dep(name = "rosidl_typesupport_introspection_c", version = "5.0.0")
221 | bazel_dep(name = "rosidl_typesupport_introspection_cpp", version = "5.0.0")
222 | bazel_dep(name = "rosidl_typesupport_introspection_tests", version = "5.0.0")
223 | bazel_dep(name = "rosidl_typesupport_protobuf_c", version = "0.0.1")
224 | bazel_dep(name = "rosidl_typesupport_protobuf_cpp", version = "0.0.1")
225 | bazel_dep(name = "rosidl_typesupport_protobuf", version = "0.0.1")
226 | bazel_dep(name = "rosidl_typesupport_tests", version = "3.4.0")
227 | bazel_dep(name = "rpyutils", version = "0.7.0")
228 | bazel_dep(name = "rti_connext_dds_cmake_module", version = "1.2.1")
229 | bazel_dep(name = "sensor_msgs_py", version = "5.8.1")
230 | bazel_dep(name = "sensor_msgs", version = "5.8.1")
231 | bazel_dep(name = "service_msgs", version = "2.4.1")
232 | bazel_dep(name = "shape_msgs", version = "5.8.1")
233 | bazel_dep(name = "simulation", version = "0.13.0")
234 | bazel_dep(name = "sros2_cmake", version = "0.16.1")
235 | bazel_dep(name = "sros2", version = "0.16.1")
236 | bazel_dep(name = "statistics_msgs", version = "2.4.1")
237 | bazel_dep(name = "std_msgs", version = "5.8.1")
238 | bazel_dep(name = "std_srvs", version = "5.8.1")
239 | bazel_dep(name = "stereo_msgs", version = "5.8.1")
240 | bazel_dep(name = "test_interface_files", version = "0.14.1")
241 | bazel_dep(name = "test_launch_ros", version = "0.29.1")
242 | bazel_dep(name = "test_launch_testing", version = "3.9.1")
243 | bazel_dep(name = "test_msgs", version = "2.4.1")
244 | bazel_dep(name = "test_osrf_testing_tools_cpp", version = "2.3.0")
245 | bazel_dep(name = "test_rmw_implementation", version = "3.1.1")
246 | bazel_dep(name = "test_ros2trace", version = "8.8.0")
247 | bazel_dep(name = "test_tf2", version = "0.43.0")
248 | bazel_dep(name = "test_tracetools_launch", version = "8.8.0")
249 | bazel_dep(name = "test_tracetools", version = "8.8.0")
250 | bazel_dep(name = "tf2_bullet", version = "0.43.0")
251 | bazel_dep(name = "tf2_eigen_kdl", version = "0.43.0")
252 | bazel_dep(name = "tf2_eigen", version = "0.43.0")
253 | bazel_dep(name = "tf2_geometry_msgs", version = "0.43.0")
254 | bazel_dep(name = "tf2_kdl", version = "0.43.0")
255 | bazel_dep(name = "tf2_msgs", version = "0.43.0")
256 | bazel_dep(name = "tf2_py", version = "0.43.0")
257 | bazel_dep(name = "tf2_ros_py", version = "0.43.0")
258 | bazel_dep(name = "tf2_ros", version = "0.43.0")
259 | bazel_dep(name = "tf2_sensor_msgs", version = "0.43.0")
260 | bazel_dep(name = "tf2_tools", version = "0.43.0")
261 | bazel_dep(name = "tf2", version = "0.43.0")
262 | bazel_dep(name = "tracetools_launch", version = "8.8.0")
263 | bazel_dep(name = "tracetools_read", version = "8.8.0")
264 | bazel_dep(name = "tracetools_test", version = "8.8.0")
265 | bazel_dep(name = "tracetools_trace", version = "8.8.0")
266 | bazel_dep(name = "tracetools", version = "8.8.0")
267 | bazel_dep(name = "trajectory_msgs", version = "5.8.1")
268 | bazel_dep(name = "type_description_interfaces", version = "2.4.1")
269 | bazel_dep(name = "unique_identifier_msgs", version = "2.8.0")
270 | bazel_dep(name = "visualization_msgs", version = "5.8.1")
271 | bazel_dep(name = "zenoh_security_tools", version = "0.8.1")
272 |
273 | # Overrides (enable these for development)
274 |
275 | local_path_override(module_name = "cyclonedds", path = "./thirdparty/cyclonedds")
276 | local_path_override(module_name = "fastcdr", path = "./thirdparty/fastcdr")
277 | local_path_override(module_name = "fastdds", path = "./thirdparty/fastdds")
278 | local_path_override(module_name = "iceoryx", path = "./thirdparty/iceoryx")
279 | local_path_override(module_name = "lttng-ust", path = "./thirdparty/lttng-ust")
280 | local_path_override(module_name = "mimick", path = "./thirdparty/mimick")
281 | local_path_override(module_name = "zenoh-c", path = "./thirdparty/zenoh-c")
282 | local_path_override(module_name = "zenoh-cpp", path = "./thirdparty/zenoh-cpp")
283 |
284 | local_path_override(module_name = "action_msgs", path = "./submodules/rcl_interfaces/action_msgs")
285 | local_path_override(module_name = "ament_clang_format", path = "./submodules/ament_lint/ament_clang_format")
286 | local_path_override(module_name = "ament_clang_tidy", path = "./submodules/ament_lint/ament_clang_tidy")
287 | local_path_override(module_name = "ament_cmake_auto", path = "./submodules/ament_cmake/ament_cmake_auto")
288 | local_path_override(module_name = "ament_cmake_clang_format", path = "./submodules/ament_lint/ament_cmake_clang_format")
289 | local_path_override(module_name = "ament_cmake_clang_tidy", path = "./submodules/ament_lint/ament_cmake_clang_tidy")
290 | local_path_override(module_name = "ament_cmake_copyright", path = "./submodules/ament_lint/ament_cmake_copyright")
291 | local_path_override(module_name = "ament_cmake_core", path = "./submodules/ament_cmake/ament_cmake_core")
292 | local_path_override(module_name = "ament_cmake_cppcheck", path = "./submodules/ament_lint/ament_cmake_cppcheck")
293 | local_path_override(module_name = "ament_cmake_cpplint", path = "./submodules/ament_lint/ament_cmake_cpplint")
294 | local_path_override(module_name = "ament_cmake_export_definitions", path = "./submodules/ament_cmake/ament_cmake_export_definitions")
295 | local_path_override(module_name = "ament_cmake_export_dependencies", path = "./submodules/ament_cmake/ament_cmake_export_dependencies")
296 | local_path_override(module_name = "ament_cmake_export_include_directories", path = "./submodules/ament_cmake/ament_cmake_export_include_directories")
297 | local_path_override(module_name = "ament_cmake_export_libraries", path = "./submodules/ament_cmake/ament_cmake_export_libraries")
298 | local_path_override(module_name = "ament_cmake_export_link_flags", path = "./submodules/ament_cmake/ament_cmake_export_link_flags")
299 | local_path_override(module_name = "ament_cmake_export_targets", path = "./submodules/ament_cmake/ament_cmake_export_targets")
300 | local_path_override(module_name = "ament_cmake_flake8", path = "./submodules/ament_lint/ament_cmake_flake8")
301 | local_path_override(module_name = "ament_cmake_gen_version_h", path = "./submodules/ament_cmake/ament_cmake_gen_version_h")
302 | local_path_override(module_name = "ament_cmake_gmock", path = "./submodules/ament_cmake/ament_cmake_gmock")
303 | local_path_override(module_name = "ament_cmake_google_benchmark", path = "./submodules/ament_cmake/ament_cmake_google_benchmark")
304 | local_path_override(module_name = "ament_cmake_gtest", path = "./submodules/ament_cmake/ament_cmake_gtest")
305 | local_path_override(module_name = "ament_cmake_include_directories", path = "./submodules/ament_cmake/ament_cmake_include_directories")
306 | local_path_override(module_name = "ament_cmake_libraries", path = "./submodules/ament_cmake/ament_cmake_libraries")
307 | local_path_override(module_name = "ament_cmake_lint_cmake", path = "./submodules/ament_lint/ament_cmake_lint_cmake")
308 | local_path_override(module_name = "ament_cmake_mypy", path = "./submodules/ament_lint/ament_cmake_mypy")
309 | local_path_override(module_name = "ament_cmake_pclint", path = "./submodules/ament_lint/ament_cmake_pclint")
310 | local_path_override(module_name = "ament_cmake_pep257", path = "./submodules/ament_lint/ament_cmake_pep257")
311 | local_path_override(module_name = "ament_cmake_pycodestyle", path = "./submodules/ament_lint/ament_cmake_pycodestyle")
312 | local_path_override(module_name = "ament_cmake_pyflakes", path = "./submodules/ament_lint/ament_cmake_pyflakes")
313 | local_path_override(module_name = "ament_cmake_pytest", path = "./submodules/ament_cmake/ament_cmake_pytest")
314 | local_path_override(module_name = "ament_cmake_python", path = "./submodules/ament_cmake/ament_cmake_python")
315 | local_path_override(module_name = "ament_cmake_ros_core", path = "./submodules/ament_cmake_ros/ament_cmake_ros_core")
316 | local_path_override(module_name = "ament_cmake_ros", path = "./submodules/ament_cmake_ros/ament_cmake_ros")
317 | local_path_override(module_name = "ament_cmake_target_dependencies", path = "./submodules/ament_cmake/ament_cmake_target_dependencies")
318 | local_path_override(module_name = "ament_cmake_test", path = "./submodules/ament_cmake/ament_cmake_test")
319 | local_path_override(module_name = "ament_cmake_uncrustify", path = "./submodules/ament_lint/ament_cmake_uncrustify")
320 | local_path_override(module_name = "ament_cmake_vendor_package", path = "./submodules/ament_cmake/ament_cmake_vendor_package")
321 | local_path_override(module_name = "ament_cmake_version", path = "./submodules/ament_cmake/ament_cmake_version")
322 | local_path_override(module_name = "ament_cmake_xmllint", path = "./submodules/ament_lint/ament_cmake_xmllint")
323 | local_path_override(module_name = "ament_cmake", path = "./submodules/ament_cmake/ament_cmake")
324 | local_path_override(module_name = "ament_copyright", path = "./submodules/ament_lint/ament_copyright")
325 | local_path_override(module_name = "ament_cppcheck", path = "./submodules/ament_lint/ament_cppcheck")
326 | local_path_override(module_name = "ament_cpplint", path = "./submodules/ament_lint/ament_cpplint")
327 | local_path_override(module_name = "ament_flake8", path = "./submodules/ament_lint/ament_flake8")
328 | local_path_override(module_name = "ament_index_cpp", path = "./submodules/ament_index/ament_index_cpp")
329 | local_path_override(module_name = "ament_index_python", path = "./submodules/ament_index/ament_index_python")
330 | local_path_override(module_name = "ament_lint_auto", path = "./submodules/ament_lint/ament_lint_auto")
331 | local_path_override(module_name = "ament_lint_cmake", path = "./submodules/ament_lint/ament_lint_cmake")
332 | local_path_override(module_name = "ament_lint_common", path = "./submodules/ament_lint/ament_lint_common")
333 | local_path_override(module_name = "ament_lint", path = "./submodules/ament_lint/ament_lint")
334 | local_path_override(module_name = "ament_mypy", path = "./submodules/ament_lint/ament_mypy")
335 | local_path_override(module_name = "ament_package", path = "./submodules/ament_package")
336 | local_path_override(module_name = "ament_pclint", path = "./submodules/ament_lint/ament_pclint")
337 | local_path_override(module_name = "ament_pep257", path = "./submodules/ament_lint/ament_pep257")
338 | local_path_override(module_name = "ament_pycodestyle", path = "./submodules/ament_lint/ament_pycodestyle")
339 | local_path_override(module_name = "ament_pyflakes", path = "./submodules/ament_lint/ament_pyflakes")
340 | local_path_override(module_name = "ament_uncrustify", path = "./submodules/ament_lint/ament_uncrustify")
341 | local_path_override(module_name = "ament_xmllint", path = "./submodules/ament_lint/ament_xmllint")
342 | local_path_override(module_name = "builtin_interfaces", path = "./submodules/rcl_interfaces/builtin_interfaces")
343 | local_path_override(module_name = "class_loader", path = "./submodules/class_loader")
344 | local_path_override(module_name = "common_interfaces", path = "./submodules/common_interfaces/common_interfaces")
345 | local_path_override(module_name = "composition_interfaces", path = "./submodules/rcl_interfaces/composition_interfaces")
346 | local_path_override(module_name = "console_bridge_vendor", path = "./submodules/console_bridge_vendor")
347 | local_path_override(module_name = "desktop_full", path = "./submodules/variants/desktop_full")
348 | local_path_override(module_name = "desktop", path = "./submodules/variants/desktop")
349 | local_path_override(module_name = "diagnostic_msgs", path = "./submodules/common_interfaces/diagnostic_msgs")
350 | local_path_override(module_name = "domain_coordinator", path = "./submodules/ament_cmake_ros/domain_coordinator")
351 | local_path_override(module_name = "examples_tf2_py", path = "./submodules/geometry2/examples_tf2_py")
352 | local_path_override(module_name = "geometry_msgs", path = "./submodules/common_interfaces/geometry_msgs")
353 | local_path_override(module_name = "geometry2", path = "./submodules/geometry2/geometry2")
354 | local_path_override(module_name = "launch_pytest", path = "./submodules/launch/launch_pytest")
355 | local_path_override(module_name = "launch_ros", path = "./submodules/launch_ros/launch_ros")
356 | local_path_override(module_name = "launch_testing_ament_cmake", path = "./submodules/launch/launch_testing_ament_cmake")
357 | local_path_override(module_name = "launch_testing_ros", path = "./submodules/launch_ros/launch_testing_ros")
358 | local_path_override(module_name = "launch_testing", path = "./submodules/launch/launch_testing")
359 | local_path_override(module_name = "launch_xml", path = "./submodules/launch/launch_xml")
360 | local_path_override(module_name = "launch_yaml", path = "./submodules/launch/launch_yaml")
361 | local_path_override(module_name = "launch", path = "./submodules/launch/launch")
362 | local_path_override(module_name = "libstatistics_collector", path = "./submodules/libstatistics_collector")
363 | local_path_override(module_name = "lifecycle_msgs", path = "./submodules/rcl_interfaces/lifecycle_msgs")
364 | local_path_override(module_name = "lttngpy", path = "./submodules/ros2_tracing/lttngpy")
365 | local_path_override(module_name = "nav_msgs", path = "./submodules/common_interfaces/nav_msgs")
366 | local_path_override(module_name = "osrf_pycommon", path = "./submodules/osrf_pycommon")
367 | local_path_override(module_name = "osrf_testing_tools_cpp", path = "./submodules/osrf_testing_tools_cpp/osrf_testing_tools_cpp")
368 | local_path_override(module_name = "perception", path = "./submodules/variants/perception")
369 | local_path_override(module_name = "performance_test_fixture", path = "./submodules/performance_test_fixture")
370 | local_path_override(module_name = "pluginlib", path = "./submodules/pluginlib")
371 | local_path_override(module_name = "rcl_action", path = "./submodules/rcl/rcl_action")
372 | local_path_override(module_name = "rcl_interfaces", path = "./submodules/rcl_interfaces/rcl_interfaces")
373 | local_path_override(module_name = "rcl_lifecycle", path = "./submodules/rcl/rcl_lifecycle")
374 | local_path_override(module_name = "rcl_logging_interface", path = "./submodules/rcl_logging/rcl_logging_interface")
375 | local_path_override(module_name = "rcl_logging_noop", path = "./submodules/rcl_logging/rcl_logging_noop")
376 | local_path_override(module_name = "rcl_logging_spdlog", path = "./submodules/rcl_logging/rcl_logging_spdlog")
377 | local_path_override(module_name = "rcl_yaml_param_parser", path = "./submodules/rcl/rcl_yaml_param_parser")
378 | local_path_override(module_name = "rcl", path = "./submodules/rcl/rcl")
379 | local_path_override(module_name = "rclcpp_action", path = "./submodules/rclcpp/rclcpp_action")
380 | local_path_override(module_name = "rclcpp_components", path = "./submodules/rclcpp/rclcpp_components")
381 | local_path_override(module_name = "rclcpp_lifecycle", path = "./submodules/rclcpp/rclcpp_lifecycle")
382 | local_path_override(module_name = "rclcpp", path = "./submodules/rclcpp/rclcpp")
383 | local_path_override(module_name = "rcpputils", path = "./submodules/rcpputils")
384 | local_path_override(module_name = "rcutils", path = "./submodules/rcutils")
385 | local_path_override(module_name = "rmw_connextdds_common", path = "./submodules/rmw_connextdds/rmw_connextdds_common")
386 | local_path_override(module_name = "rmw_connextdds", path = "./submodules/rmw_connextdds/rmw_connextdds")
387 | local_path_override(module_name = "rmw_connextddsmicro", path = "./submodules/rmw_connextdds/rmw_connextddsmicro")
388 | local_path_override(module_name = "rmw_cyclonedds_cpp", path = "./submodules/rmw_cyclonedds/rmw_cyclonedds_cpp")
389 | local_path_override(module_name = "rmw_dds_common", path = "./submodules/rmw_dds_common/rmw_dds_common")
390 | local_path_override(module_name = "rmw_fastrtps_cpp", path = "./submodules/rmw_fastrtps/rmw_fastrtps_cpp")
391 | local_path_override(module_name = "rmw_fastrtps_dynamic_cpp", path = "./submodules/rmw_fastrtps/rmw_fastrtps_dynamic_cpp")
392 | local_path_override(module_name = "rmw_fastrtps_shared_cpp", path = "./submodules/rmw_fastrtps/rmw_fastrtps_shared_cpp")
393 | local_path_override(module_name = "rmw_implementation_cmake", path = "./submodules/rmw/rmw_implementation_cmake")
394 | local_path_override(module_name = "rmw_implementation", path = "./submodules/rmw_implementation/rmw_implementation")
395 | local_path_override(module_name = "rmw_security_common", path = "./submodules/rmw/rmw_security_common")
396 | local_path_override(module_name = "rmw_test_fixture_implementation", path = "./submodules/ament_cmake_ros/rmw_test_fixture_implementation")
397 | local_path_override(module_name = "rmw_test_fixture", path = "./submodules/ament_cmake_ros/rmw_test_fixture")
398 | local_path_override(module_name = "rmw_zenoh_cpp", path = "./submodules/rmw_zenoh/rmw_zenoh_cpp")
399 | local_path_override(module_name = "rmw", path = "./submodules/rmw/rmw")
400 | local_path_override(module_name = "ros_base", path = "./submodules/variants/ros_base")
401 | local_path_override(module_name = "ros_core", path = "./submodules/variants/ros_core")
402 | local_path_override(module_name = "ros_environment", path = "./submodules/ros_environment")
403 | local_path_override(module_name = "ros_testing", path = "./submodules/ros_testing/ros_testing")
404 | local_path_override(module_name = "rosdistro", path = "./submodules/rosdistro")
405 | local_path_override(module_name = "ros2action", path = "./submodules/ros2cli/ros2action")
406 | local_path_override(module_name = "ros2cli_common_extensions", path = "./submodules/ros2cli_common_extensions/ros2cli_common_extensions")
407 | local_path_override(module_name = "ros2cli_test_interfaces", path = "./submodules/ros2cli/ros2cli_test_interfaces")
408 | local_path_override(module_name = "ros2cli", path = "./submodules/ros2cli/ros2cli")
409 | local_path_override(module_name = "ros2component", path = "./submodules/ros2cli/ros2component")
410 | local_path_override(module_name = "ros2doctor", path = "./submodules/ros2cli/ros2doctor")
411 | local_path_override(module_name = "ros2interface", path = "./submodules/ros2cli/ros2interface")
412 | local_path_override(module_name = "ros2launch", path = "./submodules/launch_ros/ros2launch")
413 | local_path_override(module_name = "ros2lifecycle_test_fixtures", path = "./submodules/ros2cli/ros2lifecycle_test_fixtures")
414 | local_path_override(module_name = "ros2lifecycle", path = "./submodules/ros2cli/ros2lifecycle")
415 | local_path_override(module_name = "ros2multicast", path = "./submodules/ros2cli/ros2multicast")
416 | local_path_override(module_name = "ros2node", path = "./submodules/ros2cli/ros2node")
417 | local_path_override(module_name = "ros2param", path = "./submodules/ros2cli/ros2param")
418 | local_path_override(module_name = "ros2pkg", path = "./submodules/ros2cli/ros2pkg")
419 | local_path_override(module_name = "ros2run", path = "./submodules/ros2cli/ros2run")
420 | local_path_override(module_name = "ros2service", path = "./submodules/ros2cli/ros2service")
421 | local_path_override(module_name = "ros2test", path = "./submodules/ros_testing/ros2test")
422 | local_path_override(module_name = "ros2topic", path = "./submodules/ros2cli/ros2topic")
423 | local_path_override(module_name = "ros2trace", path = "./submodules/ros2_tracing/ros2trace")
424 | local_path_override(module_name = "rosgraph_msgs", path = "./submodules/rcl_interfaces/rosgraph_msgs")
425 | local_path_override(module_name = "rosidl_adapter_proto", path = "./submodules/rosidl_typesupport_protobuf/rosidl_adapter_proto")
426 | local_path_override(module_name = "rosidl_adapter", path = "./submodules/rosidl/rosidl_adapter")
427 | local_path_override(module_name = "rosidl_cli", path = "./submodules/rosidl/rosidl_cli")
428 | local_path_override(module_name = "rosidl_cmake", path = "./submodules/rosidl/rosidl_cmake")
429 | local_path_override(module_name = "rosidl_core_generators", path = "./submodules/rosidl_core/rosidl_core_generators")
430 | local_path_override(module_name = "rosidl_core_runtime", path = "./submodules/rosidl_core/rosidl_core_runtime")
431 | local_path_override(module_name = "rosidl_default_generators", path = "./submodules/rosidl_defaults/rosidl_default_generators")
432 | local_path_override(module_name = "rosidl_default_runtime", path = "./submodules/rosidl_defaults/rosidl_default_runtime")
433 | local_path_override(module_name = "rosidl_dynamic_typesupport_fastrtps", path = "./submodules/rosidl_dynamic_typesupport_fastrtps")
434 | local_path_override(module_name = "rosidl_dynamic_typesupport", path = "./submodules/rosidl_dynamic_typesupport")
435 | local_path_override(module_name = "rosidl_generator_c", path = "./submodules/rosidl/rosidl_generator_c")
436 | local_path_override(module_name = "rosidl_generator_cpp", path = "./submodules/rosidl/rosidl_generator_cpp")
437 | local_path_override(module_name = "rosidl_generator_py", path = "./submodules/rosidl_python/rosidl_generator_py")
438 | local_path_override(module_name = "rosidl_generator_tests", path = "./submodules/rosidl/rosidl_generator_tests")
439 | local_path_override(module_name = "rosidl_generator_type_description", path = "./submodules/rosidl/rosidl_generator_type_description")
440 | local_path_override(module_name = "rosidl_parser", path = "./submodules/rosidl/rosidl_parser")
441 | local_path_override(module_name = "rosidl_pycommon", path = "./submodules/rosidl/rosidl_pycommon")
442 | local_path_override(module_name = "rosidl_runtime_c", path = "./submodules/rosidl/rosidl_runtime_c")
443 | local_path_override(module_name = "rosidl_runtime_cpp", path = "./submodules/rosidl/rosidl_runtime_cpp")
444 | local_path_override(module_name = "rosidl_runtime_py", path = "./submodules/rosidl_runtime_py")
445 | local_path_override(module_name = "rosidl_typeadapter_protobuf_test", path = "./submodules/rosidl_typesupport_protobuf/rosidl_typeadapter_protobuf_test")
446 | local_path_override(module_name = "rosidl_typesupport_c", path = "./submodules/rosidl_typesupport/rosidl_typesupport_c")
447 | local_path_override(module_name = "rosidl_typesupport_cpp", path = "./submodules/rosidl_typesupport/rosidl_typesupport_cpp")
448 | local_path_override(module_name = "rosidl_typesupport_fastrtps_c", path = "./submodules/rosidl_typesupport_fastrtps/rosidl_typesupport_fastrtps_c")
449 | local_path_override(module_name = "rosidl_typesupport_fastrtps_cpp", path = "./submodules/rosidl_typesupport_fastrtps/rosidl_typesupport_fastrtps_cpp")
450 | local_path_override(module_name = "rosidl_typesupport_interface", path = "./submodules/rosidl/rosidl_typesupport_interface")
451 | local_path_override(module_name = "rosidl_typesupport_introspection_c", path = "./submodules/rosidl/rosidl_typesupport_introspection_c")
452 | local_path_override(module_name = "rosidl_typesupport_introspection_cpp", path = "./submodules/rosidl/rosidl_typesupport_introspection_cpp")
453 | local_path_override(module_name = "rosidl_typesupport_introspection_tests", path = "./submodules/rosidl/rosidl_typesupport_introspection_tests")
454 | local_path_override(module_name = "rosidl_typesupport_protobuf_c", path = "./submodules/rosidl_typesupport_protobuf/rosidl_typesupport_protobuf_c")
455 | local_path_override(module_name = "rosidl_typesupport_protobuf_cpp", path = "./submodules/rosidl_typesupport_protobuf/rosidl_typesupport_protobuf_cpp")
456 | local_path_override(module_name = "rosidl_typesupport_protobuf", path = "./submodules/rosidl_typesupport_protobuf/rosidl_typesupport_protobuf")
457 | local_path_override(module_name = "rosidl_typesupport_tests", path = "./submodules/rosidl_typesupport/rosidl_typesupport_tests")
458 | local_path_override(module_name = "rpyutils", path = "./submodules/rpyutils")
459 | local_path_override(module_name = "rti_connext_dds_cmake_module", path = "./submodules/rmw_connextdds/rti_connext_dds_cmake_module")
460 | local_path_override(module_name = "sensor_msgs_py", path = "./submodules/common_interfaces/sensor_msgs_py")
461 | local_path_override(module_name = "sensor_msgs", path = "./submodules/common_interfaces/sensor_msgs")
462 | local_path_override(module_name = "service_msgs", path = "./submodules/rcl_interfaces/service_msgs")
463 | local_path_override(module_name = "shape_msgs", path = "./submodules/common_interfaces/shape_msgs")
464 | local_path_override(module_name = "simulation", path = "./submodules/variants/simulation")
465 | local_path_override(module_name = "sros2_cmake", path = "./submodules/sros2/sros2_cmake")
466 | local_path_override(module_name = "sros2", path = "./submodules/sros2/sros2")
467 | local_path_override(module_name = "statistics_msgs", path = "./submodules/rcl_interfaces/statistics_msgs")
468 | local_path_override(module_name = "std_msgs", path = "./submodules/common_interfaces/std_msgs")
469 | local_path_override(module_name = "std_srvs", path = "./submodules/common_interfaces/std_srvs")
470 | local_path_override(module_name = "stereo_msgs", path = "./submodules/common_interfaces/stereo_msgs")
471 | local_path_override(module_name = "test_interface_files", path = "./submodules/test_interface_files")
472 | local_path_override(module_name = "test_launch_ros", path = "./submodules/launch_ros/test_launch_ros")
473 | local_path_override(module_name = "test_launch_testing", path = "./submodules/launch/test_launch_testing")
474 | local_path_override(module_name = "test_msgs", path = "./submodules/rcl_interfaces/test_msgs")
475 | local_path_override(module_name = "test_osrf_testing_tools_cpp", path = "./submodules/osrf_testing_tools_cpp/test_osrf_testing_tools_cpp")
476 | local_path_override(module_name = "test_rmw_implementation", path = "./submodules/rmw_implementation/test_rmw_implementation")
477 | local_path_override(module_name = "test_ros2trace", path = "./submodules/ros2_tracing/test_ros2trace")
478 | local_path_override(module_name = "test_tf2", path = "./submodules/geometry2/test_tf2")
479 | local_path_override(module_name = "test_tracetools_launch", path = "./submodules/ros2_tracing/test_tracetools_launch")
480 | local_path_override(module_name = "test_tracetools", path = "./submodules/ros2_tracing/test_tracetools")
481 | local_path_override(module_name = "tf2_bullet", path = "./submodules/geometry2/tf2_bullet")
482 | local_path_override(module_name = "tf2_eigen_kdl", path = "./submodules/geometry2/tf2_eigen_kdl")
483 | local_path_override(module_name = "tf2_eigen", path = "./submodules/geometry2/tf2_eigen")
484 | local_path_override(module_name = "tf2_geometry_msgs", path = "./submodules/geometry2/tf2_geometry_msgs")
485 | local_path_override(module_name = "tf2_kdl", path = "./submodules/geometry2/tf2_kdl")
486 | local_path_override(module_name = "tf2_msgs", path = "./submodules/geometry2/tf2_msgs")
487 | local_path_override(module_name = "tf2_py", path = "./submodules/geometry2/tf2_py")
488 | local_path_override(module_name = "tf2_ros_py", path = "./submodules/geometry2/tf2_ros_py")
489 | local_path_override(module_name = "tf2_ros", path = "./submodules/geometry2/tf2_ros")
490 | local_path_override(module_name = "tf2_sensor_msgs", path = "./submodules/geometry2/tf2_sensor_msgs")
491 | local_path_override(module_name = "tf2_tools", path = "./submodules/geometry2/tf2_tools")
492 | local_path_override(module_name = "tf2", path = "./submodules/geometry2/tf2")
493 | local_path_override(module_name = "tracetools_launch", path = "./submodules/ros2_tracing/tracetools_launch")
494 | local_path_override(module_name = "tracetools_read", path = "./submodules/ros2_tracing/tracetools_read")
495 | local_path_override(module_name = "tracetools_test", path = "./submodules/ros2_tracing/tracetools_test")
496 | local_path_override(module_name = "tracetools_trace", path = "./submodules/ros2_tracing/tracetools_trace")
497 | local_path_override(module_name = "tracetools", path = "./submodules/ros2_tracing/tracetools")
498 | local_path_override(module_name = "trajectory_msgs", path = "./submodules/common_interfaces/trajectory_msgs")
499 | local_path_override(module_name = "type_description_interfaces", path = "./submodules/rcl_interfaces/type_description_interfaces")
500 | local_path_override(module_name = "unique_identifier_msgs", path = "./submodules/unique_identifier_msgs")
501 | local_path_override(module_name = "visualization_msgs", path = "./submodules/common_interfaces/visualization_msgs")
502 | local_path_override(module_name = "zenoh_security_tools", path = "./submodules/rmw_zenoh/zenoh_security_tools")
503 |
504 | # C++ toolchain (offers amd64 and arm64 for linux, windows and darwin)
505 |
506 | llvm = use_extension("@toolchains_llvm//toolchain/extensions:llvm.bzl", "llvm")
507 | llvm.toolchain(llvm_version = "20.1.7")
508 | use_repo(llvm, "llvm_toolchain")
509 | register_toolchains("@llvm_toolchain//:all")
510 |
511 | # Python configuration
512 |
513 | python = use_extension("@rules_python//python/extensions:python.bzl", "python")
514 | python.toolchain(
515 | python_version = "3.12",
516 | is_default = True,
517 | )
518 |
519 | # Use a RUST compiler known to work with Zenoh.
520 |
521 | rust = use_extension("@rules_rust//rust:extensions.bzl", "rust")
522 | rust.toolchain(
523 | edition = "2021",
524 | versions = [ "1.85.0" ],
525 | )
526 |
--------------------------------------------------------------------------------