将cmake ctest推广到父级

时间:2018-01-31 15:34:47

标签: cmake ctest

我在超级项目的顶部调用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}列表推广到超级项目的范围内?如果是这样,我可以遍历该列表并从根目录中调用add_test(尽管我可能仍然对工作目录有一些问题)。

我目前解决这个问题的方法是在构建目录的根目录中手动创建CTestTestfile.cmake,并添加add_subdirectory以指向所有项目。如果我从这种情况运行ctest,那么事情就可以了。如果我能让cmake生成这样的CTestTestfile.cmake,那么我会很开心。

1 个答案:

答案 0 :(得分:2)

致电

enable_testing()

在当前目录中为ctest创建infrustructure。

您可以在超级项目CMakeLists.txt中使用此调用,这样您就可以从顶级构建目录运行ctest