【问题标题】:CMake: enable_testing in subdirectory with exclude_from_allCMake:在具有 exclude_from_all 的子目录中启用_测试
【发布时间】:2016-02-09 09:55:16
【问题描述】:

在我的顶级 CMakeLists.txt 中,我包含了一些外部库。如果我为我的项目启用测试并且外部库的 CMakeLists 也调用 enable_testing(),则这些测试将添加到我自己的项目测试中,然后由于未构建库的测试而无法运行。

我不希望构建测试,也不希望它们弄乱我自己的项目测试。我该怎么做?

在我的 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
[...]

【问题讨论】:

    标签: cmake


    【解决方案1】:

    当您使用add_subdirectory 时,some_ext_lib 不再是外部。您已将其嵌入到您的 cmake 构建中。如果这是您想要做的,那么最简单的方法可能是添加一个变量和条件逻辑来控制some_ext_lib 中测试的构建。例如,在add_subdirectory 命令之前使用set(BUILD_TESTS_some_ext_lib 0),然后将CMakeLists.txt 文件修改为some_ext_lib,其中测试位于if (BUILD_TESTS_some_ext_lib) 逻辑中。

    请注意,为简单起见,通常应避免将一个项目的顶级 CMakeLists.txt 嵌入到另一个项目中。也就是说,对于任何给定的 cmake 项目,应该只有一个 CMakeLists.txt 进行 find_package 调用并定义初始选项值。现在,任何概括都有有效的例外,但是当你刚刚开始时, 我认为你应该先掌握简单的方法。

    如果some_ext_lib 真的是external,那么你应该让它安装它的cmake 配置文件,其他项目将使用find_package(some_ext_lib) 命令。但这需要更复杂一点的 cmake。

    【讨论】:

      【解决方案2】:

      我今天遇到了这个问题,发现了一个(有点脏的)技巧来排除子项目测试。这是假设您的 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 源。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-09
        • 1970-01-01
        • 2018-06-28
        • 1970-01-01
        相关资源
        最近更新 更多