Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用-D将列表传递给CMake?_Cmake - Fatal编程技术网

如何使用-D将列表传递给CMake?

如何使用-D将列表传递给CMake?,cmake,Cmake,我正在尝试调用add_test(),如下所示: add_test(NAME ${TEST_NAME} COMMAND cmake -DTEST_PROG:FILEPATH=${TEST_EXECUTABLE} ... -DTEST_EXEC_DIRS:PATH=${TEST_EXEC_DIRS} -P SciTextCompare.cmake ) ${TEST_EXEC_DIRS}是一个CMake列表,当我执行上述代码时,CTestTestfile.CMake中的结果行只包含列

我正在尝试调用add_test(),如下所示:

add_test(NAME ${TEST_NAME} COMMAND cmake
  -DTEST_PROG:FILEPATH=${TEST_EXECUTABLE} 
 ...
  -DTEST_EXEC_DIRS:PATH=${TEST_EXEC_DIRS}
  -P SciTextCompare.cmake
)
${TEST_EXEC_DIRS}是一个CMake列表,当我执行上述代码时,CTestTestfile.CMake中的结果行只包含列表中的第一项,因此我使用以下参数结束CMake:

"cmake" "-DTEST_PROG:FILEPATH=C:/path/to/my/executable" ... "-DTEST_EXEC_DIRS:PATH=C:/first/dir/in/list" "-P" "SciTextCompare.cmake"
我如何传入列表并让它像这样调用cmake:

"cmake" "-DTEST_PROG:FILEPATH=C:/path/to/my/executable" ... "-DTEST_EXEC_DIRS:PATH=C:/first/dir/in/list;C:/second/dir/in/list" "-P" "SciTextCompare.cmake"
可能有(或将有)一种更好的方法,但您可以使用一种变通方法,暂时用不同的字符替换CMake列表分隔符(即

我倾向于使用ASCII控制字符,以避免意外地替换
s(这将在调出替换分隔符时导致错误)

因此,在CMakeLists.txt中,您可以执行以下操作:

string(ASCII 2 WORKAROUND_SEPARATOR)

string(REPLACE ";" ${WORKAROUND_SEPARATOR}
       WORKAROUND_TEST_EXEC_DIRS "${TEST_EXEC_DIRS}")

add_test(NAME ${TEST_NAME} COMMAND ${CMAKE_COMMAND}
  -DTEST_PROG:FILEPATH=${TEST_EXECUTABLE}
  ...
  -DWORKAROUND_TEST_EXEC_DIRS:PATH=${WORKAROUND_TEST_EXEC_DIRS}
  -DWORKAROUND_SEPARATOR:INTERNAL=${WORKAROUND_SEPARATOR}
  -P SciTextCompare.cmake
)
然后在SciTextCompare.cmake中,您只需将普通分隔符调回:

string(REPLACE ${WORKAROUND_SEPARATOR} ";"
       TEST_EXEC_DIRS "${WORKAROUND_TEST_EXEC_DIRS}")

一个小问题-如果CMAKE可执行文件不在系统路径中,您可能更喜欢
${CMAKE_COMMAND}
,而不是
CMAKE

如果您使用的是CMAKE版本2.8.11或更高版本,则可以使用
$
来防止对带有“;”的参数进行列表扩展:

cmake_minimum_required(VERSION 2.8.11)
...
string (REPLACE ";" "$<SEMICOLON>" GENERATOR_TEST_EXEC_DIRS "${TEST_EXEC_DIRS}")
add_test(NAME ${TEST_NAME} COMMAND ${CMAKE_COMMAND}
  -DTEST_PROG:FILEPATH=${TEST_EXECUTABLE} 
 ...
  -DTEST_EXEC_DIRS:PATH=${GENERATOR_TEST_EXEC_DIRS}
  -P SciTextCompare.cmake
)
cmake_最低要求(版本2.8.11)
...
字符串(替换“$”生成器\u TEST\u EXEC\u DIRS“${TEST\u EXEC\u DIRS}”)
添加测试(名称${test\u NAME}命令${CMAKE\u命令}
-DTEST_PROG:FILEPATH=${TEST_EXECUTABLE}
...
-DTEST_EXEC_DIRS:PATH=${GENERATOR_TEST_EXEC_DIRS}
-P SciTextCompare.cmake
)

谢谢你,弗雷泽!这基本上就是我最后要做的,尽管我使用了一个“@”作为变通分隔符。使用控制字符的解决方案更好。我只是希望有一种直接的方法。另外,我实际上使用的是${CMAKE_COMMAND},我只是想简化代码片段,但这是我应该不去管的地方。是的-比我的答案更好:-)我会把我的留给那些版本<2.8.11的人,但我认为这应该被标记为正确的答案。