构建系统
构建系统允许开发人员根据需要构建其ROS 2代码。ROS 2在很大程度上依赖于将代码分为软件包,每个软件包都包含一个清单文件(package.xml
)。此清单文件包含有关软件包的基本元数据,包括其对其他软件包的依赖关系。此清单对于元构建工具的正常运行是必需的。
ROS 2构建系统包括3个主要概念。
构建助手
这些是连接到构建工具以提供开发体验的辅助函数。ROS 2软件包通常依赖于``ament``系列的软件包。``ament``由一些重要的存储库组成,它们都在`GitHub组织中 <https://github.com/ament>`_。
``ament_package``软件包
该仓库位于 GitHub 的 ament/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 127 和 140 中进行了描述,并有可能在未来的 REPs 中进行进一步的修改。
因此,每当某个 package 被称为 ament package 时,这意味着它是一个单一的软件单元(源代码、构建文件、测试、文档和其他资源),使用 package.xml 清单文件进行描述。
- ament 包
任何包含 package.xml 并遵循
ament
的打包准则的 package,不论其底层构建系统如何。
由于术语 ament package 不依赖于构建系统,可以存在不同类型的 |ament 包|,例如 ament CMake package,ament 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
为包含 Python 代码的 packages 提供了 CMake 函数
有关 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 分发的情况下设置 `
元构建工具
这是一款软件,知道如何对一组软件包进行拓扑排序,并按照正确的依赖关系顺序构建或测试它们。这款软件将调用构建工具来执行实际的编译、测试和安装软件包的工作。
在ROS 2中,使用名为`colcon <https://colcon.readthedocs.io/en/released/>`__的工具来执行此操作。