我有一个基于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
我想启用ctest,因此在根CMakeLists.txt中,我有include(CTest)
;在特定于组件的CMakeLists.txt文件中,我
if(BUILD_TESTING)
add_subdirectory(tests)
endif()
在compX / tests / CMakeLists.txt中,我具有用于编译测试和add_test()
命令的代码。测试已成功编译,我可以手动运行它们。但是,如果我呼叫ctest
,它将返回
No tests were found!!!
玩了一点之后,结果发现,如果我像这样将add_subdirectory(tests)
调用移至根CMakeLists.txt:
if(BUILD_TESTING)
add_subdirectory(comp1/tests)
endif()
有效。但是我发现将组件特定的内容放到根文件中非常丑陋和混乱。
相反,我尝试将include(CTest)
命令下移一个级别到特定于组件的CMakeLists.txt中。但是ctest
对此表示抱怨:
*********************************
No test configuration file found!
*********************************
是否真的无法将ctest与上述目录结构一起使用?
答案 0 :(得分:0)
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程序在运行时将查找的文件。