Makefile中的错误处理

时间:2014-11-11 15:06:23

标签: lua makefile

这个Makefile有什么问题?

我想编译一些lua文件来检查是否有任何意外的全局变量定义。我通过grepping luac -l的输出然后忽略已知的全局变量来做到这一点。

因此,对于给定的lua文件,如果grep没有找到任何内容,忽略已知的lua全局变量,一切都会好的。

因为grep的返回状态代码是0,如果它确实发现了什么,如果它不是我想强制错误,如果来自grep的状态代码是0并且允许一切继续,如果它ISN'吨

Makefile就像这样

IGNORE_GLOBALS = "dofile\|string\|tostring\|tonumber\|math\|io\|type\|os\|table\|pairs\|next\|require"

all: $(patsubst src/common/%.lua, %.lua, $(wildcard src/common/*.lua))

%.lua: 
    @echo check $@
    @luac -l src/common/$@  | grep '.ETGLOBAL' | grep -v $(IGNORE_GLOBALS) && $(error Unexpected globals in $@) || echo "No unexpected globals in $@"

但是当我运行它时会立即退出第一个文件,而这个文件碰巧没有意外的全局变量

Makefile:10: *** Unexpected globals in chat-cmd.lua. Stop.
第10行令人惊讶地是之前的那一行,即

@echo check $@

有趣的是,如果我用echo替换$(error ...),就像在

中一样
@luac -l src/common/$@  | grep '.ETGLOBAL' | grep -v $(IGNORE_GLOBALS) && echo "Unexpected globals in $@" || echo "No unexpected globals in $@"

它的行为符合预期。

1 个答案:

答案 0 :(得分:1)

@siffiejoe在评论中说。 $(error)是make函数,并且在评估整个食谱时运行(如果有帮助的话,你可以把它想象为吊装)。

因此,只要需要运行配方(并执行第一行),就会评估$(error)调用。

注意:在shell X && Y || Z中,不是三元操作。如果Z成功且X失败以及Y失败,{}会运行X。这并不重要,因为echo不能真正失败,但总的来说值得关注。

你想在那里使用更像@! lua ... | grep -v $(IGNORE_GLOBALS) || { echo 'Unexpected globals in $@'; exit 1; }的东西。这并没有吐出一切都好的"消息但删除了X && Y || Z三元问题。

如果您想保留该消息,最简单的方法是转到实际的if语句。