CMake:防止在子目录库项目中构建测试可执行文件目标

时间:2019-11-17 17:36:28

标签: c++ testing cmake subdirectory doctest

我已经编写了一个使用doctest的小型库。在CMakeLists.txt中,我有:

...

add_library(my_lib STATIC ${SRCS} $<TARGET_OBJECTS:common_files>)
add_executable(tests ${SRCS} $<TARGET_OBJECTS:common_files>)
target_compile_definitions(my_lib PRIVATE -DDOCTEST_CONFIG_DISABLE)

...

通过add_subdirectory在项目中使用该库时,仅在需要该库时才构建该库和测试可执行文件。

当将CMakeLists.txt作为子目录包括在内时,我该怎么做以防止构建测试,或者有更好的方法来获得类似的结果?

我正在使用Ninja来构建项目。

我可以使用ninja -t targets检查目标,并仅从命令行构建所需的目标,但是我可以让CMake从all目标中排除子目录中的测试吗?

2 个答案:

答案 0 :(得分:1)

如果我对您的理解正确,那么这正是CMake属性EXCLUDE_FROM_ALL的作用。它可以用作目标属性(如果要仅排除该目标),也可以用作目录属性以排除子目录中的所有目标。要为您的目标设置此属性:

set_target_properties(tests PROPERTIES EXCLUDE_FROM_ALL True)

答案 1 :(得分:0)

除了Pedro的答案,CMake还允许我们在父项目中包含子目录时设置EXCLUDE_FROM_ALL:

add_subdirectory(my_lib my_lib-build EXCLUDE_FROM_ALL)

...重要的是不排除任何依赖性:

  

请注意,目标间的依存关系取代了此排除项。如果父项目构建的目标依赖于子目录中的目标,则被依赖者目标将包含在父项目构建系统中,以满足相关性。

add_subdirectory