【问题标题】:CMake add_custom_command ('POST_BUILD') 'DEPENDS' option is ignoredCMake add_custom_command ('POST_BUILD') 'DEPENDS' 选项被忽略
【发布时间】:2018-06-18 16:00:00
【问题描述】:

我在 CMake 上有一个 library 和一个 test 项目,并且我正在将此目录结构与两个(项目)CMakeLists.txt 一起使用:

/
|- CMakeLists.txt
|- include/libName
|- src/...
|
|- test/
       |- CMakeLists.txt
       |- src/...

外部项目列表定义库,如:

add_library(libName ${SRC} ${INCLUDE})

并添加'test'作为子目录:

add_subdirectory(test)

测试项目列表定义了可执行文件和一个测试,例如:

add_executable(NameTest ${SRC})
target_link_libraries(NameTest libName)
add_test(NAME NameTest COMMAND NameTest)

问题

我正在尝试在构建库时构建和执行测试程序。如果任何测试失败,我希望库的构建也失败。

这就是我所拥有的(在外部列表文件中):

add_custom_command(
    TARGET libName
    POST_BUILD
    COMMAND CTEST_OUTPUT_ON_FAILURE=1 ctest
    DEPENDS NameTest # <- This is driving me crazy!
)

如果构建了目标“NameTest”,如果存在具有该名称的文件,或者没有,此命令将完全忽略。如果删除整个“依赖”选项,我不会注意到任何区别。

我什至修改如下:

add_custom_command(
    TARGET libName
    POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E echo "Bip! Bip! Bip!"
    DEPENDS this_is_not_an_existent_file_nor_target
)

无论如何都会触发该命令。我不太确定这是否是我需要的选项,所以:

  1. 为什么这不起作用?
  2. 我怎样才能实现我的真正目的?

谢谢。


编辑:ctest 将执行每个测试(add_test),但 NameTest 可执行文件(尚未列出)必须在调用它之前构建!现在将在库之后构建,但在“POST_BUILD”自定义命令之前构建。当然失败了。

我希望 CMake 意识到 NameTest 是运行该自定义命令所必需的。


编辑:我觉得 Angew 的回答很有用,所以我接受了他的回答并稍微改进了一下:

add_custom_command(
    TARGET libName
    POST_BUILD
    COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target NameTest --config $<CONFIG>
    COMMAND ${CMAKE_CTEST_COMMAND} -C $<CONFIG> --output-on-failure
)

谢谢!

【问题讨论】:

  • 我为问题 #1 写了一个答案,但对于问题 #2,我实际上需要更多地了解您的真正目的是什么。你想用依赖实现什么?
  • @Angew 如您所见, add_custom_command 进行了“make test”(哎呀!我应该改为调用 cmake。无论如何)。由于 NameTest 在“add_test”中用作命令,因此必须构建才能执行。否则,'ctest' 将找不到 NameTest 可执行文件,并且会失败。
  • 我已经编辑了答案,希望能解决这个问题。

标签: cmake


【解决方案1】:

1。为什么这不起作用?

因为您正在混合来自 add_custom_command 的两个不同签名的选项。 DEPENDS 来自用于生成文件的表单。 TARGETPOST_BUILD 来自将构建前/构建后命令添加到现有目标的表单。

有关这两种用途的更多详细信息,请参阅documentation of add_custom_command

2。我怎样才能实现我的真正目的?

我相信以下应该做你想做的事:

add_custom_command(
    TARGET libName
    POST_BUILD
    COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target NameTest --config $<CONFIG>
    COMMAND CTEST_OUTPUT_ON_FAILURE=1 ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target test --config $<CONFIG>
)

【讨论】:

  • 你是对的!我有该页面(来自以前版本的 CMake)并排打开,但我在第二个签名中多次错误地阅读了“DEPENDS”(我不敢相信!)。那么,如何实现我想要的呢?这个命令似乎不适合。
  • 但这绕过了整个 CMake 执行,使用测试重建库。
  • @NiNEngine 这很奇怪。我本来希望构建系统到那时已经更新了库的二进制文件。但这可能会复发,现在我想起来了。
  • 是的,我正在考虑,也许我忽略了一些东西。对我之前的评论持保留态度:我稍后会仔细审查。
猜你喜欢
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多