2

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

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

4

2 回答 2

2

这在一般情况下目前是不可能的。在 CMake 的下一个版本中,您应该能够使用此提交中的功能在测试属性中使用生成器表达式。

于 2013-09-18T18:47:41.683 回答
1

更新:

正如@mathstuf在他自己的回答中指出的那样,从 2.8.12 版开始,CMake 支持在. 这使得我的其余答案仅适用于 CMake v2.8.11 及更低版本。WORKING_DIRECTORYadd_test


据我所知,如果ADD_TEST没有最终在CTestTestfile.cmake.

真正处理这种情况的“CMake”方法可能是将依赖的 exe 作为命令行参数传递给测试 exe,这将涉及更改测试代码。如果依赖的可执行文件都是 CMake 目标,则可以在ADD_TEST命令中使用“ $<TARGET_FILE:tgt>”引用它们,其中tgtCMake 目标的名称。

但是,您可以使用一个大而肮脏的技巧来解决这个问题。将您的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文件来使用 CTest 的行为,该文件在CTestTestfile.cmake. 运行 CMake 后,CTestTestfile.cmake有行

SET_TESTS_PROPERTIES(test PROPERTIES  WORKING_DIRECTORY "@WORKING_DIR@")

通过运行 CTest 并调用CTestCustom.cmake,将"@WORKING_DIR@"替换为正确的值。

这真的是一个黑客;弄乱自动生成的 CMake 文件是自找麻烦,但在您有时间重构测试或 CMake 能够更好地支持 per-configuration 之前,它可以做到WORKING_DIRECTORY

于 2012-02-28T00:46:47.873 回答