CMake:使用exclude_from_all在子目录中的enable_testing

时间:2016-02-09 09:55:16

标签: cmake

在我的顶级CMakeLists.txt中,我包含了一些外部库。如果我启用了对我的项目的测试,并且外部库的CMakeLists也调用了enable_testing(),那么这些测试会添加到我自己的项目测试中,然后由于没有构建lib的测试而无法运行。

我不希望构建测试,并且我不希望它们混乱我自己的项目测试。我怎么能这样做?

在我的CMakeLists.txt中:

add_subdirectory(some_ext_lib EXCLUDE_FROM_ALL) ' some_ext_libs tests should not be built nor run

enable_testing()
add_subdirectory(my_own_stuff) ' here the tests should be run
[...]

2 个答案:

答案 0 :(得分:0)

当您使用add_subdirectory时,some_ext_lib不再是外部。您已将其嵌入到您的cmake构建中。如果这是你想要做的,那么最简单的方法可能是添加一个变量和条件逻辑来控制some_ext_lib中测试的构建。例如,在set(BUILD_TESTS_some_ext_lib 0)命令之前使用add_subdirectory,然后修改CMakeLists.txt的{​​{1}}个文件,其中测试位于some_ext_lib逻辑内。

请注意,为简单起见,通常应避免在另一个项目中嵌入一个项目的顶级 if (BUILD_TESTS_some_ext_lib)。也就是说,对于任何给定的cmake项目,只应有一个CMakeLists.txt进行CMakeLists.txt调用并定义初始选项值。现在,任何概括都有有效的例外,但是当你刚刚开始时, 我认为你应该先掌握一些简单的方法。

如果find_package确实是外部,那么您应该安装其cmake配置文件,其他项目将与some_ext_lib命令一起使用。但这需要使用cmake更加复杂。

答案 1 :(得分:0)

我今天遇到了这个问题,并发现了一个(略微肮脏的)技巧来排除子项目测试。这假设您的some_ext_lib cmake文件具有project(some_ext_lib)指令。

add_subdirectory(some_ext_lib EXCLUDE_FROM_ALL) add_custom_target(exclude_some_ext_lib_tests ALL COMMAND rm -f "${some_ext_lib_BINARY_DIR}/CTestTestfile.cmake")

这有效地告诉cmake在some_ext_lib中没有要执行的测试。这种方法的优点是不需要修改some_ext_lib源。