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

如何通过CMake的execute_process在CTest中向mpirun传递参数

解决CMake/CTest传递MPI多部分参数的命令解析问题

问题场景

现有如下自定义CTest逻辑:
Macro.cmake:

execute_process(
   COMMAND
   ${MPI_RUN} -np ${NUM_PROC} ${OPTS} ${EXECUTABLE}
   RESULT_VARIABLE status
)

CTest测试用例定义:

add_test(test1 "cmake" "-DMPI_RUN=mpirun" "-DOPTS=--bind-to none" "-DNUM_PROC=2" "-DEXECUTABLE=executable" "-P" "Macro.cmake")

运行CTest verbose模式时,生成的命令为:
'mpirun' '-np' '2' '--bind-to none' 'executable'
此时mpirun报错:

mpirun: Error: unknown option "--bind-to none"

但直接执行mpirun -np 2 --bind-to none executable可正常运行。

原因分析

这不是CMake/CTest的bug,而是参数传递的方式问题:
当通过-DOPTS=--bind-to none传递变量时,CMake会将OPTS视为单一字符串参数。在execute_process执行时,这个完整字符串会被作为一个整体传给mpirun,导致mpirun把--bind-to none当成一个未知的长选项,而不是--bind-to选项搭配none参数。

解决方案

有两种可行的解决方式:

方式一:传递参数时用分号分隔

修改add_test中OPTS的定义,用分号替代空格,让CMake识别为多个独立参数:

add_test(test1 "cmake" "-DMPI_RUN=mpirun" "-DOPTS=--bind-to;none" "-DNUM_PROC=2" "-DEXECUTABLE=executable" "-P" "Macro.cmake")

CMake会自动将分号分隔的内容拆分为两个参数--bind-to和none,最终生成的命令与手动执行的一致。

方式二:在Macro.cmake中显式拆分参数

如果无法修改add_test的调用逻辑,可以在Macro.cmake中使用separate_arguments命令,将包含空格的字符串拆分为多个参数:

separate_arguments(OPTS)
execute_process(
   COMMAND
   ${MPI_RUN} -np ${NUM_PROC} ${OPTS} ${EXECUTABLE}
   RESULT_VARIABLE status
)

separate_arguments会按照空格将OPTS的内容拆分成独立参数,确保mpirun能正确识别选项和对应的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 17:25:09