You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让add_test()执行前先构建add_executable()或add_custom_target()目标?

多阶段CMake构建中测试依赖交叉编译目标的解决方案

问题背景

存在一套分阶段的CMake构建流程:

  • 第一阶段:主机端通过add_executable()生成的二进制程序产出C源码
  • 第二阶段:针对多个交叉编译平台,将生成的C源码编译为平台专属的elf可执行文件
  • 第三阶段:通过add_test()调用脚本在目标平台执行测试

尝试直接在子项目中配置交叉编译器并设置测试依赖时,set_tests_properties的DEPENDS属性无法被Ninja识别,代码示例:

set(CMAKE_C_COMPILER /path/to/cross-compiler/bin/gcc)
add_executable(foo.elf)
# 省略目标源文件、编译选项等配置
add_test(test_foo COMMAND foo_script.sh foo.elf)
set_tests_properties(test_foo PROPERTIES
  DEPENDS(foo.elf) ...)  # 预期构建foo.elf后执行test_foo,但Ninja忽略该依赖设置

已知FIXTURES_REQUIRED仅能实现测试用例之间的依赖,无法直接让测试依赖目标构建;且受限于流程要求,无法将所有步骤合并为单一构建阶段。

解决方法

1. 标准化交叉编译目标与路径引用

为每个交叉编译平台编写独立的工具链文件,在工具链对应的子项目中,将交叉编译生成的可执行目标统一命名为elf,使用CMake生成器表达式$<TARGET_FILE:elf>来引用最终生成的elf文件路径,避免硬编码文件名带来的维护问题。

2. 分离交叉编译为独立子项目

在主项目的构建树中,通过configure_file()创建新的子项目目录。该子项目的CMakeLists.txt负责:

  • 导入主阶段生成的C源码
  • 加载对应平台的工具链文件配置交叉编译环境
  • 构建生成平台专属的elf文件

这种方式将交叉编译流程与主项目解耦,避免多阶段构建的环境冲突。

3. 串联全流程的测试驱动脚本

通过add_test()调用自定义脚本,脚本内按顺序执行以下操作:

  • 触发主项目构建,完成C源码的生成
  • 配置并构建交叉编译子项目,生成目标平台的elf文件
  • 调用测试脚本,在目标平台执行测试用例

这样确保测试执行前,所有依赖的构建步骤都已完成。


内容的提问来源于stack exchange,提问作者Lance E.T. Compte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 22:23:18