在我的顶级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
[...]
答案 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
源。