62

在多年不使用 make 之后,我发现自己再次需要它,现在是 gnu 版本。我很确定我应该能够做我想做的事,但还没有弄清楚如何做,或者在谷歌等处找到答案。

我正在尝试创建一个测试目标,它将多次执行我的程序,并将结果保存在日志文件中。一些测试应该会导致我的程序中止。不幸的是,我的 makefile 在第一次测试中中止,导致错误。我有类似的东西:

# Makefile
# 
test:
        myProg -h > test.log              # Display help
        myProg good_input >> test.log     # should run fine
        myProg bad_input1 >> test.log      # Error 1
        myProg bad_input2 >> test.log      # Error 2

使用上述方法,在 bad_input1 运行后退出,永远不会进入 bad_input2 运行。

4

3 回答 3

118

在命令前加上a -,例如:

-myProg bad_input >> test.log

然后 GNU make 将忽略进程退出代码。

于 2010-02-02T22:53:15.060 回答
30

尝试运行它

make -i

或者

make --ignore-errors

忽略所有规则中的所有错误。

我还建议将其运行为

make -i 2>&1 | tee results

这样你就得到了所有的错误和输出,看看发生了什么。

在出现错误后盲目地继续可能不是您真正想要做的。就其本质而言,make 实用程序通常依赖于先前命令的成功完成,以便它可以使用这些命令的人工制品作为稍后执行命令的先决条件。

顺便说一句,我强烈建议您购买一本关于 make 的 O'Reilly 书。第一版很好地概述了 make 的基本性质,特别是它的反向链接行为。后来的版本仍然很好,但第一版。仍然对实际发生的事情有最清晰的解释。事实上,我自己的副本是我传递给来问我“WTF?问题”的人的第一件事!(-:

于 2010-02-02T23:09:16.847 回答
17

如果您想要求目标失败,正确的解决方案是否定其退出代码。

# Makefile
# 
test:
    myProg -h > test.log              # Display help
    myProg good_input >> test.log     # should run fine
    ! myProg bad_input1 >> test.log      # Error 1
    ! myProg bad_input2 >> test.log      # Error 2

现在,在这两种情况下成功是错误的。

于 2014-02-21T13:24:28.590 回答