构建系统

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

ament_package

Located on GitHub at ament/ament_package, 此存储库包含一个 ament Python packageament packages 提供各种实用程序,例如环境钩子的模板。

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

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

package.xml
    Package manifest file which marks the root of a :term:`package` and contains meta information about the :term:`package` including its name, version, description, maintainer, license, dependencies, and more.
    The contents of the manifest are in machine readable XML format and the contents are described in the |REPs| `127 <http://www.ros.org/reps/rep-0127.html>`_ and `140 <http://www.ros.org/reps/rep-0140.html>`_, with the possibility of further modifications in future |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

Any package containing a plain CMake project and a package.xml manifest file.

ament CMake package

A CMake package that also follows the ament packaging guidelines.

Python package

Any package containing a setuptools based Python project and a package.xml manifest file.

ament Python package

A Python package that also follows the ament packaging guidelines.

The ament_cmake repository

Located on GitHub at 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”的“瓶颈”package。 任何人都可以依赖“ament_cmake”package 来获取此存储库中 packages 的所有聚合功能。 以下是存储库中的 packages 列表以及简短说明:

  • ament_cmake

    • aggregates all other packages in this repository, users need only to depend on this

  • ament_cmake_auto

    • provides convenience CMake functions which automatically handle a lot of the tedious parts of writing a package’s CMakeLists.txt file

  • ament_cmake_core

    • provides all built-in core concepts for ament, e.g. environment hooks, resource indexing, symbolic linking install and others

  • ament_cmake_gmock

    • adds convenience functions for making gmock based unit tests

  • ament_cmake_gtest

    • adds convenience functions for making gtest based automated tests

  • ament_cmake_nose

    • adds convenience functions for making nosetests based python automated tests

  • ament_cmake_python

  • ament_cmake_test

    • aggregates different kinds of tests, e.g. gtest and nosetests, under a single target using CTest

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

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

ament_cmake_core 提供的另一个功能是 package 资源索引,这是 packages 指示它们包含某种类型的资源的一种方式。

此功能的设计使回答简单问题(例如此前缀中的 packages 是什么)变得更加高效(例如 /usr/local),因为它仅要求您在该前缀下的单个可能位置列出文件。

您可以在 design docs 用于资源索引。

catkin 一样,ament_cmake_core 也提供环境设置文件和 package 特定的环境钩子。

环境设置文件通常命名为 setup.bash,是 package 开发人员定义使用其 package 所需的环境更改的地方。

开发人员可以使用“环境钩子”来执行此操作,该钩子基本上是一段任意的 shell 代码,可以设置或修改环境变量、定义 shell 函数、设置自动完成规则等… 例如,此功能是 ROS 1 设置 ROS_DISTRO 环境变量的方式,而无需 catkin 了解 ROS 发行版的任何信息。

ament_lint 存储库

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

元构建工具

这是一个知道如何对一组软件包进行拓扑排序,并按照正确的依赖顺序构建或测试它们的软件。

该软件将调用构建工具来执行编译、测试和安装软件包的实际工作。

在 ROS 2 中,名为 colcon 用于此。