【发布时间】:2017-01-14 03:32:47
【问题描述】:
在 CMake 中,我想将 add_custom_command(... POST_BUILD ...) 与可能会失败的 COMMAND 一起使用。
观察
- 第一次运行
make会失败,因为add_custom_command( ... COMMAND exit 1)的退出码不是0。 --> 这是我所期望的。 - 第二次运行
make会通过,因为指定的命令 在add_custom_command中将不会再次运行。 --> 这不是我想要的。我希望make在自定义命令起作用之前失败。
最小失败示例
project(Foo)
cmake_minimum_required(VERSION 3.2)
# Create main.cc
##include <iostream>
#
#int main() {
# std::cout << "Hello, World!" << std::endl;
#}
add_executable(main main.cc)
add_custom_command(TARGET main POST_BUILD
COMMAND exit 1 # In the real example, I am changing capabilities of the resulting binary with /sbin/setcap, which might fail.
COMMENT "Doing stuff."
)
问题
- 如何解决此问题?
- 这是 CMake 的预期行为吗?
一个解决方案
我知道我可以创建一个不是POST_BUILD 的自定义命令,而是在成功时输出一个文件TARGET.passed。但是,我想避免这种情况。因为 POST_BUILD 似乎是这里最合适的用法。 (我正在更改生成文件的功能。)
【问题讨论】:
-
嗯,in another question 观察到相反的行为:目标文件在命令失败时被删除。在任何情况下,您都可以在失败之前手动执行此操作:
COMMAND rm $<TARGET_FILE:main> && exit 1. -
@Tsyvarev,谢谢你的链接。我试图调查并运行您链接到的问题中的代码。我的发现:我的代码和另一个代码都具有相同的行为。但是我在Linux(Ubuntu 14.04,cmake 3.2.2)上写了这个问题,而我只是在macOS Sierra(cmake 3.7.1)下检查了这些代码。
-
我刚刚在 (docker) ubuntu:14.04 (cmake 2.8.12.2) 上测试:存在错误。 ubuntu:16.04 (cmake 3.5.1): 没有错误。 -- 我决定称它为错误,因为新版本具有可重现的行为,而旧版本不可重现。最后,我搜索了从 CMake 3.3 到 3.7 的发行说明,并没有发现提及此行为的变化。
标签: cmake cmake-custom-command