如何让GNU明确测试失败?

Gre*_*att 62 makefile gnu-make

经过多年没有使用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
Run Code Online (Sandbox Code Playgroud)

使用上面的命令,在bad_input1运行后退出,永远不会运行bad_input2.

小智 119

-在命令之前加上一个,例如:

-myProg bad_input >> test.log
Run Code Online (Sandbox Code Playgroud)

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

  • 即使这不能回答实际的问题,它只是通过阅读标题来回答问题,这就是为什么它有这么多的赞成. (6认同)

Rob*_*lls 30

尝试运行它

make -i
Run Code Online (Sandbox Code Playgroud)

要么

make --ignore-errors
Run Code Online (Sandbox Code Playgroud)

它会忽略所有规则中的所有错误.

我也建议将其作为

make -i 2>&1 | tee results
Run Code Online (Sandbox Code Playgroud)

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

只是盲目地继续发生错误可能不是你真正想做的事情.make实用程序本质上通常依赖于先前命令的成功完成,以便它可以使用这些命令的假象作为稍后执行的命令的先决条件.

顺便说一下,我强烈建议您获取O'Reilly的一本关于make的书.第一版对制作的基本性质有一个很好的概述,特别是它的反向链接行为.后来的版本仍然很好,但第一版.仍然有最清楚的解释实际发生了什么.事实上,我自己的副本是我第一个传递给那些来找我询问有关制作的"WTF?问题"的人!( - :


tri*_*eee 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
Run Code Online (Sandbox Code Playgroud)

现在,在这两种情况下取​​得成功是错误的.

  • 我稍后会指出,如果您的 shell 不是 Bash,则“!”关键字可能不可用。 (2认同)