构建系统是一切的基石。在ROS生态中,我们从ROS 1 开始考虑构建系统。这一套构建系统相关的包从ROS 1的catkin
迭代至今ament
。将名字改为ament
中的部分原因是我们希望它不会与catkin
相冲突,以便我们需要混合使用它们,并防止与现有的catkin
文档混淆。ament
的主要职责是使开发和维护ROS 2核心包变得更容易。当然,这种工具也可以提供给任何愿意遵循ROS构建系统约定和工具的用户。此外,它可以使包更加规范的,这样开发人员应该能够挑选任何基于ament
构建的包。此规范约束了包如何工作、如何检查以及如何构建或使用。
ament
由几个重要的库组成,它们都在GitHub的ament
组织中:
ament_package
包ament_cmake
库ament_lint
库- 构建工具
ament_package
包
ament/ament_package库包含了一个单独的ament Python包,它为ament包提供了各种实用工具,例如环境hook的模板。
无论底层的编译系统是什么,所有的组件包都必须在包的根目录中包含一个package.xml文件。“manifest”文件package.xml包含处理和操作一个包所需的信息。其中包含了全局唯一的包名和包的依赖项。package.xml还可以作为标记文件,标明包在文件系统中的位置。
在ROS 1中,catkin_pkg
提供了对package.xml文件的解析,解析后可以在文件系统中定位相关包。在ROS 2中构建工具(如colcon
)负责对这些package.xml文件的解析。
package.xml
包清单文件,它描述了包的根目录,包的元信息,包括它的名称、版本、描述、维护者、许可证、依赖关系等等。清单的内容是机器可读的XML格式,相关格式在REPs 127和140中进行了描述,并有可能在未来的REPs中进一步演进。
因此,每当某个包被称为ament package
时,这意味着它是使用package.xml清单文件描述的单个软件单元(源代码、构建文件、测试、文档和其他资源)。
ament package
任何遵循ament打包指南的包,其中包含有package.xml文件。与底层构建系统无关。
由于ament package与构建系统无关,所以存在有ament CMake包、ament Python包等不同种类的ament包。
CMake package
包含普通CMake项目和package.xml清单文件的包。
ament CMake package
遵循ament
打包指南的CMake package。
Python package
包含基于setuptools的Python项目和package.xml清单文件的包。
ament Python package
遵循ament
打包指南的Python package。
ament_cmake
代码库
位于GitHub的ament/ament_cmake,这个库提供了在CMake中创建“ament CMake”package所需的基础设施,包含许多“ament CMake”和纯CMake package。“ament CMake” package指的是:使用CMake构建的ament
package。因此,这个库中的包提供了必要的CMake函数/宏和CMake模块,以便创建更多的“ament CMake”(或ament_cmake
)包。这种类型的包在package.xml文件用<export>
的<build_type>ament_cmake</build_type>
tag进行标记。
上述代码库中的包是非常模块化的,只有一个“瓶颈”包ament_cmake
。ament_cmake
包聚合了这个代码库中所有包的功能。该库中包含有以下包:
ament_cmake
- 聚合此存储库中的所有其他包的功能,用户只需要依赖于此。
ament_cmake_auto
- 提供了方便的CMake函数,可以自动编写包的
CMakeLists.txt
文件的许多繁琐部分
- 提供了方便的CMake函数,可以自动编写包的
ament_cmake_core
- 为
ament
提供所有内置的核心概念,例如环境钩子、资源索引、符号链接安装等
- 为
ament_cmake_gmock
- 为基于gmock的单元测试添加的功能
ament_cmake_gtest
- 为基于gtest的自动化测试添加的功能
ament_cmake_nose
- 为基于nosetests的python自动化测试添加的功能
ament_cmake_python
- 为包含Python代码的包提供CMake函数
ament_cmake_test
- 使用CTest在单个目标下聚合不同种类的测试,例如gtest和nosetests
ament_cmake_core
包中包含大量的CMake基础设施,使包之间能够轻易地通过传统接口传递信息。这使得包之间的构建更为解耦,促进了包的重用,并鼓励不同包的构建系统中的约定。例如,它提供了在包之间传递包含目录、库、定义和依赖项的标准方法,以便该信息的使用者可以以传统方式访问该信息。
ament_cmake_core
包还提供了ament
构建系统的特性,比如符号链接安装,它允许您象征性地将文件从源空间或构建空间链接到安装空间,而无需复制它们。这允许您仅需进行一次安装,然后改动非生成的资源,如Python代码和配置文件,而无需重新运行安装步骤就可使其生效。这一功能本质上取代了catkin
中的“devel space”,因为它带来了大量的优点和很少的复杂性或缺点。
ament_cmake_core
提供的另一个特性是包资源索引,这为包提供了一种表明它们包含某种类型的资源的方法。这个特性的设计使它可以更有效地回答一些简单的问题,比如这个前缀中有哪些包(例如/usr/local
),他只需要你列出该前缀下单个可能位置中的文件。你可以在资源索引的设计文档中阅读更多关于这个特性的内容。
像catkin
一样,ament_cmake_core
也提供了环境设置文件和包特定的环境钩子。常见的环境设置文件如setup.bash
,是包开发人员定义使用其包所需的环境更改。开发人员可以使用“环境钩子”来实现这一点,它基本上是一个任意的shell代码,可以设置或修改环境变量,定义shell函数,设置自动完成规则等等。这个特性提供了类似于在catkin
不知道ROS的发布版本的情况下,使ROS 1设置ROS_DISTRO
环境变量。
ament_lint
代码库
这个代码库位于GitHub的ament/ament_lint,它以方便和一致的方式提供了几个检测和测试服务的包。目前有一些包支持使用uncrustify
进行C++风格检测,使用cppcheck
进行静态c++代码检查,检查源代码版权,使用pep8
进行Python风格检测,以及其他功能。helper包的列表将来可能会增长。
构建工具
构建工具通过一次调用来执行一次构建包工作区的任务。从ROS 2发行Ardent版本开始提供了构建工具ament_tools
。从ROS 2 Bouncy开始,ament_tools
已经被colcon
取代,这在通用构建工具中有所描述。