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

CMake: prevent building test executable target in subdirectory library project

我编写了一个使用 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 目标中排除子目录中的测试吗?

如果我没理解错的话,这正是 CMake 属性 EXCLUDE_FROM_ALL 所做的。它可以用作目标 属性(如果您只想排除该目标),或用作目录 属性 以排除子目录中的所有目标。要为您的目标设置 属性:

set_target_properties(tests PROPERTIES EXCLUDE_FROM_ALL True)

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

add_subdirectory(my_lib my_lib-build EXCLUDE_FROM_ALL)

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

Note that inter-target dependencies supersede this exclusion. If a target built by the parent project depends on a target in the subdirectory, the dependee target will be included in the parent project build system to satisfy the dependency.

add_subdirectory