AimRT 中的 CMake

AimRT 使用原生标准的 Modern CMake 进行构建,并基于 CMake Fetchcontent 获取依赖。

Modern CMake

Modern CMake 是目前主流 C++ 项目的常用构建方式,使用面向对象的构建思路,引入了 Target、属性等概念,可以将包括依赖在内的各个参数信息全部封装起来,大大简化了依赖管理,使构建大型系统更有条理、更加轻松。AimRT 框架使用 Modern CMake 进行构建,每个叶子文件夹是一个 CMake Target。库之间相互引用时能自动处理下层级的所有依赖。

关于 Modern CMake 详细使用方式此处不做赘述,您可以参考一些其他教程:

AimRT 的第三方依赖管理策略

当您准备从源码引用/构建 AimRT 时,您需要了解 AimRT 第三方依赖管理策略:

  • AimRT 使用 CMake FetchContent 拉取依赖,关于 CMake FetchContent 的详细使用方式,请参考CMake官方文档

  • AimRT 默认从各个第三方依赖的官方下载地址进行下载,如果你想通过自定义的下载地址下载这些依赖,可以参考cmake/GetXXX.cmake中的代码,在构建时传入-DXXX_DOWNLOAD_URL参数,将下载url修改为您自定义的地址。

  • 如果您的构建环境无法连接外部网络,你也可以离线的下载这些依赖,然后参考cmake/GetXXX.cmake中的代码,在构建时传入-DXXX_LOCAL_SOURCE参数,将依赖寻找地址转为您指定的本地地址。

  • 如果以上方式还不满足您对依赖管理的自定义需求,您也可以直接自定义cmake/GetXXX.cmake中的代码,只要引入满足 AimRT 构建所需的 CMake Target 即可。

  • 请注意,AimRT 仅验证了默认参数中配置的各个第三方依赖的版本,如果您需要升级或降级这些第三方依赖的版本,请自行保证兼容性和稳定性。

AimRT 在构建过程中,大部分依赖都默认从 github 下载,其中部分依赖如 Boost 体积较大,如果由于网络问题下载失败,可以考虑使用 AimRT 提供的 gitee 备选下载地址。

在 linux 平台上,可以参考 url_cn.bashrc 文件,将备选下载地址设置为环境变量 AIMRT_DOWNLOAD_FLAGS,用户可以在 CMake 生成命令中添加该环境变量以从备选地址下载。

要使用备用下载地址,需要首先 source url_cn.bashrc,然后 CMake 生成时添加 AIMRT_DOWNLOAD_FLAGS 环境变量:

# Set AIMRT_DOWNLOAD_FLAGS to download from mirror site
source url_cn.bashrc
# Add AIMRT_DOWNLOAD_FLAGS to cmake generate command
cmake -Bbuild ... $AIMRT_DOWNLOAD_FLAGS

AimRT 的 CMake 选项

AimRT 框架由其 interface 层、runtime 主体,加上多个插件、工具共同组成,在构建时可以通过配置 CMake 选项,选择其中一部分或全部进行构建。详细的 CMake 选项列表如下:

CMake Option名称

类型

默认值

作用

AIMRT_BUILD_TESTS

BOOL

OFF

是否编译测试

AIMRT_BUILD_EXAMPLES

BOOL

OFF

是否编译示例

AIMRT_BUILD_DOCUMENT

BOOL

OFF

是否构建文档

AIMRT_BUILD_RUNTIME

BOOL

ON

是否编译运行时

AIMRT_BUILD_CLI_TOOLS

BOOL

OFF

是否编译 cli 工具

AIMRT_BUILD_PYTHON_RUNTIME

BOOL

OFF

是否编译 Python 运行时

AIMRT_USE_FMT_LIB

BOOL

ON

是否使用 Fmt 库,如果设为 OFF 将使用 std::format

AIMRT_BUILD_WITH_PROTOBUF

BOOL

ON

是否使用 Protobuf 库

AIMRT_USE_LOCAL_PROTOC_COMPILER

BOOL

OFF

是否使用本地的 protoc 工具

AIMRT_USE_PROTOC_PYTHON_PLUGIN

BOOL

OFF

是否使用 Python 版本 protoc 插件

AIMRT_BUILD_WITH_ROS2

BOOL

OFF

是否使用 ROS2 Humble

AIMRT_BUILD_NET_PLUGIN

BOOL

OFF

是否编译 Net 插件

AIMRT_BUILD_ROS2_PLUGIN

BOOL

OFF

是否编译 ROS2 Humble 插件

AIMRT_BUILD_MQTT_PLUGIN

BOOL

OFF

是否编译 Mqtt 插件

AIMRT_BUILD_ZENOH_PLUGIN

BOOL

OFF

是否编译 Zenoh 插件

AIMRT_BUILD_ICEORYX_PLUGIN

BOOL

OFF

是否编译 Iceoryx 插件

AIMRT_BUILD_RECORD_PLAYBACK_PLUGIN

BOOL

OFF

是否编译录播插件

AIMRT_BUILD_TIME_MANIPULATOR_PLUGIN

BOOL

OFF

是否编译 time manipulator 插件

AIMRT_BUILD_PARAMETER_PLUGIN

BOOL

OFF

是否编译 parameter 插件

AIMRT_BUILD_LOG_CONTROL_PLUGIN

BOOL

OFF

是否编译日志控制插件

AIMRT_BUILD_OPENTELEMETRY_PLUGIN

BOOL

OFF

是否编译 opentelemetry 插件

AIMRT_BUILD_GRPC_PLUGIN

BOOL

OFF

是否编译 grpc 插件

AIMRT_INSTALL

BOOL

ON

是否需要 install aimrt

AIMRT_BUILD_PYTHON_PACKAGE

BOOL

OFF

是否编译 aimrt-py whl包

AimRT 中的 CMake Target

AimRT 中所有的可引用的非协议类型 CMake Target 如下:

CMake Target名称

作用

需要开启的宏

aimrt::common::util

一些独立基础工具,如 string、log 等

aimrt::common::net

一些独立的网络工具,基于 boost asio/beast

AIMRT_BUILD_RUNTIME、AIMRT_BUILD_NET_PLUGIN 或 AIMRT_BUILD_GRPC_PLUGIN

aimrt::common::ros2_util

独立的 ros2 相关的基础工具

AIMRT_BUILD_WITH_ROS2

aimrt::interface::aimrt_module_c_interface

模块开发接口-C 版本

aimrt::interface::aimrt_module_cpp_interface

模块开发接口-CPP 版本

aimrt::interface::aimrt_module_protobuf_interface

模块开发 protobuf 相关接口,基于 CPP 接口

AIMRT_BUILD_WITH_PROTOBUF

aimrt::interface::aimrt_module_ros2_interface

模块开发 ros2 相关接口,基于 CPP 接口

AIMRT_BUILD_WITH_ROS2

aimrt::interface::aimrt_pkg_c_interface

Pkg 开发接口

aimrt::interface::aimrt_core_plugin_interface

插件开发接口

AIMRT_BUILD_RUNTIME

aimrt::interface::aimrt_type_support_pkg_c_interface

type support 接口

aimrt::runtime::core

运行时核心库

AIMRT_BUILD_RUNTIME