构建系统

构建系统允许开发人员根据需要构建他们的 ROS 2 代码。 ROS 2 严重依赖于将代码划分为包,每个包包含一个清单文件(“package.xml”)。 此清单文件包含有关包的基本元数据,包括其对其他包的依赖关系。 此清单是元构建工具运行所必需的。 ROS 2 构建系统包含 3 个主要概念。 构建工具 ———- 这是控制单个包的编译和测试的软件。 在 ROS 2 中,这通常是 C++ 的 CMake 和 Python 的 setuptools,但也支持其他构建工具。 构建助手 ————- 这些是帮助函数,它们与构建工具挂钩,以提升开发人员的体验。 ROS 2 包通常依赖于“ament”系列包来实现这一点。 “ament”由几个重要的存储库组成,它们都在“GitHub 组织 <https://github.com/ament>”中。

ament_package

位于 GitHubament/ament_package,此存储库包含一个 ament Python 包,它为 |ament 包| 提供各种实用程序,例如环境挂钩模板。

所有 |ament 包| 都必须在包的根目录中包含一个 package.xml 文件,无论其底层构建系统如何。 package.xml“清单”文件包含处理和操作 package 所需的信息。 此 package 信息包括 package 的名称(全局唯一)和包的依赖项等内容。 package.xml 文件还用作标记文件,指示文件系统上 package 的位置。

“catkin_pkg” 提供对 :term:“package.xml” 文件的解析(与 ROS 1 中一样),而“colcon” 等构建工具则提供通过在文件系统中搜索这些 :term:“package.xml” 文件来定位 packages 的功能。

package.xml

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

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

ament package

Any package which contains a package.xml and follows the packaging guidelines of ament, regardless of the underlying build system.

由于术语“ament 包”与构建系统无关,因此可以有不同类型的 |ament 包|,例如:ament CMake 包ament Python 包 等。

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

CMake package

任何包含普通 CMake 项目和 package.xml 清单文件的 package

ament CMake package

CMake 包 也遵循 ament 包装指南。

Python package

任何包含基于 setuptools 的 Python 项目和 package.xml 清单文件的 package

ament Python package

Python 包 也遵循 ament 包装指南。

ament_cmake 存储库

位于 GitHub 上的 ament/ament_cmake,此存储库包含许多“ament CMake”和纯 CMake 包,它们提供了创建“ament CMake”包所需的 CMake 基础架构。 在此上下文中,“ament CMake”包表示:使用 CMake 构建的 ament 包。 因此,此存储库中的 packages 提供了必要的 CMake 函数/宏和 CMake 模块,以方便创建更多“ament CMake”(或 ament_cmake)包。 此类型的包用 package.xml 文件的 <export> 标记中的 <build_type>ament_cmake</build_type> 标记标识。

|packages|此存储库中的软件包极其模块化,但有一个“瓶颈” |包|,名为“ament_cmake”。 任何人都可以依赖“ament_cmake” |包|来获取此存储库中 |包|的所有聚合功能。 以下是存储库中 |包| 的列表以及简短说明:

  • ament_cmake

  • 聚合此存储库中的所有其他 packages,用户只需依赖此

  • ament_cmake_auto

  • 提供便捷的 CMake 函数,可自动处理编写 packageCMakeLists.txt 文件的许多繁琐部分

  • ament_cmake_core

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

  • ament_cmake_gmock

  • 添加用于制作基于 gmock 的单元测试的便捷函数

  • ament_cmake_gtest

  • 添加用于制作基于 gtest 的自动化测试的便捷函数

  • ament_cmake_nose

  • 添加用于制作基于 nosetests 的 python 自动化测试的便捷函数

  • ament_cmake_python

  • 为包含 Python 代码的 packages 提供 CMake 函数

  • 请参阅 ament_cmake_python 用户文档

  • ament_cmake_test

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

ament_cmake_core |包| 包含许多 CMake 基础结构,可以使用常规接口在 |包| 之间干净地传递信息。 这使 |包| 与其他 |包| 具有更多解耦的构建接口,促进它们的重用并鼓励不同 |包| 的构建系统中的约定。 例如,它提供了一种在 |包| 之间传递包含目录、库、定义和依赖项的标准方法,以便这些信息的消费者可以以常规方式访问这些信息。

ament_cmake_core |包| 还提供了 ament 构建系统的功能,例如符号链接安装,它允许您将文件从源空间或构建空间符号链接到安装空间,而不是复制它们。 这使您可以安装一次,然后编辑非生成的资源,如 Python 代码和配置文件,而无需重新运行安装步骤以使它们生效。 此功能实质上取代了 catkin 中的“开发空间”,因为它具有大多数优点,但几乎没有复杂性或缺点。

ament_cmake_core 提供的另一个功能是 package 资源索引,这是 packages 指示它们包含某种类型的资源的一种方式。 此功能的设计使回答简单问题(例如此前缀中的 packages 是什么)变得更加高效(例如 /usr/local),因为它仅要求您在该前缀下的单个可能位置列出文件。 您可以在资源索引的 设计文档 中阅读有关此功能的更多信息。

catkin 一样,ament_cmake_core 也提供环境设置文件和 package 特定的环境挂钩。 环境设置文件通常命名为“setup.bash”,是 package 开发人员定义使用其 package 所需的环境更改的地方。 开发人员可以使用“环境钩子”来执行此操作,该钩子基本上是一段任意的 shell 代码,可以设置或修改环境变量、定义 shell 函数、设置自动完成规则等… 例如,此功能就是 ROS 1 设置“ROS_DISTRO”环境变量的方式,而无需“catkin”了解任何有关 ROS 发行版的信息。

ament_lint 存储库

位于 GitHub 上的 ament/ament_lint,此存储库提供了多个 packages,它们以方便一致的方式提供 linting 和测试服务。 目前有 packages 支持使用 uncrustify 进行 C++ 样式 linting、使用 cppcheck 进行静态 C++ 代码检查、检查源代码中的版权、使用 pep8 进行 Python 样式 linting 等。 辅助包列表将来可能会增加。

元构建工具

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

在 ROS 2 中,名为 colcon 的工具用于此目的。