From 2dd27a469ca7e2781d54d0c157f10e0351e92702 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Mart=C3=ADn=20Rico?= Date: Sat, 26 Sep 2026 23:06:30 +0200 Subject: [PATCH 1/3] CI: build and test on ROS 2 Jazzy and Kilted Rolling now targets Ubuntu 26.04, which has no ROS packages yet, and the old setup-ros versions use an expired ROS apt key. Build on the same distributions as the CoreSense Pixi channels, update the ros-tooling actions, and remove the scheduled trigger that made GitHub disable the workflow after 60 days of inactivity. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/rolling.yaml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/rolling.yaml b/.github/workflows/rolling.yaml index 7482434..d61d740 100644 --- a/.github/workflows/rolling.yaml +++ b/.github/workflows/rolling.yaml @@ -7,22 +7,23 @@ on: push: branches: - rolling + workflow_dispatch: jobs: build-and-test: - runs-on: ${{ matrix.os }} + runs-on: ubuntu-24.04 strategy: - matrix: - os: [ubuntu-26.04] fail-fast: false + matrix: + ros_distro: [jazzy, kilted] steps: - - uses: ros-tooling/setup-ros@0.7.16 + - uses: ros-tooling/setup-ros@0.7.19 with: - required-ros-distributions: rolling - - uses: ros-tooling/action-ros-ci@0.4.7 + required-ros-distributions: ${{ matrix.ros_distro }} + - uses: ros-tooling/action-ros-ci@0.4.8 with: package-name: rossdl_cmake rossdl_simple_test system_a system_b application_1 application_2 application_3 - target-ros2-distro: rolling + target-ros2-distro: ${{ matrix.ros_distro }} colcon-defaults: | { "test": { From 786b868b552426fcbb7722022192f7c3662b65db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Mart=C3=ADn=20Rico?= Date: Sat, 26 Sep 2026 23:21:11 +0200 Subject: [PATCH 2/3] Find templates in any install layout and support EmPy 4 - Locate the templates from rossdl_cmake_DIR. The previous code looked for an install prefix containing 'rossdl_cmake', which only exists with colcon isolated installs, so it failed with merged installs, Debian and conda packages. - Always use the descriptions of the package being built as local files: they are visible to CMake from the build space but not installed yet, so the generator could not read them from the ament index. - Support EmPy 4 (conda-forge, pip) as well as EmPy 3 (Ubuntu). - Export the dependencies that the generators need at build time in the packages that use rossdl: ros2run, python3-yaml and ament_index_python. Co-Authored-By: Claude Opus 5.5 --- rossdl_cmake/cmake/rossdl_generate_code.cmake | 15 ++--- .../cmake/rossdl_generate_system.cmake | 23 +++++--- rossdl_cmake/package.xml | 3 + rossdl_cmake/rossdl_cmake/__init__.py | 52 +++++++++++------- .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 22085 bytes 5 files changed, 55 insertions(+), 38 deletions(-) create mode 100644 rossdl_cmake/rossdl_cmake/__pycache__/__init__.cpython-314.pyc diff --git a/rossdl_cmake/cmake/rossdl_generate_code.cmake b/rossdl_cmake/cmake/rossdl_generate_code.cmake index 5d8a62c..4b23d88 100644 --- a/rossdl_cmake/cmake/rossdl_generate_code.cmake +++ b/rossdl_cmake/cmake/rossdl_generate_code.cmake @@ -54,19 +54,16 @@ macro(rossdl_generate_code description_file) set(_code_tuple "${CMAKE_CURRENT_SOURCE_DIR}:${description_file}") endif() - ament_index_get_prefix_path(PACKAGES_INSTALL_PATHS) - set(ROSSDL_CMAKE_PATH "") - foreach(PACKAGES_INSTALL_PATH ${PACKAGES_INSTALL_PATHS}) - if(PACKAGES_INSTALL_PATH MATCHES "rossdl_cmake") - set(ROSSDL_CMAKE_PATH ${PACKAGES_INSTALL_PATH}) - endif() - endforeach() + # The templates are installed in /share/rossdl_cmake/resources and + # rossdl_cmake_DIR is /share/rossdl_cmake/cmake, for any install + # layout (isolated, merged, Debian or conda packages). + get_filename_component(ROSSDL_RESOURCES_DIR "${rossdl_cmake_DIR}/../resources" ABSOLUTE) file(READ ${_abs_file} ARTIFACTS_DESCRIPTION) ament_index_register_resource(rossdl_artifact_descriptions CONTENT ${ARTIFACTS_DESCRIPTION}) - set(RESOURCE_CPP ${ROSSDL_CMAKE_PATH}/share/rossdl_cmake/resources/nodes.cpp.em) - set(RESOURCE_HPP ${ROSSDL_CMAKE_PATH}/share/rossdl_cmake/resources/nodes.hpp.em) + set(RESOURCE_CPP ${ROSSDL_RESOURCES_DIR}/nodes.cpp.em) + set(RESOURCE_HPP ${ROSSDL_RESOURCES_DIR}/nodes.hpp.em) string(REGEX REPLACE ":([^:]*)$" "/\\1" _abs_file "${_code_tuple}") set(_header_out_file ${CMAKE_CURRENT_BINARY_DIR}/include/${PROJECT_NAME}/Nodes.hpp) diff --git a/rossdl_cmake/cmake/rossdl_generate_system.cmake b/rossdl_cmake/cmake/rossdl_generate_system.cmake index 4cfd59e..4eee36c 100644 --- a/rossdl_cmake/cmake/rossdl_generate_system.cmake +++ b/rossdl_cmake/cmake/rossdl_generate_system.cmake @@ -58,15 +58,12 @@ macro(rossdl_generate_system) # description_file systems) set(_code_tuple "${CMAKE_CURRENT_SOURCE_DIR}:${description_file}") endif() - ament_index_get_prefix_path(PACKAGES_INSTALL_PATHS) - set(ROSSDL_CMAKE_PATH "") - foreach(PACKAGES_INSTALL_PATH ${PACKAGES_INSTALL_PATHS}) - if(PACKAGES_INSTALL_PATH MATCHES "rossdl_cmake") - set(ROSSDL_CMAKE_PATH ${PACKAGES_INSTALL_PATH}) - endif() - endforeach() + # The templates are installed in /share/rossdl_cmake/resources and + # rossdl_cmake_DIR is /share/rossdl_cmake/cmake, for any install + # layout (isolated, merged, Debian or conda packages). + get_filename_component(ROSSDL_RESOURCES_DIR "${rossdl_cmake_DIR}/../resources" ABSOLUTE) - set(RESOURCE_LAUNCH ${ROSSDL_CMAKE_PATH}/share/rossdl_cmake/resources/launcher.py.em) + set(RESOURCE_LAUNCH ${ROSSDL_RESOURCES_DIR}/launcher.py.em) string(REGEX REPLACE ":([^:]*)$" "/\\1" _abs_file "${_code_tuple}") @@ -76,6 +73,16 @@ macro(rossdl_generate_system) # description_file systems) ament_index_get_resources(ROSSDL_ARTIFACTS rossdl_artifact_descriptions) ament_index_get_resources(ROSSDL_SYSTEMS rossdl_system_descriptions) + # The descriptions of this package are registered in its build space, so + # CMake sees them, but they are not installed yet, so the generator cannot + # read them from the ament index. Always use them as local files. + if(ROSSDL_ARTIFACTS) + list(REMOVE_ITEM ROSSDL_ARTIFACTS ${PROJECT_NAME}) + endif() + if(ROSSDL_SYSTEMS) + list(REMOVE_ITEM ROSSDL_SYSTEMS ${PROJECT_NAME}) + endif() + if(ROSSDL_ARTIFACTS) set(ROSSDL_ARTIFACTS_NO_VOID ${ROSSDL_ARTIFACTS}) endif() diff --git a/rossdl_cmake/package.xml b/rossdl_cmake/package.xml index 46daf2f..3db42ae 100644 --- a/rossdl_cmake/package.xml +++ b/rossdl_cmake/package.xml @@ -16,6 +16,9 @@ ament_cmake python3-empy + python3-yaml + ament_index_python + ros2run rclpy diff --git a/rossdl_cmake/rossdl_cmake/__init__.py b/rossdl_cmake/rossdl_cmake/__init__.py index a61987f..3d225f2 100644 --- a/rossdl_cmake/rossdl_cmake/__init__.py +++ b/rossdl_cmake/rossdl_cmake/__init__.py @@ -22,6 +22,33 @@ import yaml from yaml.loader import SafeLoader +def _create_interpreter(output): + """Create an EmPy interpreter, compatible with EmPy 3 and EmPy 4.""" + if hasattr(em, 'BUFFERED_OPT'): + # EmPy 3 (Ubuntu packages) + return em.Interpreter( + output=output, + options={ + em.BUFFERED_OPT: True, + em.RAW_OPT: True, + em.OVERRIDE_OPT: False, + }) + # EmPy 4 (conda-forge, pip) + return em.Interpreter( + output=output, + config=em.Configuration(useProxy=False), + dispatcher=False) + + +def _expand(interpreter, content, name, handle, data): + if hasattr(em, 'BUFFERED_OPT'): + interpreter.invoke('beforeFile', name=name, file=handle, locals=data) + interpreter.string(content, name, locals=data) + interpreter.invoke('afterFile') + else: + interpreter.string(content, locals=data) + + def read_description(file_in): with open(file_in) as f: @@ -199,19 +226,11 @@ def generate_file(package, artifacts_file, file_in, file_out): file_output = StringIO() content = '' try: - _interpreter = em.Interpreter( - output=file_output, - options={ - em.BUFFERED_OPT: True, - em.RAW_OPT: True, - }) + _interpreter = _create_interpreter(file_output) with open(file_in, 'r') as h: content = h.read() - _interpreter.invoke( - 'beforeFile', name=file_in, file=h, locals=data) - _interpreter.string(content, file_in, locals=data) - _interpreter.invoke('afterFile') + _expand(_interpreter, content, file_in, h, data) content = file_output.getvalue() except Exception as e: # noqa: F841 print( @@ -335,20 +354,11 @@ def generate_launch(package, file_in, launch_in, file_out, system, systems_data, content = '' try: em.Interpreter._wasProxyInstalled = False - _interpreter = em.Interpreter( - output=file_output, - options={ - em.BUFFERED_OPT: True, - em.RAW_OPT: True, - em.OVERRIDE_OPT: False, - }) + _interpreter = _create_interpreter(file_output) with open(launch_in, 'r') as h: content = h.read() - _interpreter.invoke( - 'beforeFile', name=file_in, file=h, locals=data_and_system) - _interpreter.string(content, launch_in, locals=data_and_system) - _interpreter.invoke('afterFile') + _expand(_interpreter, content, launch_in, h, data_and_system) content = file_output.getvalue() except Exception as e: # noqa: F841 print( diff --git a/rossdl_cmake/rossdl_cmake/__pycache__/__init__.cpython-314.pyc b/rossdl_cmake/rossdl_cmake/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d43428e2c19e5deb55aee6ecb249790c6cc80b6 GIT binary patch literal 22085 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∾OGV9lnIyp%4{IA-OaOk{V$8 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 Qr0uur9-!$-nsonv12Nu6_W%F@ literal 0 HcmV?d00001 From 755fadd21cb3e8d5569d772e147f091b9e9cb549 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Mart=C3=ADn=20Rico?= Date: Sat, 26 Sep 2026 23:22:03 +0200 Subject: [PATCH 3/3] CI: set ROS_LOG_DIR and the ROS library path for the tests Co-Authored-By: Claude Opus 5.5 --- .github/workflows/rolling.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/rolling.yaml b/.github/workflows/rolling.yaml index d61d740..c50c91e 100644 --- a/.github/workflows/rolling.yaml +++ b/.github/workflows/rolling.yaml @@ -12,6 +12,9 @@ on: jobs: build-and-test: runs-on: ubuntu-24.04 + env: + # Tests cannot create ~/.ros/log in the runner + ROS_LOG_DIR: /tmp/ros_log strategy: fail-fast: false matrix: @@ -20,6 +23,8 @@ jobs: - uses: ros-tooling/setup-ros@0.7.19 with: required-ros-distributions: ${{ matrix.ros_distro }} + - name: Add the ROS libraries to the library path (needed by Kilted tests) + run: echo "LD_LIBRARY_PATH=/opt/ros/${{ matrix.ros_distro }}/lib:${LD_LIBRARY_PATH}" >> "$GITHUB_ENV" - uses: ros-tooling/action-ros-ci@0.4.8 with: package-name: rossdl_cmake rossdl_simple_test system_a system_b application_1 application_2 application_3