2024-09-23 16:01:31 +08:00

86 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# AimRT 中的 CMake
AimRT 使用原生标准的 Modern CMake 进行构建,并基于 CMake Fetchcontent 获取依赖。
## Modern CMake
Modern CMake 是目前主流 C++ 项目的常用构建方式,使用面向对象的构建思路,引入了 Target、属性等概念可以将包括依赖在内的各个参数信息全部封装起来大大简化了依赖管理使构建大型系统更有条理、更加轻松。AimRT 框架使用 Modern CMake 进行构建,每个叶子文件夹是一个 CMake Target。库之间相互引用时能自动处理下层级的所有依赖。
关于 Modern CMake 详细使用方式此处不做赘述,您可以参考一些其他教程:
- [CMake official website](https://cmake.org/cmake/help/latest/command/add_library.html)
- [More Modern CMake](https://hsf-training.github.io/hsf-training-cmake-webpage/aio/index.html)
- [Effective Modern CMake](https://gist.github.com/mbinna/c61dbb39bca0e4fb7d1f73b0d66a4fd1)
- [An Introduction to Modern CMake](https://cliutils.gitlab.io/modern-cmake/)
## AimRT 的第三方依赖管理策略
当您准备从源码引用/构建 AimRT 时,您需要了解 AimRT 第三方依赖管理策略:
- AimRT 使用 CMake FetchContent 拉取依赖,关于 CMake FetchContent 的详细使用方式,请参考[CMake官方文档](https://cmake.org/cmake/help/latest/module/FetchContent.html)。
- 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]({}/url_cn.bashrc)'.format(code_site_root_path_url) }} 文件,将备选下载地址设置为环境变量 `AIMRT_DOWNLOAD_FLAGS`,用户可以在 CMake 生成命令中添加该环境变量以从备选地址下载。
要使用备用下载地址,需要首先 `source url_cn.bashrc`,然后 CMake 生成时添加 `AIMRT_DOWNLOAD_FLAGS` 环境变量:
```bash
# 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::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 |