【问题标题】:Promote cmake ctest to parent level将 cmake ctest 提升到父级别
【发布时间】:2018-01-31 15:34:46
【问题描述】:

我无法从超级项目顶部调用ctest

我正在运行一个嵌套项目;一个有很多子项目的项目,有时也有子项目。这由 cmake 处理。

superproject
├── project1
│   ├── subproject1a
│   └── subproject1b
├── project2
│   ├── subproject2a
│   └── subproject2b
│   ...
└── projectN
    ├── subprojectN1
    │   ...
    └── subprojectNn

在一些项目和大部分子项目中,我们使用 ctest 来定义测试用例。这些在适用的最低级别(子项目)的 CMakeLists.txt 文件中定义。

用于在最低级别定义、编译和声明 ctests 的 cmake 部分如下所示:

# ${subprojectName} was set earlier in this file
enable_testing()
file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} test/*.cpp)
foreach(testSrc ${TEST_SRCS})

        get_filename_component(testName ${testSrc} NAME_WE)
        set(testName ${subprojectName}_${testName})

        add_executable(${testName} ${testSrc})
        target_link_libraries(${testName} ${subprojectName} Boost::unit_test_framework Boost::dynamic_linking)

        add_test(NAME ${testName} COMMAND ${testName})
endforeach(testSrc)

我希望能够像这样运行 ctest:

mkdir build && cd build
cmake .. 
cmake --build .
ctest

但是,目前我需要这样做:

mkdir build && cd build
cmake ..
cmake --build .
cd project1/subproject1a
ctest
cd ../subproject1b
ctest
...
cd ../subprojectNn
ctest

问题在于 ctest 指令只会在调用 add_test() 的 cmake 级别创建。有没有办法让我将${testName}s 的列表提升到超级项目的范围内?如果是这样,我可以遍历该列表并从根目录调用add_test(尽管我可能仍然对工作目录有一些问题)。

我目前解决这个问题的方向是在构建目录的根目录中手动创建一个 CTestTestfile.cmake,并添加 add_subdirectory 以指向所有项目。如果我在这种情况下运行ctest,那么一切正常。如果我能让 cmake 生成这样的 CTestTestfile.cmake,那我会很高兴。

【问题讨论】:

  • The problem is that the ctest instructions will only be created at the cmake level where add_test() was called. - 很可能是 enable_testing() 调用为 ctest 创建基础架构,而不是 add_test() 调用。
  • 是的,这行得通!最高级别现在有enable_testing()add_test() 在低于它的任意级别调用。我现在可以从超级项目中拨打ctest。如果您将此作为答案,我会接受。
  • 当我写我之前的评论时,我实际上是想简单地纠正你的句子。我当时没有考虑这个决定:D

标签: cmake ctest


【解决方案1】:

是呼唤

enable_testing()

在当前目录中为ctest 创建基础结构。

您可以在超级项目CMakeLists.txt 中使用此调用,因此您将能够从顶级构建目录运行ctest

【讨论】:

  • 可能需要注意:enable_testing() 指令必须放在根/父 CMakeLists 中 add_subdirectory 指令之前,即使这些指令也启用了测试。
  • 上次我检查过,enable_testing 可以放在子目录中,ctest 在该子目录中工作(而不是在顶级构建目录中)。从那时起,情况可能发生了变化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
相关资源
最近更新 更多