Lua Makefile中的错误处理

Lua Makefile中的错误处理,lua,makefile,Lua,Makefile,这个Makefile有什么问题 我想编译一些lua文件,以检查是否定义了任何意外的全局变量。我是通过将luac-l的输出变灰,然后忽略已知的全局变量来实现的 所以对于一个给定的lua文件,如果grep忽略了已知的lua全局变量,找不到任何东西,那么一切都是正常的 由于grep的返回状态代码为0,如果它确实找到了某个内容,则返回状态代码为0;如果没有,则返回状态代码为1。如果grep的状态代码为0,则我希望强制执行错误,如果没有,则允许一切继续 Makefile是这样的 IGNORE_GLOBAL

这个Makefile有什么问题

我想编译一些lua文件,以检查是否定义了任何意外的全局变量。我是通过将luac-l的输出变灰,然后忽略已知的全局变量来实现的

所以对于一个给定的lua文件,如果grep忽略了已知的lua全局变量,找不到任何东西,那么一切都是正常的

由于grep的返回状态代码为0,如果它确实找到了某个内容,则返回状态代码为0;如果没有,则返回状态代码为1。如果grep的状态代码为0,则我希望强制执行错误,如果没有,则允许一切继续

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 $@
有趣的是,如果我将$(error…)替换为echo…,如

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

正如@siffiejoe在评论中所说的那样,它的行为符合预期<代码>$(错误)是make函数,在对整个配方进行评估时运行(如果有帮助,可以将其视为提升)

因此,只要需要运行配方(并执行第一行),就会计算
$(错误)
调用

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

您想使用更像
@!卢阿…|grep-v$(忽略全局变量){echo'在$@'中出现意外全局变量;退出1;}
。这不会弹出“一切正常”的消息,而是删除了
X&&Y|Z
三元问题


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

error
是一个内置函数(在GNU Make中),因此在将命令行传递给shell之前,当调用目标
%时,将计算
$(error…
。@siffiejoe OK,那么,我应该用什么来代替$(error…)来强制Makefile停止呢?试试
…|grep-v$(忽略全局)和echo“意外全局”和退出1 | | echo“无意外全局”
@siffiejoe,感谢我在回答
X&&Y| | Z
中指出的工作不是shell中的三元表达式/语句。在这种情况下,它将起作用,因为只有管道可能会失败,但情况并非总是如此。我感谢你说的“喜欢”
!grep..
。如果按原样使用,我会得到
/bin/sh:1:语法错误:“!”意外的
,即使如此!在bash中是允许的。@MarkMelling抱歉,您不能否定管道的一部分。你需要否定整个管道。试试
@!卢阿…|grep-v |{echo…}
。谢谢,我认为那里需要一个空间,即
@!lua…
如果您更新了答案,我可以将其标记为正确,或者如果您愿意,我可以这样做(如果这是正确的协议!)。