【问题标题】:How to have GNU make explicitly test for failure?如何让 GNU make 明确地测试失败?
【发布时间】:2011-01-12 09:38:45
【问题描述】:

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

我正在尝试创建一个测试目标,它将多次执行我的程序,并将结果保存在日志文件中。一些测试应该会导致我的程序中止。不幸的是,我的 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 运行。

【问题讨论】:

  • Make 不太适合这个。您可能会遇到许多问题,包括:in | a | piped | sequence,最后一个确定退出代码; a; more; involved; recipe; line; 也有同样的问题;如果没有跳过很​​多障碍,使用不同的参数重复运行相同的东西可能会让脚本很烦。我通常选择为我的测试编写脚本,然后在必要时从 makefile 中使用它。
  • 作为替代set -e in bash 可以在命令失败时出错,类似于 make recipe 行。

标签: makefile gnu-make


【解决方案1】:

在命令前加上-,例如:

-myProg bad_input >> test.log

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

【讨论】:

  • 是的,但这违背了在脚本中运行make test 的用法,如果它失败,则意味着测试没有通过!!!
  • 尽管这并不能回答实际问题,但它只是通过阅读标题来回答问题,这就是为什么它有如此多的赞成票。
  • @LukeGT:这比 Tripleee 的答案拥有更多投票的部分原因是,在 Tripleee 提供更好的答案之前,它是 4 年的选定答案。
【解决方案2】:

尝试运行它

make -i

make --ignore-errors

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

我还建议将其运行为

make -i 2>&1 | tee results

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

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

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

【讨论】:

    【解决方案3】:

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

    # 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
    

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

    【讨论】:

    • 我迟早会指出,如果你的 shell 不是 Bash,! 关键字可能不可用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2011-12-20
    • 2012-01-12
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多