ROS2 配置 linter 的代码格式化工具为 clang-format

ROS2 提供的测试框架提供代码静态检查功能(linter),在使用 ros2 pkg create 命令(完整命令如下,供参考)创建空白项目时,会默认启用代码静态检查。

bash 复制代码
ros2 pkg create --build-type ament_cmake hello_world --dependencies rclcpp rclpy

生成的 package.xml 存在以下代码行。

xml 复制代码
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>

生成的 CMakeLists.txt 存在以下代码行。

cmake 复制代码
find_package(ament_lint_auto REQUIRED)
# the following line skips the linter which checks for copyrights
# comment the line when a copyright and license is added to all source files
set(ament_cmake_copyright_FOUND TRUE)
# the following line skips cpplint (only works in a git repo)
# comment the line when this package is in a git repo and when
# a copyright and license is added to all source files
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()

然而,以上默认配置在检查代码格式化时,使用的工具是 uncrustify,这导致了我们的 .clang-format 文件无法被用于测试,colcon test 会因为代码格式不匹配而产生意外的失败用例。

如果希望使用 clang-format 而非 uncrustify,需要进行以下操作。

  1. 安装 ros-${ROS_DISTRO}-ament-cmake-clang-format

    bash 复制代码
    sudo apt install ros-${ROS_DISTRO}-ament-cmake-clang-format

    需要注意的是,还有一个包叫作 ros-${ROS_DISTRO}-ament-clang-format,它被以上包依赖,所以无需手动安装。

    如果因为某些原因你的环境变量没有 ROS_DISTRO,请将以上命令中的 ${ROS_DISTRO} 替换为你的 ROS 发行版,以 humble 为例,完整命令如下。

    bash 复制代码
    sudo apt install ros-humble-ament-cmake-clang-format
  2. CMakeLists.txt 中禁用 uncrustify。

    仿照已有的样板代码,增加下面的代码。

    cmake 复制代码
    set(ament_cmake_uncrustify_FOUND TRUE)
  3. package.xml 中增加 ament-clang-format 依赖。

    xml 复制代码
    <test_depend>ament_clang_format</test_depend>
  4. CMakeLists.txt 中配置要使用的 .clang-format 文件。参见 docs.ros.org/en/ros2_pac...

    cmake 复制代码
    set(ament_cmake_clang_format_CONFIG_FILE "${CMAKE_CURRENT_SOURCE_DIR}/.clang-format")

    以上语句需要在 ament_lint_auto_find_test_dependencies() 之前设置。

CMakeLists.txt 修改后的内容如下,供参考。

cmake 复制代码
find_package(ament_lint_auto REQUIRED)
# the following line skips the linter which checks for copyrights
# comment the line when a copyright and license is added to all source files
set(ament_cmake_copyright_FOUND TRUE)
# the following line skips cpplint (only works in a git repo)
# comment the line when this package is in a git repo and when
# a copyright and license is added to all source files
set(ament_cmake_cpplint_FOUND TRUE)
set(ament_cmake_uncrustify_FOUND TRUE)
set(ament_cmake_clang_format_CONFIG_FILE "${CMAKE_CURRENT_SOURCE_DIR}/.clang-format")
ament_lint_auto_find_test_dependencies()
相关推荐
神仙别闹3 分钟前
基于C++ MFC实现动态分区分配存储管理
开发语言·c++·mfc
skr爱码士6 分钟前
03_第一个Qt项目:Hello World 的完整拆解
c++·qt·客户端
欧特克_Glodon17 分钟前
OpenCV计算机视觉开发入门与实践<十二>:XML 和 YAML 文件读写
xml·c++·opencv·计算机视觉
ryanuo725 分钟前
Shadcn/ui × Qt 6/QML:一次从 Web UI 到桌面 UI 的组件化实践
c++·qt·ui·shadcn
余额瞒着我当琳27 分钟前
C++--vector第二讲:手写 C++ STL:vector 源码剖析与迭代器失效分析
android·java·c++
郝学胜-神的一滴39 分钟前
[简化版 GAMES 104] 现代游戏引擎 06:从Tick时序到邮局模型,拆解确定性世界的底层密码
开发语言·c++·游戏引擎·图形渲染·软件开发·opengl
不会代码的小猴40 分钟前
6. Qt网络编程
开发语言·c++·笔记·qt·算法
沐风老师43 分钟前
从零开始学3dMax插件开发!
c++·3dmax插件·3dmax·maxscript
wuyk55511 小时前
98.C语言易混难点:字符数组与字符串指针的底层差异
c语言·开发语言·c++·stm32·嵌入式硬件·算法
峥无12 小时前
从0到1手撕红黑树:封装实现 my_map 与 my_set(SGI-STL 源码级深度解析)
开发语言·c++·笔记·算法·stl