【问题标题】:Force serial execution for specific targets in CMake强制串行执行 CMake 中的特定目标
【发布时间】:2015-07-11 01:33:32
【问题描述】:

在我的 CMake 项目中,我有几个目标,它们只是运行一组特定的单元测试(例如,runTestsForArunTestsForBrunTestsForC)。 我还有一个目标,tests,它依赖于所有这些单元测试目标,所以我可以用一个命令来运行它们。

我正在使用 CLion 是我的 IDE,它默认尝试使用并行 make 构建(我想要并且也在持续集成服务器上这样做)。 但是,现在测试似乎也在并行运行,并且没有为此进行一些测试(它们使用本地环回对套接字进行一些魔术),这导致它们有时会失败。

这就是为什么我想为我的tests 目标的部分/全部依赖项强制串行执行。 不幸的是,当我搜索有关如何执行此操作的信息时,CMake 文档对我没有帮助。 这让我想到了我的问题:这有可能吗?如果可以,怎么办?

【问题讨论】:

    标签: cmake makefile build-automation clion


    【解决方案1】:

    您可以使用 CTest 工具代替手动 tests 目标声明。使用add_test 命令创建测试目标,然后CMake 会自动创建tests 目标来运行所有测试:

    enable_testing()
    add_test(NAME TestsForA COMMAND <command>)
    add_test(NAME TestsForB COMMAND <command>)
    set_tests_properties(TestsForA TestsForB  PROPERTIES RUN_SERIAL TRUE)
    

    之后,您可以在构建树中运行 make testsctest -j8 .。测试将被序列化。

    更多信息请访问:

    【讨论】:

    • 如果你还没有使用 add_test 来定义你的测试套件,如果你正在使用 add_custom_target(runTestsForA) ... 使用 add_dependencies(runTestsForA runTestsForB)
    • @MuraliPaluru 如果我不知道已经定义了哪些测试目标,那将很难做。
    • @jet47 这可能适合我的用例,但如果它不是测试而是一些其他工具怎么办。那么正确的方法是什么?
    • 您仍然可以使用add_test,如果此工具可以用作构建后操作(例如通过 cppcheck 进行静态分析)。否则,您似乎必须将@MuraliPaluru 建议与add_dependencies 一起使用。
    • 我们最终没有使用这个。我们正在努力调整我们的测试,以便它们可以并行运行。然而,在一个测试项目中,这个答案确实导致了想要的行为。 :)
    【解决方案2】:

    也许它不是控制测试执行的最佳解决方案,但是,通常我相信您可以使用 CMake JOB_POOLS 功能来限制项目中某些 CMake 目标的并行量。

    首先声明命名池和每个池支持的并行作业数:

    set_property(GLOBAL PROPERTY JOB_POOLS two_jobs=2 ten_jobs=10)
    

    然后您可以将目标分配给这些池:

    set_property(TARGET myexe PROPERTY JOB_POOL_COMPILE ten_jobs)
    

    【讨论】:

      猜你喜欢
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      相关资源
      最近更新 更多