从CTest脚本中访问CMake缓存变量

4
我的项目链接到一个带有valgrind抑制文件和CMake脚本的第三方库。该脚本将抑制文件的位置存储在CMake缓存变量中。
我编写了一个CTest脚本,可以在我的项目上运行持续测试并提交到仪表板。我想在内存检查阶段使用抑制文件。不幸的是,CTest脚本似乎对CMake缓存一无所知。如何从我的CTest脚本中访问CMake缓存变量?
2个回答

3
您不能直接在 ctest -S 脚本中访问 CMake 缓存变量。
但您可以尝试以下方法:
  1. 使用“include”在 ctest -S 脚本中包含第三方 CMake 脚本(在更新步骤之后,使源代码树保持最新)
  2. 在配置步骤之后读取 CMakeCache.txt 文件以获取感兴趣的缓存变量
  3. 在您的 CMakeLists.txt 文件中添加代码,以编写一个包含您要查找信息的迷你脚本
对于 (1),代码类似于:
include(${CTEST_SOURCE_DIRECTORY}/path/to/3rdParty/script.cmake)

如果脚本只是设置变量值,你可以引用这些变量值,那么这只有在实现简单功能时才是真正可行的。如果它执行任何类似于查找库或添加可执行文件的CMake配置时间操作,则不应该这样做。

对于(2):

file(STRINGS ${CTEST_BINARY_DIRECTORY}/CMakeCache.txt result
  REGEX "^CURSES_LIBRARY:FILEPATH=(.*)$")
message("result='${result}'")
string(REGEX REPLACE "^CURSES_LIBRARY:FILEPATH=(.*)$" "\\1"
  filename "${result}")
message("filename='${filename}'")

对于(3):

在CMakeLists.txt文件中:

file(WRITE "${CMAKE_BINARY_DIR}/mini-script.cmake" "
  set(supp_file \"${supp_file_location}\")
")

在您的ctest -S脚本中,在执行ctest_configure调用后:
include("${CTEST_BINARY_DIRECTORY}/mini-script.cmake")
message("supp_file='${supp_file}'")
# use supp_file as needed in the rest of your script

我曾考虑过解决方案(1),但它看起来不是很健壮。你必须知道 script.cmake 做了什么,并且必须假设它在未来的版本中不会改变。另一方面,解决方案(2)依赖于 CMakeCache.txt 文件的格式,而 CMake 可能会在未来的版本中自由更改它。我想我会选择暴力正则表达式解决方案,尽管它们都不是非常令人满意。无论如何,感谢您的回答。 - Arek' Fu
我喜欢解决方案(3),它看起来更加稳健。再次感谢。 - Arek' Fu
在(2)中,CTEST_BINARY_DIRECTORY没有被定义,对吧?实际上我想要从缓存中获取的变量就是CMAKE_BINARY_DIR,这样我就可以将CTEST_BINARY_DIRECTORY设置为它。 - David Doria
在(1),(2)和(3)中,上下文位于ctest -S脚本内。在此上下文中,应该设置CTEST_BINARY_DIRECTORY,可以直接在脚本中设置,也可以通过ctest命令行上的-D由调用者设置。您正在读取的CMakeCache.txt文件的位置是CTEST_BINARY_DIRECTORY。 - DLRdave

0
测试应该通过 ADD_TEST() 命令在您的 CMakeLists.txt 文件中进行配置。然后,CTest 脚本只需调用 ctest_test() 来运行所有已配置的测试。通过这种方式,您可以访问缓存变量,并且可以在任何时候运行 make test 来运行测试。请将 CTest 脚本保存为每夜测试和/或仪表板提交的文件。

那就是为什么我使用脚本--我进行持续测试和提交仪表板。我已经编辑了问题以澄清这一点。 - Arek' Fu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接