构建系统

构建系统允许开发人员根据需要构建其ROS 2代码。ROS 2在很大程度上依赖于将代码分为软件包,每个软件包都包含一个清单文件(package.xml)。此清单文件包含有关软件包的基本元数据,包括其对其他软件包的依赖关系。此清单对于元构建工具的正常运行是必需的。

ROS 2构建系统包括3个主要概念。

构建工具

这是控制单个软件包编译和测试的软件。在ROS 2中,通常是CMake用于C++,setuptools用于Python,但也支持其他构建工具。

构建助手

这些是连接到构建工具以提供开发体验的辅助函数。ROS 2软件包通常依赖于``ament``系列的软件包。``ament``由一些重要的存储库组成,它们都在`GitHub组织中 <https://github.com/ament>`_。

``ament_package``软件包

该仓库位于 GitHubament/ament_package,其中包含一个单独的 ament Python package,为 ament packages 提供各种实用工具,例如环境钩子的模板。

所有的 ament packages 都必须在包的根目录下包含一个名为 package.xml 的文件,而与其底层构建系统无关。package.xml "清单"文件包含了处理和操作 package 所需的信息。该 package 信息包括全局唯一的 package 名称和包的依赖项。package.xml 文件还充当标记文件,指示 package 在文件系统中的位置。

解析 package.xml 文件的功能由 catkin_pkg 提供(与 ROS 1 中的情况相同),而通过搜索文件系统中的这些 package.xml 文件来定位 packages 的功能则由构建工具(如 colcon)提供。

package.xml

包清单文件,标记了 package 的根目录,并包含有关 package 的元信息,包括名称、版本、描述、维护者、许可证、依赖关系等。清单的内容以机器可读的 XML 格式呈现,内容在 REPs 127140 中进行了描述,并有可能在未来的 REPs 中进行进一步的修改。

因此,每当某个 package 被称为 ament package 时,这意味着它是一个单一的软件单元(源代码、构建文件、测试、文档和其他资源),使用 package.xml 清单文件进行描述。

ament 包

任何包含 package.xml 并遵循 ament 的打包准则的 package,不论其底层构建系统如何。

由于术语 ament package 不依赖于构建系统,可以存在不同类型的 |ament 包|,例如 ament CMake packageament Python package 等。

以下是您可能在此软件堆栈中遇到的常见包类型的列表:

CMake 包

包含纯 CMake 项目和 package.xml 清单文件的 package

ament CMake package

一个遵循``ament``打包指南的:term:CMake package

Python package

包含基于`setuptools <https://pypi.org/project/setuptools/>`_的Python项目和一个:term:`package.xml`清单文件的任何|package|。

ament Python package

一个遵循``ament``打包指南的:term:Python package

``ament_cmake``存储库

该仓库位于 GitHub 上的 ament/ament_cmake,包含许多“ament CMake”和纯 CMake 包,提供了在 CMake 中创建“ament CMake”包所需的基础设施。在这个上下文中,“ament CMake”包的意思是:使用 CMake 构建的 ament 包。因此,这个仓库中的 packages 提供了必要的 CMake 函数/宏和 CMake 模块,以便更轻松地创建更多的“ament CMake”(或 ament_cmake)包。这种类型的包在 package.xml 文件的 <export> 标签中用 <build_type>ament_cmake</build_type> 标记识别。

这个仓库中的 packages 非常模块化,但有一个单一的“瓶颈” package,名为 ament_cmake。任何人都可以依赖于 ament_cmake package,以获取该仓库中所有 packages 的聚合功能。下面是仓库中的 packages 列表及其简短描述:

  • ament_cmake

    • 聚合了该仓库中的所有其他 packages,用户只需依赖它

  • ament_cmake_auto

    • 提供了方便的CMake函数,自动处理撰写|package|的``CMakeLists.txt``文件中的许多繁琐部分

  • ament_cmake_core

    • 提供了``ament``的所有内置核心概念,例如环境钩子、资源索引、符号链接安装等

  • ament_cmake_gmock

    • 添加了方便的函数,用于创建基于gmock的单元测试

  • ament_cmake_gtest

    • 为使用 gtest 进行自动化测试提供了方便的函数

  • ament_cmake_nose

    • 为使用 nosetests 进行 Python 自动化测试提供了方便的函数

  • ament_cmake_python

  • ament_cmake_test

    • 聚合不同类型的测试,例如 gtest 和 nosetests,在一个目标下使用 CTest

ament_cmake_core package 包含了许多 CMake 基础设施,通过传统的接口,在 packages 之间清晰地传递信息成为可能。这使得 packages 具有更加解耦的构建接口,促进了它们之间的重用,并在不同 packages 的构建系统中鼓励约定。例如,它提供了一种标准的方式来在 packages 之间传递包含目录、库、定义和依赖关系,以便使用者可以以常规方式访问这些信息。

ament_cmake_core package 还提供了 ament 构建系统的功能,如符号链接安装。它允许您从源空间或构建空间中的文件以符号链接的方式链接到安装空间,而不是复制它们。这样,您可以安装一次,然后编辑非生成的资源,如 Python 代码和配置文件,而无需重新运行安装步骤使其生效。这个特性本质上取代了 catkin 中的“devel space”,因为它具有大部分优势,却没有太多复杂性或缺点。

ament_cmake_core 还提供了另一个特性,即 package 资源索引,它是一种让 packages 指示它们包含某种类型资源的方法。这个特性的设计使得回答简单问题变得更加高效,比如在这个前缀下有哪些 |packages|(例如 /usr/local),因为它只需要列出该前缀下的一个可能位置的文件列表。您可以在 设计文档 中了解更多关于这个特性的信息。

catkin 类似,ament_cmake_core 还提供了环境设置文件和 package 特定的环境钩子。环境设置文件通常命名为 setup.bash 等,是 package 开发者定义更改环境以利用他们的 package 的地方。开发者可以使用 "环境钩子" 来实现这一点,它基本上是一段任意的 shell 代码,可以设置或修改环境变量,定义 shell 函数,设置自动补全规则等等。例如,这个特性是 ROS 1 在不需要 catkin 知道 ROS 分发的情况下设置 `

``ament_lint``存储库

位于 GitHub 上的 ament/ament_lint,该仓库提供了多个 packages,以便以便捷且一致的方式提供代码检查和测试服务。目前有 packages 支持使用 uncrustify 进行 C++ 代码风格检查,使用 cppcheck 进行静态 C++ 代码检查,检查源代码中的版权问题,使用 pep8 进行 Python 代码风格检查,以及其他功能。未来可能会增加更多辅助包的列表。

元构建工具

这是一款软件,知道如何对一组软件包进行拓扑排序,并按照正确的依赖关系顺序构建或测试它们。这款软件将调用构建工具来执行实际的编译、测试和安装软件包的工作。

在ROS 2中,使用名为`colcon <https://colcon.readthedocs.io/en/released/>`__的工具来执行此操作。