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

如何在CMake 3.26中模拟CMAKE_TEST_LAUNCHER的测试启动功能

在CMake 3.26中模拟CMAKE_TEST_LAUNCHER功能运行RISC-V Spike测试

你的问题根源在于:将带参数的模拟器命令与目标文件拼接成单个字符串传给add_test的COMMAND参数时,CTest会把整个字符串当作单个可执行文件路径去查找,而非拆分出可执行文件和参数,因此报错。以下是几种正确的配置方案:

方案1:直接拆分COMMAND参数项

如果TOOLCHAIN_TEST_SIMULATOR本身是一个包含模拟器路径和参数的列表(而非带空格的字符串),直接展开后与目标文件路径拼接即可:

add_test(NAME MyRiscvTest
         COMMAND ${TOOLCHAIN_TEST_SIMULATOR} $<TARGET_FILE:MyTestTarget>)

$<TARGET_FILE:MyTestTarget>是CMake生成器表达式,会自动替换为测试目标的二进制文件路径,适配不同平台的路径格式。

方案2:将带参数的模拟器字符串拆分为列表

若TOOLCHAIN_TEST_SIMULATOR是带空格的字符串(比如"spike --isa=rv64gc"),先将其拆分为CMake列表,确保每个参数独立:

# 按空格拆分模拟器命令为列表
string(REPLACE " " ";" SIMULATOR_CMD_LIST ${TOOLCHAIN_TEST_SIMULATOR})

add_test(NAME MyRiscvTest
         COMMAND ${SIMULATOR_CMD_LIST} $<TARGET_FILE:MyTestTarget>)

此时CTest会把列表第一个元素(spike)当作可执行文件,后续元素依次作为模拟器参数和测试目标文件。

方案3:用Shell脚本封装(处理特殊字符场景)

如果模拟器命令包含引号、转义字符等特殊内容,可通过Shell脚本封装调用逻辑:

  1. 创建run_test.in模板文件:
#!/bin/bash
${TOOLCHAIN_TEST_SIMULATOR} "$@"
  1. 在CMake中配置并生成可执行脚本:
# 替换模板中的变量,生成实际脚本
configure_file(run_test.in run_test.sh @ONLY)
# 赋予脚本执行权限
chmod +x ${CMAKE_CURRENT_BINARY_DIR}/run_test.sh

add_test(NAME MyRiscvTest
         COMMAND ${CMAKE_CURRENT_BINARY_DIR}/run_test.sh $<TARGET_FILE:MyTestTarget>)

额外注意事项

  • 若模拟器需要特定环境变量,可在add_test中通过ENV参数设置:
add_test(NAME MyRiscvTest
         COMMAND ${SIMULATOR_CMD_LIST} $<TARGET_FILE:MyTestTarget>
         ENV "RISCV_PATH=${RISCV_INSTALL_DIR}")

内容的提问来源于stack exchange,提问作者confusedandsad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:13:21