CMake和execute_过程
和cmake有点小麻烦。我在一个奇怪的模式下工作,需要cmake调用一个外部cmake脚本来执行多个命令,作为测试的一部分。我把它归结为这个例子CMake和execute_过程,cmake,Cmake,和cmake有点小麻烦。我在一个奇怪的模式下工作,需要cmake调用一个外部cmake脚本来执行多个命令,作为测试的一部分。我把它归结为这个例子 test.cmake: message("CMD: " ${CMD}) message("ARG: " ${ARG}) execute_process(COMMAND ${CMD} ${ARG} RESULT_VARIABLE result OUTPUT_VARIABLE output
test.cmake:
message("CMD: " ${CMD})
message("ARG: " ${ARG})
execute_process(COMMAND ${CMD} ${ARG}
RESULT_VARIABLE result
OUTPUT_VARIABLE output
)
message("RESULT: " ${result})
message("OUTPUT: " ${output})
mytest:
cmake -DCMD="cmake" -DARG="-E sleep 10" -V -P ./test.cmake
output:
CMD: cmake
ARG: -E sleep 10
CMake Error: The source directory "/Users/user/-E sleep 10" does not exist.
Specify --help for usage, or press the help button on the CMake GUI.
RESULT: 1
它适用于除CMD=cmake之外的所有其他CMD设置。有什么想法吗
将ARG作为“-E;sleep;10”传递是可行的,但我的更高级别项目如下所示:
project( test NONE)
cmake_minimum_required(VERSION 3.0)
enable_testing()
set(ARG "-E;sleep;-10")
# set(ARG "-E;sleep -10")
# set(ARG "-E sleep -10")
add_test( NAME test
COMMAND ${CMAKE_COMMAND} -DCMD=cmake -DARG=${ARG} -P test.cmake)
但这失败了:/
Tony要解决这个问题,您必须使用不同的列表分隔符。例如:
^^
就可以了
请注意,在较新版本的CMake中,使用此类分隔符更新列表也很容易:
list(JOIN ${ARGS} "^^" ARG)
调用test.cmake
将使用以下方法完成:
cmake -DCMD="cmake" -DARG="-E^^sleep^^1" -V -P ./test.cmake
而test.cmake
将如下所示:
message("ARG: ${ARG}")
string(REPLACE "^^" ";" ARGS ${ARG})
message("CMD: ${CMD}")
message("ARGS:")
foreach(argument IN LISTS ARGS)
message(STATUS " ${argument}")
endforeach()
execute_process(COMMAND ${CMD} ${ARGS}
RESULT_VARIABLE result
OUTPUT_VARIABLE output
)
message("RESULT: ${result}")
message("OUTPUT: ${output}")
ARG: -E^^sleep^^1
CMD: cmake
ARGS:
-- -E
-- sleep
-- 1
RESULT: 0
OUTPUT:
输出如下所示:
message("ARG: ${ARG}")
string(REPLACE "^^" ";" ARGS ${ARG})
message("CMD: ${CMD}")
message("ARGS:")
foreach(argument IN LISTS ARGS)
message(STATUS " ${argument}")
endforeach()
execute_process(COMMAND ${CMD} ${ARGS}
RESULT_VARIABLE result
OUTPUT_VARIABLE output
)
message("RESULT: ${result}")
message("OUTPUT: ${output}")
ARG: -E^^sleep^^1
CMD: cmake
ARGS:
-- -E
-- sleep
-- 1
RESULT: 0
OUTPUT:
从错误消息中可以看到,CMake将ARG变量视为单值变量(但带有空格)。您需要列表变量。例如,将其设置为“-E;sleep;10”。可能是工作的Yep的重复!谢谢但我更复杂的问题仍然不起作用。我有一些东西看起来像是有效的!谢谢但我更复杂的问题仍然不起作用。我有一些东西看起来像:
project(test NONE)cmake_minimum_required(VERSION 3.0)enable_testing()set(ARG“-E;sleep;-10”)#set(ARG“-E sleep-10”)#add_test(NAME test COMMAND${cmake_COMMAND}-DCMD=cmake-DARG=${ARG}-P test.cmake)
这会失败……在命令中,用-DARG={ARG ARG
插入双引号。