【问题标题】:How to pass ${CTEST_CONFIGURATION_TYPE} using add_test in cmake如何在 cmake 中使用 add_test 传递 ${CTEST_CONFIGURATION_TYPE}
【发布时间】:2012-02-27 15:24:52
【问题描述】:

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

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

【问题讨论】:

  • 为了澄清,您想传递一个包含文字 ${CTEST_CONFIGURATION_TYPE} 的字符串,而不是 CMake 用变量的内容替换它?
  • 是的,这样生成的 CTestTestfile.cmake 包含行 set_tests_properties(test WORKING_DIRECTORY "/${CTEST_CONFIGURATION_TYPE}")

标签: windows cmake ctest


【解决方案1】:

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

【讨论】:

  • 好电话。 +1 为了清楚起见,我认为这是从 v2.8.12 开始可用的。此外,add_test 中的生成器表达式已经有一段时间了;现在的不同之处在于它们可以在WORKING_DIRECTORY 参数和COMMAND 参数中使用。
【解决方案2】:

更新:

正如 @mathstuf 在他自己的 answer 中指出的那样,从 2.8.12 版开始,CMake 支持 add_testWORKING_DIRECTORY 参数中的生成器表达式。这使得我的其余答案仅适用于 CMake v2.8.11 及以下版本。


据我所知,实际上不可能通过ADD_TEST 传递“$”而不最终在CTestTestfile.cmake 中转义。

真正处理这种情况的“CMake”方法可能是将依赖的 exe 作为命令行参数传递给测试 exe,这将涉及更改测试代码。如果依赖的可执行文件都是 CMake 目标,则可以在 ADD_TEST 命令中使用“$&lt;TARGET_FILE:tgt&gt;”引用它们,其中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 文件来使用CTest 的行为,该文件在CTestTestfile.cmake 之前调用。运行 CMake 后,CTestTestfile.cmake 有一行

SET_TESTS_PROPERTIES(test PROPERTIES  WORKING_DIRECTORY "@WORKING_DIR@")

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

这确实是一个 hack;弄乱自动生成的 CMake 文件是自找麻烦,但在您有时间重构测试或 CMake 能够更好地支持每个配置 WORKING_DIRECTORY 之前,它可以做到。

【讨论】:

  • 测试属性中的生成器表达式现在正在进入 CMake 中。通过这种方式,您可以执行此处测试中所见的操作:cmake.org/gitweb?p=cmake.git;a=commitdiff;h=07934636>
  • @mathstuf 您提供的 git 链接已损坏
  • 看来我无法编辑评论。 Github 链接:github.com/Kitware/CMake/commit/07934636>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
相关资源
最近更新 更多