# Sysbuild 命名空间机制:区分全局、特定域与共享配置
在 Zephyr 项目中,Sysbuild 作为高级构建系统,能够组合多个构建系统(如 MCUboot 引导加载程序和主应用程序)形成分层构建体系。当使用 Sysbuild 管理多图像系统时,核心挑战在于如何清晰地区分属于 Sysbuild 自身的配置、特定 Zephyr 应用程序的配置以及共享的全局配置。本文依据 Zephyr 项目文档介绍其命名空间机制。
## 架构概览与配置入口
Sysbuild 通过 CMake 和 Kconfig 进行配置。在多层级构建中,所有 CMake 变量首先由 Sysbuild 处理。Sysbuild 为每个管理的域(Domain)创建独立的命名空间,该命名空间的前缀即为域的 application name(应用名称)。例如,若主应用名为 `my_sample`,则其命名空间前缀为 `my_sample_`。
对于 Sysbuild 自身的配置,使用特定的全局命名空间前缀 `SB_CONFIG_`。这种分离机制确保了配置指令能准确指向目标系统:是作用于 Sysbuild 整体、某个特定域(如 MCUboot),还是所有域共享的全局设置。
## CMake 变量命名空间
在命令行中传递 CMake 变量时,需根据目标对象选择前缀:
1. **Sysbuild 自身配置**:使用 `-DSB_CONFIG_<var>=<value>`。例如,启用 MCUboot 引导加载程序时,设置 `SB_CONFIG_BOOTLOADER_MCUBOOT=y`。
2. **特定域(应用)配置**:使用 `-D<namespace>_CONFIG_<var>=<value>`。若主应用名为 `my_sample`,则设置其变量需使用 `-Dmy_sample_CONFIG_<var>=<value>`。
3. **全局共享变量**:不带命名空间前缀的 `-D<var>=<value>`(如 `-DBOARD=reel_board`)通常由 Sysbuild 处理并分发给所有域,或者作为主 Zephyr 应用的默认配置入口。文档指出,当未指定 `<namespace>` 时,Kconfig 设置会传递给主 Zephyr 应用。
## Kconfig 命名空间与配置文件
Sysbuild 同样支持通过 Kconfig 选项进行配置,其命名规则与 CMake 变量保持一致:
* **Sysbuild 全局选项**:前缀为 `SB_CONFIG_`。例如在 `sysbuild.conf` 文件中设置 `SB_CONFIG_BOOTLOADER_MCUBOOT=y`。
* **特定域选项**:前缀为 `<namespace>_CONFIG_`。例如 `-Dmy_sample_CONFIG_FOO=BAR`。
用户还可以通过配置文件(如 `sysbuild.conf`)或 CMake 参数 `-DSB_CONF_FILE=<file>` 来管理这些配置。Sysbuild 会自动查找主应用目录下的 `sysbuild.conf`,或通过指定文件名加载自定义配置。
## 多域管理与条件构建
在添加多个 Zephyr 应用程序到 Sysbuild 时,可以通过 `ExternalZephyrProject_Add()` 函数定义域。若需针对同一板卡构建不同核心(如 nRF5340 DK 的多核),需在 `BOARD` 参数中指定具体核心目标。
此外,支持使用 Kconfig 条件控制域的包含与否。通过创建 `Kconfig.sysbuild` 文件,可以定义如 `SECOND_SAMPLE` 这样的选项,默认启用或禁用特定域。对于仅构建不刷写的辅助应用,可设置 `BUILD_ONLY TRUE`,使其不参与默认的 `west flash` 序列,但仍可通过 `west flash --domain <name>` 手动操作。
## 高级配置技巧
* **配置文件后缀支持**:Sysbuild 支持通过 `FILE_SUFFIX` 变量动态选择配置文件。例如,设置 `mcuboot_FILE_SUFFIX="max_log"` 将加载 `mcuboot_max_log.conf`,而主应用可能回退到无后缀的默认文件。
* **依赖管理**:使用 `sysbuild_add_dependencies()` 函数可控制配置和刷写的顺序,确保某些域在特定域之前构建或烧录。
* **合并 Hex 文件**:启用 `SB_CONFIG_MERGED_HEX_FILES` 后,Sysbuild 会为每个唯一的板卡目标生成合并的 hex 文件,便于生产部署。
## 总结
利用 Sysbuild 的命名空间机制,开发者可以灵活地管理复杂的多图像系统。通过区分 `SB_CONFIG_`(全局/Sysbuild)、`<namespace>_CONFIG_`(特定域)以及无前缀的全局变量,能够精确控制构建行为。这种机制不仅支持 MCUboot 等引导加载程序的集成,还允许针对多核 SoC、不同板卡目标进行精细化的条件编译与配置管理。