nuttx-apps/system/microros/Makefile
Arjav Patel 5e91459b1a system/microros: Add UDP and serial custom transport backends.
Micro XRCE-DDS expects the application to supply open/close/write/read
callbacks for the wire transport. Add a single dispatcher that
registers the selected backend via rmw_uros_set_custom_transport(),
plus two backends:

transport/microros_transport_udp.c
  BSD-socket UDP backend. Opens an AF_INET/SOCK_DGRAM socket,
  resolves CONFIG_MICROROS_AGENT_IP/PORT, connect()s it, and uses
  send/recv. The socket fd is stashed in uxrCustomTransport->args
  so no module-level state is needed.

transport/microros_transport_serial.c
  termios serial backend. Opens CONFIG_MICROROS_SERIAL_DEVICE with
  O_RDWR|O_NOCTTY|O_CLOEXEC, switches to raw 8N1 at
  CONFIG_MICROROS_SERIAL_BAUD, and uses poll/read/write. Fd is
  again stashed in uxrCustomTransport->args.

Both backends are mutually exclusive at compile time via Kconfig;
the dispatcher selects which set of callbacks to register. Wired
into both the legacy Make build (CSRCS in system/microros/Makefile)
and the CMake build (separate microros_transport static library
with the transport directory only exposed to its INTERFACE).

Signed-off-by: Arjav Patel <arjav1528@gmail.com>
2026-06-02 00:15:25 +08:00

258 lines
11 KiB
Makefile
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

