如何通过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
相关产品推荐
相关产品推荐

