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.
我编写了一个使用 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.