CMake和execute_过程

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

和cmake有点小麻烦。我在一个奇怪的模式下工作,需要cmake调用一个外部cmake脚本来执行多个命令,作为测试的一部分。我把它归结为这个例子

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
插入双引号。