【问题标题】:Continue after dependent target fails in custom CMake target在自定义 CMake 目标中依赖目标失败后继续
【发布时间】:2020-10-28 17:47:14
【问题描述】:

我有一个回归测试套件,其中包含多个使用add_custom_target() 创建的自定义目标。 此外,还有一个“方便”目标regressions 来运行所有回归。它仅包含所有单个回归目标作为依赖项。 这反映在以下 MCVE 中:

cmake_minimum_required(VERSION 3.17)

project (Regressions)

add_custom_target(reg_1 COMMAND ${CMAKE_COMMAND} -E echo 'First regression')
add_custom_target(reg_2 COMMAND ${CMAKE_COMMAND} -E echo 'Second regression')
# ...
add_custom_target(regressions DEPENDS reg_1 reg_2)

现在我可以从构建目录运行cmake --build . --target regressions,并且reg_1reg_2 作为regressions 的一部分运行。 我的问题是,如果其中一个回归失败,其余的都不会执行。但当然,我希望始终运行所有回归,并且只对失败的回归进行总结。我怎样才能实现这种行为,即始终执行所有子目标,无论其中一些是否失败?

我认为执行此操作的自然方法是使用add_test()(在所有回归运行都是测试之后),但我失败了,因为自定义目标不是可执行文件,并且 AFAIK 您不能将自定义 CMake 目标与add_test() 一起使用。

请随时推荐我当前方法的替代方法。如果我可以使用ctest 处理所有事情,那无论如何都是首选。

【问题讨论】:

  • 这看起来真的很像测试,你可以使用ctestcustom targets are no executables and AFAIK you cannot use custom CMake targets with add_test() ?就在那时add_test(COMMAND ${CMAKE_COMMAND} --target custom_target)。你似乎在问 XY 问题。您真正的问题似乎是如何在 add_test() 中使用自定义 cmake 目标。
  • 天哪!看来我今天太傻了。谢谢@KamilCuk,如果我可以通过调用 CMake 来运行目标,我当然可以运行适当的测试...

标签: testing cmake regression target ctest


【解决方案1】:

感谢@KamilCuk 的回答,我意识到无法将自定义目标添加为测试的问题并不是真正的问题。

我可以使用add_test() 调用CMake,cmake 命令可以运行自定义目标。

添加:

enable_testing()
add_test(NAME regression1 COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target reg_1)
add_test(NAME regression2 COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target reg_2)

上面的代码解决了这个问题。此外,如果 CMake 项目中存在其他测试,regression 可以简单地调用 ctest -R "regression*" 来调用所有(且仅)回归目标,而不是依赖于单个自定义目标,例如:

add_custom_target(regressions COMMAND ${CMAKE_CTEST_COMMAND} -R "regression*")

【讨论】:

    猜你喜欢
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    相关资源
    最近更新 更多