This is an automated email from the ASF dual-hosted git repository.

lupyuen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git

commit b1a4d3fcd5f35a4b82aaadb9158356b2313433d3
Author: Arjav Patel <[email protected]>
AuthorDate: Sat May 23 07:04:05 2026 +0000

    apps/system/microros: add libmicroros.a colcon build pipeline.
    
    Replace the Directory.mk stub with a full Application.mk-based Makefile
    that builds libmicroros.a from upstream micro-ROS sources via colcon.
    Build pipeline (six steps, each a Make target):
    
      1. micro_ros_dev/install  -- clone + build ament/colcon host tools
      2. micro_ros_src/src      -- git clone all Jazzy micro-ROS packages
                                   with --depth 1; apply DIR-typedef guard
                                   patch; mark unused packages COLCON_IGNORE
      3. toolchain.cmake        -- sed-substitute CC/CXX/CFLAGS into template
      4. colcon.meta            -- sed-substitute Kconfig resource limits
      5. micro_ros_src/install  -- colcon cross-build (merge-install,
                                   packages-ignore-regex=.*_cpp)
      6. libmicroros.a          -- ar-merge all install/lib/*.a into one
                                   archive; copy include/ tree
    
    clean:: removes generated files; distclean:: removes all fetched dirs.
    Signed-off-by: Arjav Patel <[email protected]>
---
 system/microros/Makefile | 223 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 222 insertions(+), 1 deletion(-)

diff --git a/system/microros/Makefile b/system/microros/Makefile
index b907087ee..6d34e3cc3 100644
--- a/system/microros/Makefile
+++ b/system/microros/Makefile
@@ -20,6 +20,227 @@
 #
 ############################################################################
 
+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      := $(CROSSDEV)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"
 
-include $(APPDIR)/Directory.mk
+# 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

Reply via email to