这个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 $@"
它的行为符合预期。
答案 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
语句。