【问题标题】:CMake: prevent building test executable target in subdirectory library projectCMake:防止在子目录库项目中构建测试可执行目标
【发布时间】:2019-11-17 17:36:28
【问题描述】:

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

【问题讨论】:

  • 为了防止构建测试,请让您的构建系统只构建库目标。拥有多个目标的关键在于您可以独立构建它们。您不必总是构建“all”或“install”。
  • 谢谢,我会在问题中添加信息,看看是否可以扩展。

标签: c++ testing cmake subdirectory doctest


【解决方案1】:

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

set_target_properties(tests PROPERTIES EXCLUDE_FROM_ALL True)

【讨论】:

    【解决方案2】:

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

    add_subdirectory(my_lib my_lib-build EXCLUDE_FROM_ALL)
    

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

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

    add_subdirectory

    【讨论】:

      猜你喜欢
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多