Makefile中的错误处理
2014-11-11 15:6:23
收藏:0
阅读:65
评论:1
这个 Makefile 有什么问题?
我想编译一些 lua 文件以检查是否有任何意外定义的全局变量。我通过 grep luac -l 的输出,然后忽略已知的全局变量来实现这一点。
因此,对于给定的 lua 文件,只要 grep 找不到任何东西并忽略了已知的 lua 全局变量,就说明一切都正常。
由于 grep 的返回状态码为 0(如果它找到了东西)和 1(如果没有),我想要在 grep 的状态码为 0 时强制引发错误,在它不是 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 $@"
它就按预期行事。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
正如 @siffiejoe 在评论中所说。
$(error)是 make 函数,并且在整个配方被评估时运行(如果这有助于理解,可以将其视为提升)。因此,一旦需要运行配方(并执行第一行),
$(error)调用将被评估。注意:在 shell 中,
X && Y || Z不是三元操作。如果X成功且Y失败,以及当X失败时,将运行Z。这在这里并不重要,因为echo实际上不能失败,但通常值得注意。你想用类似这样的东西
@! lua ... | grep -v $(IGNORE_GLOBALS) || { echo 'Unexpected globals in $@'; exit 1; }。这不会输出“一切正常”的消息,但会消除X && Y || Z三元问题。如果想要保留该消息,最简单的方法是转移到实际的
if语句。