cmake / ctest生成Test.xml不重建吗?/无法加载缓存

问题描述

我有一个基于cmake的(C ++)项目,其中包括通过add_test()创建的测试。 构建过程基本上是:

  • cmake
  • 建立所有测试套件
  • 进行测试

这工作了一段时间了。

我现在正在尝试使我的构建生成一个Test.xml,并将其作为管道构建的一部分提交。它不适用于该项目。

Q1我可以告诉cmake我要生成Test.xml时(进行测试)运行测试吗?

目前,我相信只能通过运行Test.xml来创建ctest。 大概ctest汇总了测试结果,而cmake只是盲目地运行它们? 有人可以确认或驳斥吗?

所以我目前正在尝试使用以下命令运行ctest:

ctest -vv -debug --output-on-failure -T test

因为这确实创建了我需要的Test.xml文件。 我必须添加include(CTest)include(Dart)来修复“ Could not find DartConfiguration.tcl”。

但是,即使我以前运行过“ make test”,它也保证了构建是最新的,它仍然尝试构建,并且我得到了:

Error: Could not load cache

对于运行已编译测试的测试(基于脚本的测试可以正常工作)。 它正在执行的命令是:

/opt/cmake-3.18.1/bin/cmake "--build" "<projectDir>/test/<TestName>" --target "<test_exe>"

CMakeCache.txtCMakeLists.txt实际上位于“ <projectDir>/cmake”中,这就是为什么无法加载缓存的原因。 该命令应为:

/opt/cmake-3.18.1/bin/cmake "--build" "<projectDir>/cmake" --target "<test_exe>"

Q2是否有某种方法可以告诉ctest不需要运行cmake?

我的怀疑不是。 ctest是否必须调用cmake来运行测试?它只是监视和汇总输出吗?

如果我查看DartConfiguration.tcl,就会发现:

SourceDirectory: <projectDir/cmake
BuildDirectory: <projectDir/cmake
ConfigureCommand: "/opt/cmake-3.18.1/bin/cmake" "<projectDir/cmake"
MakeCommand: /opt/cmake-3.18.1/bin/cmake --build . --config "${CTEST_CONfigURATION_TYPE}" -- -i

我正在运行ctest -T test而不是ctest -T build-and-test为什么ctest完全尝试构建?

我尝试设置Ctest_build_command,但它似乎对生成的DartConfiguration.tcl没有影响。

一些说明:

  • ctest适用于其他使用源代码以外版本的项目

  • 如果不进行大规模重构,该人将无法使用源代码以外的版本。

  • 源根实际上是“ <projectDir>

  • CMakeLists.txt位于“ <projectDir>/cmake”中

  • 程序源代码位于“ <projectDir>/src”中

  • 测试脚本和代码位于“ <projectDir>/test”中

  • 我的构建工作于:

    enable_testing()

我以前从未使用过:

include(CTest)
include(Dart)

其中一个创建DartConfiguration.tcl,它只是“键:值”对的列表。我认为这是在直接调用ctest时使用的,这里不是这种情况。 尽管阅读了this,我仍不清楚它们的真正用途和目的。

也发布在cmake讨论频道-https://discourse.cmake.org/t/cmake-ctest-generate-test-xml-without-rebuilding-could-not-load-cache/2025

解决方法

事实证明,我有一些伪测试用于通过cmake --build来构建测试驱动程序。这些是使用CMAKE_CURRENT_DIRECTORY而不是CMAKE_SOURCE_DIR明确且莫名其妙地使用的。糟糕!