我似乎无法弄清楚如何在cmake中使用add_test传递$ {CTEST_CONFIGURATION_TYPE}而不使用CMake添加其他转义字符。
我目前正在使用cmake生成VS项目文件并设置RUNTIME_OUTPUT_DIRECTORY,并且需要使用此目录+配置作为一些测试的工作目录,因为它们依赖于其他构建的可执行文件。
我尝试过使用
add_test(NAME test
WORKING_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/\${CTEST_CONFIGURATION_TYPE}"
COMMAND test ${TEST_ARGS})
这正确地找到了我的测试可执行文件,但生成的CTestTestfile.cmake文件包含
WORKING_DIRECTORY "<CORRECT_RUNTIME_PATH>/\${CTEST_CONFIGURATION_TYPE}"
无论如何,我可以让它工作,或者我只是必须每次都通过命令行将正确的目录传递给测试?
答案 0 :(得分:2)
目前在一般情况下这是不可能的。在下一版本的CMake中,您应该能够使用此commit中的功能在测试属性中使用生成器表达式。
答案 1 :(得分:1)
<强>更新强>
正如@mathstuf在他自己的answer中指出的那样,从版本2.8.12开始,CMake支持WORKING_DIRECTORY
add_test
参数中的生成器表达式。这使我的其余部分仅适用于CMake v2.8.11及以下版本。
据我所知,如果ADD_TEST
没有在CTestTestfile.cmake
转义,最终无法传递“$”。
真正处理这种情况的“CMake”方法可能是将依赖的exes作为命令行参数传递给test exe,这将涉及更改测试代码。如果从属可执行文件都是CMake目标,则可以使用“ADD_TEST
”在$<TARGET_FILE:tgt>
命令中引用它们,其中tgt
是CMake目标的名称。
然而,你可以使用一个大而脏的黑客来解决这个问题。将您的ADD_TEST
命令替换为:
ADD_TEST(NAME test WORKING_DIRECTORY "@WORKING_DIR@" COMMAND test ${TEST_ARGS})
FILE(WRITE ${CMAKE_BINARY_DIR}/CTestCustom.cmake
"SET(WORKING_DIR \"${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/\\\${CTEST_CONFIGURATION_TYPE}\")\n")
FILE(APPEND ${CMAKE_BINARY_DIR}/CTestCustom.cmake
"CONFIGURE_FILE(${CMAKE_BINARY_DIR}/CTestTestfile.cmake ${CMAKE_BINARY_DIR}/CTestTestfile.cmake @ONLY)\n")
这是(ab)通过创建在CTestCustom.cmake
之前调用的CTestTestfile.cmake
文件来使用CTest的行为。运行CMake后,CTestTestfile.cmake
有一行
SET_TESTS_PROPERTIES(test PROPERTIES WORKING_DIRECTORY "@WORKING_DIR@")
通过运行CTest并调用CTestCustom.cmake
,"@WORKING_DIR@"
将替换为正确的值。
这真的是一个黑客;搞乱自动生成的CMake文件会遇到麻烦,但是只有你有时间重构你的测试或者CMake能够更好地支持每个配置WORKING_DIRECTORY
。