├── .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 | ![amd64](https://github.com/intrinsic-opensource/ros-central-registry/actions/workflows/build-test-linux-amd64.yml/badge.svg) | ![amd64](https://github.com/intrinsic-opensource/ros-central-registry/actions/workflows/build-test-linux-arm64.yml/badge.svg) | 15 | | MacOS 15 | ![amd64](https://github.com/intrinsic-opensource/ros-central-registry/actions/workflows/build-test-macos-amd64.yml/badge.svg) | ![amd64](https://github.com/intrinsic-opensource/ros-central-registry/actions/workflows/build-test-macos-arm64.yml/badge.svg) | 16 | | Windows 11 | ![amd64](https://github.com/intrinsic-opensource/ros-central-registry/actions/workflows/build-test-windows-amd64.yml/badge.svg) | ![amd64](https://github.com/intrinsic-opensource/ros-central-registry/actions/workflows/build-test-windows-arm64.yml/badge.svg) | 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 | --------------------------------------------------------------------------------