【问题标题】:Error handling (if else kind of case) in MakefileMakefile 中的错误处理(如果是其他情况)
【发布时间】:2020-07-21 10:57:38
【问题描述】:

我处于一种我想做的事情是目标返回错误的情况。我的代码是:

pre-submit:
    cp test.csv test.csv.bk
    make test.csv
    make lint
    rm test.csv.bk

这运行得很好。但在某些情况下,make lintmake test.csv 会出现错误,在这种情况下,我想删除 test.csv(如果有)并将 test.csv.bk 重命名为 test.csv

我找不到我们是否可以捕获 target

引发的错误

编辑:lint 看起来像这样:

.PHONY: lint
lint: | env
    ./env/bin/python lint.py

【问题讨论】:

  • shell 脚本可以很容易地检查每个 make 退出状态和有条件的 rm/mv 文件;用运行该脚本替换一些/所有配方行
  • 你永远不应该使用原始的make 来运行子制作。始终使用$(MAKE)(或${MAKE},如果您愿意,它们是相同的)。
  • make lint 是什么样的?有一种强烈的感觉,这是一个更好的解决方案,正在努力摆脱...... :-)
  • 它调用一个python文件进行csv文件验证。

标签: shell makefile gnu-make


【解决方案1】:

做你想做的事情的一种方法是使用外壳:

pre-submit:
    cp test.csv test.csv.bk
    (make test.csv && make lint) || mv test.csv.bk test.csv

但你也可以使用 Make 本身:

pre-submit: test.csv.new lint
    mv test.csv test.csv.bk
    mv test.csv.new test.csv

【讨论】:

  • 关于第一个示例pre-submit 的一点是:您丢失了失败代码,所以这可能是不正确的。即使子make失败,这个makefile也会报告成功。
  • 而且,你应该在这里使用mv -f :)
  • @MadScientist:在这种情况下报告失败不是要求的一部分,但如果需要,很容易添加 (mv ... && false)。同样,我知道$(MAKE)make 更好,但我喜欢在主要设计选择仍悬而未决的情况下保持示例简单。 (而且我不会因为mv 而卷入一场争吵,而不是在这样美好的一天。)
  • 好吧,如果 make 失败,原始行为肯定会失败,因此实施与原始问题具有特征奇偶性的解决方案似乎应该考虑错误处理。 YMMV。
  • @MadScientist:你失去了我。如果test.csvlint 这样做,pre-submit 应该返回错误代码当然有充分的理由,但考虑到练习的重点是设计行为与 OP 代码不同的代码,忠实再现 OP 的代码代码的行为不是其中之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
相关资源
最近更新 更多