【发布时间】:2019-02-06 10:06:04
【问题描述】:
我有一个基于 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()command。测试成功编译,我可以手动运行它们。但是,如果我调用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 吗?
【问题讨论】:
-
可能是
comp1/CMakeLists.txt禁用了BUILD_TESTING选项,或者替换了add_test命令。注意,如果你在子目录中调用include(CTest),ctest也应该在子目录中执行;它在顶级目录中不起作用。 -
“替换
add_test”是什么意思? -
标准 CMake 命令可以替换为用户提供的同名函数或宏。例如。可以定义
function(add_test)。在任何地方,我们只能猜测您的tests/CMakeLists.txt出了什么问题 - 您没有在问题帖子中显示。 -
您是否尝试使用
cmake --build build --target test(UNIX) 运行它们?否则必须从调用enable_testing()的二进制目录运行ctest(由宏include(CTest)在内部完成) ) 源:gitlab.kitware.com/cmake/cmake/blob/master/Modules/…