2014-01-08 34 views
3

我想打電話給add_test(),像這樣:如何使用-D將一個列表傳遞給CMake?

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" 

回答

4

如果您正在使用CMake的版本2.8.11或更高版本可以使用generator expression$<SEMICOLON>,以防止與參數列表擴展「;」:

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 
) 
+0

是的 - 比我的更好的答案:-)我會留下那些堅持版本<2.8.11的人,但這應該被標記爲我想的正確答案。 – Fraser

+0

@Fraser謝謝! – sakra

+0

完美,謝謝! –

2

ŧ這裏可能是(或者將會)是一種比這更好的方式,但是你可以使用一種解決方法來臨時替換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

+0

謝謝,弗雷澤!這實際上是我最終做的,儘管我使用'@'作爲解決方法分隔符。使用控制字符的解決方案更好。我只是希望有一種方法可以直接做到。另外,我實際上使用$ {CMAKE_COMMAND},我只是想簡化代碼片段,但那是我應該放棄它的一個地方。 –

相關問題