############################################################################
# apps/system/microros/Makefile
#
# SPDX-License-Identifier: Apache-2.0
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership. The
# ASF licenses this file to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance with the
# License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
############################################################################
include $(APPDIR)/Make.defs
MICROROS_DIR := $(APPDIR)/system/microros
MICROROS_LIB_DIR := $(MICROROS_DIR)/micro_ros_lib
MICROROS_DISTRO := $(patsubst "%",%,$(CONFIG_MICROROS_DISTRO))
MICROROS_AR := $(firstword $(AR))
MAX_NODES := $(CONFIG_MICROROS_MAX_NODES)
MAX_PUB := $(CONFIG_MICROROS_MAX_PUBLISHERS)
MAX_SUB := $(CONFIG_MICROROS_MAX_SUBSCRIPTIONS)
MAX_SVC := $(CONFIG_MICROROS_MAX_SERVICES)
MAX_CLIENTS := $(CONFIG_MICROROS_MAX_CLIENTS)
# Escape for sed: forward slashes and strip quotes
ESCAPED_CC := $(subst /,\/,$(CC))
ESCAPED_CXX := $(subst /,\/,$(CXX))
ESCAPED_TOPDIR := $(subst /,\/,$(TOPDIR))
ESCAPED_APPDIR := $(subst /,\/,$(APPDIR))
ESCAPED_LIBDIR := $(subst /,\/,$(MICROROS_LIB_DIR))
ESCAPED_CFLAGS := $(subst /,\/,$(subst ",,$(CFLAGS)))
ESCAPED_CXXFLAGS := $(subst /,\/,$(subst ",,$(CXXFLAGS)))
MENUDESC = "micro-ROS Library"
# Transport sources compiled into the user-side app library
CSRCS += transport/microros_transport.c
ifeq ($(CONFIG_MICROROS_TRANSPORT_UDP),y)
CSRCS += transport/microros_transport_udp.c
endif
ifeq ($(CONFIG_MICROROS_TRANSPORT_SERIAL),y)
CSRCS += transport/microros_transport_serial.c
endif
# Architecture for CMake toolchain
ifeq ($(CONFIG_ARCH_ARM),y)
MICROROS_ARCH := arm
else ifeq ($(CONFIG_ARCH_ARM64),y)
MICROROS_ARCH := arm64
else ifeq ($(CONFIG_ARCH_RISCV),y)
MICROROS_ARCH := riscv
else ifeq ($(CONFIG_ARCH_XTENSA),y)
MICROROS_ARCH := xtensa
else
MICROROS_ARCH := generic
endif
# Wire libmicroros.a into the build when the context target fires
context:: $(MICROROS_DIR)/libmicroros.a
# ---------------------------------------------------------------------------
# Step 1 Build the ament/colcon dev tools (host-side)
# ---------------------------------------------------------------------------
$(MICROROS_LIB_DIR)/micro_ros_dev/install:
rm -rf $(MICROROS_LIB_DIR)/micro_ros_dev
mkdir -p $(MICROROS_LIB_DIR)/micro_ros_dev/src
cd $(MICROROS_LIB_DIR)/micro_ros_dev && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/ament/ament_cmake src/ament_cmake && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/ament/ament_lint src/ament_lint && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/ament/ament_package src/ament_package && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/ament/googletest src/googletest && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/ros2/ament_cmake_ros src/ament_cmake_ros && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/ament/ament_index src/ament_index && \
touch src/ament_cmake_ros/rmw_test_fixture_implementation/COLCON_IGNORE 2>/dev/null || true && \
touch src/ament_cmake_ros/rmw_test_fixture/COLCON_IGNORE 2>/dev/null || true && \
colcon build --cmake-args -DBUILD_TESTING=OFF
# ---------------------------------------------------------------------------
# Step 2 Clone all micro-ROS source packages
# ---------------------------------------------------------------------------
$(MICROROS_LIB_DIR)/micro_ros_src/src: $(MICROROS_LIB_DIR)/micro_ros_dev/install
rm -rf $(MICROROS_LIB_DIR)/micro_ros_src
mkdir -p $(MICROROS_LIB_DIR)/micro_ros_src/src
cd $(MICROROS_LIB_DIR)/micro_ros_src && \
git clone -b ros2 --depth 1 \
https://github.com/eProsima/micro-CDR src/micro-CDR && \
git clone -b ros2 --depth 1 \
https://github.com/eProsima/Micro-XRCE-DDS-Client src/Micro-XRCE-DDS-Client && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/micro-ROS/rmw-microxrcedds src/rmw_microxrcedds && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/micro-ROS/rcl src/rcl && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/ros2/rclc src/rclc && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/micro-ROS/rcutils src/rcutils && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/ros2/rosidl src/rosidl && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/ros2/rosidl_defaults src/rosidl_defaults && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/ros2/rosidl_dynamic_typesupport src/rosidl_dynamic_typesupport && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/ros2/rosidl_core src/rosidl_core && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/ros2/rmw src/rmw && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/ros2/rmw_implementation src/rmw_implementation && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/ros2/rcl_interfaces src/rcl_interfaces && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/ros2/common_interfaces src/common_interfaces && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/ros2/rcl_logging src/rcl_logging && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/micro-ROS/micro_ros_msgs src/micro_ros_msgs && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/micro-ROS/rosidl_typesupport src/rosidl_typesupport && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/micro-ROS/rosidl_typesupport_microxrcedds src/rosidl_typesupport_microxrcedds && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/micro-ROS/micro_ros_utilities src/micro_ros_utilities && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/ros2/unique_identifier_msgs src/unique_identifier_msgs && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/ros2/test_interface_files src/test_interface_files && \
git clone -b $(MICROROS_DISTRO) --depth 1 \
https://github.com/ros2/ros2_tracing src/ros2_tracing && \
touch src/ros2_tracing/test_tracetools/COLCON_IGNORE && \
touch src/ros2_tracing/lttngpy/COLCON_IGNORE && \
touch src/rmw/rmw_security_common/COLCON_IGNORE && \
touch src/rcl_logging/rcl_logging_spdlog/COLCON_IGNORE && \
touch src/rclc/rclc_examples/COLCON_IGNORE && \
touch src/rcl/rcl_yaml_param_parser/COLCON_IGNORE && \
touch src/rosidl/rosidl_typesupport_introspection_cpp/COLCON_IGNORE && \
touch src/rcl_interfaces/test_msgs/COLCON_IGNORE && \
touch src/common_interfaces/actionlib_msgs/COLCON_IGNORE && \
touch src/common_interfaces/std_srvs/COLCON_IGNORE && \
patch -p1 --forward --ignore-whitespace \
-d src < $(MICROROS_LIB_DIR)/patches/0001-dir-typedef-nuttx-guard.patch || true && \
patch -p1 --forward --ignore-whitespace \
-d src < $(MICROROS_LIB_DIR)/patches/0002-rcutils-process-nuttx-compat.patch || true && \
patch -p1 --forward --ignore-whitespace \
-d src < $(MICROROS_LIB_DIR)/patches/0003-rcutils-strcasecmp-include-strings-h.patch || true
# ---------------------------------------------------------------------------
# Step 3 Generate toolchain.cmake from template
# ---------------------------------------------------------------------------
$(MICROROS_LIB_DIR)/toolchain.cmake: $(MICROROS_LIB_DIR)/toolchain.cmake.in
sed \
-e 's/@CMAKE_C_COMPILER@/$(ESCAPED_CC)/g' \
-e 's/@CMAKE_CXX_COMPILER@/$(ESCAPED_CXX)/g' \
-e 's/@ARCH_C_FLAGS@/$(ESCAPED_CFLAGS)/g' \
-e 's/@ARCH_CPP_FLAGS@/$(ESCAPED_CXXFLAGS)/g' \
-e 's/@NUTTX_TOPDIR@/$(ESCAPED_TOPDIR)/g' \
-e 's/@NUTTX_APPDIR@/$(ESCAPED_APPDIR)/g' \
-e 's/@INCLUDE_OVR_DIR@/$(ESCAPED_LIBDIR)/g' \
-e 's/@CMAKE_SYSTEM_PROCESSOR@/$(MICROROS_ARCH)/g' \
$< > $@
# ---------------------------------------------------------------------------
# Step 4 Generate colcon.meta from template
# ---------------------------------------------------------------------------
$(MICROROS_LIB_DIR)/colcon.meta: $(MICROROS_LIB_DIR)/colcon.meta.in
sed \
-e 's/@MAX_NODES@/$(MAX_NODES)/g' \
-e 's/@MAX_PUBLISHERS@/$(MAX_PUB)/g' \
-e 's/@MAX_SUBSCRIPTIONS@/$(MAX_SUB)/g' \
-e 's/@MAX_SERVICES@/$(MAX_SVC)/g' \
-e 's/@MAX_CLIENTS@/$(MAX_CLIENTS)/g' \
$< > $@
# ---------------------------------------------------------------------------
# Step 5 Cross-build micro-ROS packages with colcon
# ---------------------------------------------------------------------------
$(MICROROS_LIB_DIR)/micro_ros_src/install: \
$(MICROROS_LIB_DIR)/toolchain.cmake \
$(MICROROS_LIB_DIR)/colcon.meta \
$(MICROROS_LIB_DIR)/micro_ros_src/src
cd $(MICROROS_LIB_DIR)/micro_ros_src && \
unset AMENT_PREFIX_PATH && \
. ../micro_ros_dev/install/local_setup.sh && \
colcon build \
--merge-install \
"--packages-ignore-regex=(.*_cpp$$|.*_py$$|test_rmw_implementation|rclc_examples)" \
--metas $(MICROROS_LIB_DIR)/colcon.meta \
--cmake-args \
--no-warn-unused-cli \
-DCMAKE_POSITION_INDEPENDENT_CODE=OFF \
-DTHIRDPARTY=ON \
-DBUILD_SHARED_LIBS=OFF \
-DBUILD_TESTING=OFF \
-DCMAKE_BUILD_TYPE=Release \
"-DCMAKE_TOOLCHAIN_FILE=$(MICROROS_LIB_DIR)/toolchain.cmake" \
-DCMAKE_VERBOSE_MAKEFILE=OFF
# ---------------------------------------------------------------------------
# Step 6 Merge all .a files into a single libmicroros.a
# ---------------------------------------------------------------------------
$(MICROROS_DIR)/libmicroros.a: $(MICROROS_LIB_DIR)/micro_ros_src/install
mkdir -p $(MICROROS_LIB_DIR)/libmicroros_obj
cd $(MICROROS_LIB_DIR)/libmicroros_obj && \
for file in $$(find $(MICROROS_LIB_DIR)/micro_ros_src/install/lib/ -name '*.a'); do \
folder=$$(basename $$file .a); \
mkdir -p $$folder && cd $$folder; \
$(MICROROS_AR) x $$file; \
for f in *; do \
[ -f "$$f" ] && mv "$$f" "../$${folder}-$${f}" 2>/dev/null || true; \
done; \
cd ..; \
rm -rf $$folder; \
done && \
$(MICROROS_AR) rc libmicroros.a $$(find . -maxdepth 1 -type f ! -name 'libmicroros.a') && \
cp libmicroros.a $(MICROROS_DIR)/
cd $(MICROROS_LIB_DIR) && rm -rf libmicroros_obj
cp -R $(MICROROS_LIB_DIR)/micro_ros_src/install/include $(MICROROS_DIR)/include
# ---------------------------------------------------------------------------
# Cleanup targets
# ---------------------------------------------------------------------------
clean::
$(call DELFILE,$(MICROROS_DIR)/libmicroros.a)
$(call DELDIR,$(MICROROS_DIR)/include)
$(call DELFILE,$(MICROROS_LIB_DIR)/toolchain.cmake)
$(call DELFILE,$(MICROROS_LIB_DIR)/colcon.meta)
distclean:: clean
$(call DELDIR,$(MICROROS_LIB_DIR)/micro_ros_src)
$(call DELDIR,$(MICROROS_LIB_DIR)/micro_ros_dev)
include $(APPDIR)/Application.mk