如何在cmake中使用add_test传递$ {CTEST_CONFIGURATION_TYPE}

时间:2012-02-27 15:24:53

标签: windows cmake ctest

我似乎无法弄清楚如何在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}"

无论如何,我可以让它工作,或者我只是必须每次都通过命令行将正确的目录传递给测试?

2 个答案:

答案 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