构建系统
构建系统允许开发人员根据需要构建他们的 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 package 为 ament 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
provides CMake functions for packages that contain Python code
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
存储库
位于 GitHub 上 ament/ament_lint, 这个存储库提供了几个|包|,以方便和一致的方式提供 linting 和测试服务。
目前有 packages 支持使用 uncrustify
进行 C++ 风格 linting、使用 cppcheck
进行静态 C++ 代码检查、检查源代码中的版权、使用 pep8
进行 Python 风格 linting 等。
辅助包列表将来可能会增加。
元构建工具
这是一个知道如何对一组软件包进行拓扑排序,并按照正确的依赖顺序构建或测试它们的软件。
该软件将调用构建工具来执行编译、测试和安装软件包的实际工作。
在 ROS 2 中,名为 colcon 用于此。