有时候,检查某些东西是否无法构建是很好的,例如:
// Next line should fail to compile: can't convert const iterator to iterator.
my_new_container_type::iterator it = my_new_container_type::const_iterator();
有没有可能把这些类型的东西合并到CMake/CTest中?我正在CMakeLists.txt
中寻找类似这样的东西:
add_build_failure_executable(
test_iterator_conversion_build_failure
iterator_conversion_build_failure.cpp)
add_build_failure_test(
test_iterator_conversion_build_failure
test_iterator_conversion_build_failure)
(Of当然,据我所知,这些特定的CMake指令并不存在。)
3条答案
按热度按时间pxyaymoc1#
你可以按照你所描述的或多或少地做这件事。你可以添加一个编译失败的目标,然后添加一个调用
cmake --build
来尝试构建目标的测试。剩下的就是把测试属性WILL_FAIL
设置为true。因此,假设您将测试存放在名为“will_fail.cpp”的文件中,该文件包含:
然后,您可以在CMakeLists.txt中看到如下内容:
如果要编写大量的函数或宏,显然可以将所有这些内容 Package 到一个函数或宏中。
ttygqcqt2#
@Fraser的回答是一个很好的方法,特别是
WILL_FAIL
属性是一个很好的建议。尽管有一个替代方法可以让失败的目标成为主项目的一部分。问题中的用例与ctest --build-and-test
模式的用途差不多。与其让预期失败的目标成为主构建的一部分,你可以把它放在它自己独立的小项目中,然后把它作为测试的一部分来构建。2一个在主项目中看起来像这样的例子:这样做的好处是,它将成为项目测试结果的一部分,因此更有可能作为正常测试过程的一部分被定期执行。在上面的例子中,
test_iter
目录实际上是它自己的独立项目。如果您需要从主构建向它传递信息,您可以通过添加--build-options
来定义传递给CMake运行的缓存变量。请查看最新的文档以获得有关此区域的最新更正/澄清帮助。zy1mlcev3#
对于问题中的特定示例,我同意评论。这应该用
static_assert
而不是构建失败测试来测试。对于用CMake添加构建失败测试的方法(如果这是个好主意的话),我最近创建了一个库,它或多或少地允许用一个CMake函数调用添加这样的测试。它扩展了可接受的答案,允许构建失败测试,并检查失败是因为一个特定的错误而发生的(预期的错误可以在CMake或源文件中提供):https://github.com/iboB/icm/blob/master/icm_build_failure_testing.cmake