2010-02-02 125 views
62

经过多年的不使用make,我发现自己需要它,现在的GNU版本。我很确定我应该能够做我想做的事,但还没有想出如何或找到与谷歌等答案如何让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运行。

+0

制作。可能会遇到很多问题,包括:in | a | piped | sequence',最后一个决定退出代码;'a; more; involved; recipe; line;'患有同样的问题;没有跳过很​​多障碍,用不同的参数重复地运行同样的事情可能会对脚本造成麻烦,我通常选择对脚本进行脚本编写,如果需要,可以使用脚本kefile。 – 2015-10-02 20:28:40

+0

作为替代['set -e'](http://stackoverflow.com/questions/3474526/stop-on-first-error)在bash中可以使错误输出在命令失败时类似于使配方行。 – 2015-10-02 20:32:00

回答

16

,如果你想要求目标失败的正确的解决办法是否定其退出代码

# 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 

现在,它是在这两个案件成功错误

+1

我会晚点指出,如果你的shell不是Bash,''''关键字可能不可用。 – tripleee 2017-08-01 08:08:29

120

命令之前,例如:

-myProg bad_input >> test.log 

GNU做出那么将忽略进程退出代码放在一个-

+1

是的,但是这意味着使用'make test'在脚本中运行,如果失败,意味着测试不通过! – 2013-08-24 21:02:43

+6

虽然这并不回答实际问题,但它通过阅读标题来回答问题的出现,这就是为什么它有这么多的赞扬。 – LukeGT 2014-10-23 08:49:13

+1

@LukeGT:部分原因是这个选票比tripleee的答案多得多,因为这是在四年之前选择的答案提供了更好的答案。 – GreenMatt 2015-02-03 14:02:01

30

尝试运行它作为

make -i 

make --ignore-errors 

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

我也建议运行它作为

make -i 2>&1 | tee results 

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

仅仅在错误发生后盲目地继续工作可能不是你真正想做的事情。 make实用程序本质上通常依靠先前命令的成功完成,以便它可以使用这些命令的人为因素作为稍后要执行的命令的先决条件。

BTW我倒是高度建议得到的the O'Reilly book on make副本。第一版对制作的基本性质,特别是其后向链接行为有很好的概述。后来的版本仍然不错,但是第一版。仍然对实际发生的事情有最清晰的解释。事实上,我自己的副本是我向传给我的人询问有关make的“WTF?问题”的第一件事! ( - :

+1

这工作得很好。感谢您的回应。 – GreenMatt 2010-02-03 14:18:17