我有一个基于 CMake 的项目,它由几个子组件组成,这些子组件都可以独立编译和测试。目录布局如下所示:
.
??? CMakeLists.txt
??? comp1
? ??? CMakeLists.txt
? ??? src
? ? ??? foo.cc
? ? ??? foo.h
? ??? tests
? ??? CMakeLists.txt
? ??? test_comp1.cc
??? comp2
??? CMakeLists.txt
??? src
? ??? bar.cc
? ??? bar.h
??? tests
??? CMakeLists.txt
??? test_comp2.cc
Run Code Online (Sandbox Code Playgroud)
我想启用 ctest,因此在我拥有的根 CMakeLists.txtinclude(CTest)和我拥有的特定于组件的 CMakeLists.txt 文件中
if(BUILD_TESTING)
add_subdirectory(tests)
endif()
Run Code Online (Sandbox Code Playgroud)
在 compX/tests/CMakeLists.txt 我有编译测试和add_test()命令的代码。测试成功编译,我可以手动运行它们。但是,如果我打电话ctest,它会返回
No tests were found!!!
Run Code Online (Sandbox Code Playgroud)
在玩了一会儿之后,事实证明,如果我add_subdirectory(tests)像这样将调用移动到根 CMakeLists.txt:
if(BUILD_TESTING)
add_subdirectory(comp1/tests)
endif()
Run Code Online (Sandbox Code Playgroud)
有用。但是我发现将特定于组件的内容放入根文件中非常丑陋和混乱。
相反,我尝试将include(CTest)命令向下移动一级到特定于组件的 CMakeLists.txt。但是ctest抱怨这个:
*********************************
No test configuration file found!
*********************************
Run Code Online (Sandbox Code Playgroud)
有没有办法将 ctest 与上面的目录结构一起使用?
小智 7
CTest 文档不是最清楚的。
我正在做的一个项目有一个类似的目录结构,由不同的单元组成,每个单元都有 src 和 tests 子目录。
CMake 文档说在顶级 CMakeLists.txt 文件中调用“enable_testing()”,并进一步说这个命令将“在当前目录及以下目录启用 CTest”。这听起来是递归的,对吧?好吧,事实并非如此。
每个 CMakeLists.txt 都必须调用 enable_testing() 以在该目录中启用自动 CTest 发现。
因此,在您的项目中,顶层 CMakeLists.txt 将需要 enable_testing(),然后 comp{1,2}/CMakeLists.txt 将需要它,最后 comp{1,2}/tests/CMakeLists.txt 将需要它。
添加这些命令并重新运行 cmake 后,这些目录中的每个目录都将包含一个 CTestTestfile.cmake 文件,这是 ctest 程序在运行时要查找的内容。
| 归档时间: |
|
| 查看次数: |
2524 次 |
| 最近记录: |