添加unittest组件时Zephyr base64测试样例构建失败:sysbuild_cache未找到
问题现象
构建Zephyr base64单元测试样例时,若在CMake命令中添加unittest组件以启用Mock功能:
find_package(Zephyr COMPONENTS unittest REQUIRED HINTS $ENV{ZEPHYR_BASE})
构建会失败,核心错误为:
get_property could not find TARGET sysbuild_cache. Perhaps it has not yet been created.
移除unittest组件后构建恢复正常。使用nRF Connect for VSCode生成的构建命令,或手动执行带--sysbuild参数的west build命令,均会触发该错误。
环境信息
- SDK/工具链版本:3.0.2
- west版本:1.5.0
- nRF Connect for VSCode:2026.3.1484
- CMake版本:4.2.3
- Python版本:3.12.11
最小复现示例(MRE)
文件结构
base64/ ├─ CMakeLists.txt ├─ main.c ├─ prj.conf ├─ testcase.yaml
失败的CMakeLists.txt
cmake_minimum_required(VERSION 3.20.0) find_package(Zephyr COMPONENTS unittest REQUIRED HINTS $ENV{ZEPHYR_BASE}) project(base64) target_sources(testbinary PRIVATE main.c)
正常的CMakeLists.txt
cmake_minimum_required(VERSION 3.20.0) find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) project(base64) target_sources(app PRIVATE main.c)
main.c
#include <zephyr/ztest.h> ZTEST(lib_base64, test_base64_codec) { zassert_equal(1, 1, "1 doesn't equal 1"); } ZTEST_SUITE(lib_base64, NULL, NULL, NULL, NULL, NULL);
prj.conf
CONFIG_ZTEST=y
testcase.yaml
tests: utilities.base64: tags: base64 type: unit
构建命令
west build --build-dir /h*****/project/base64/build /h*****/project/base64 --pristine --board native_posix/native/64
解决方案
方案1:调整CMake加载顺序,延迟加载unittest组件
修改CMakeLists.txt,不在find_package中指定unittest组件,而是在project之后通过include(zephyr/unittest)启用Mock功能:
cmake_minimum_required(VERSION 3.20.0) find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) project(base64) # 加载unittest组件以启用Mock功能 include(zephyr/unittest) target_sources(testbinary PRIVATE main.c)
同时在prj.conf中添加Mock功能的配置:
CONFIG_ZTEST=y CONFIG_ZTEST_MOCK=y
方案2:移除构建命令中的--sysbuild参数
Zephyr单元测试(尤其是native_posix平台)无需使用sysbuild模式(该模式用于多镜像构建场景)。修改构建命令,去掉--sysbuild参数即可正常构建。
若使用nRF Connect for VSCode,可在VSCode的构建配置(如.vscode/settings.json或构建任务)中移除--sysbuild参数,避免自动生成带该参数的命令。
原理说明
在find_package(Zephyr)中指定unittest组件时,CMake会提前加载unittest的相关脚本,而这些脚本会尝试访问sysbuild_cache目标——该目标由sysbuild框架在后续流程中创建,因此触发"未找到目标"的错误。通过延迟加载unittest组件,或移除不必要的--sysbuild参数,可确保CMake在访问sysbuild_cache前完成目标创建。
内容的提问来源于stack exchange,提问作者BLACKSPIRE

