【发布时间】: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
)
无论如何都会触发该命令。我不太确定这是否是我需要的选项,所以:
- 为什么这不起作用?
- 我怎样才能实现我的真正目的?
谢谢。
编辑: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