在我的makefile中,我想检查是否存在库并提供信息性错误消息.我创建了一个条件,当找不到文件时应该退出make进程:
9: ifeq ($(${JSONLIBPATH}),)
10: JSONLIBPATH = ${ALTJSONLIBDIR}/${LIBJSON}
11: endif
12: ifeq ($(${JSONLIBPATH}),)
13: $(error JSON library is not found. Please install libjson before building)
14: endif
Run Code Online (Sandbox Code Playgroud)
我的makefile卡在第13行:
Makefile:13: *** commands commence before first target. Stop.
Run Code Online (Sandbox Code Playgroud)
在第13行之后,我的makefile有了它的目标.
我尝试将此条件块放入目标(例如,被调用的目标isJSONLibraryInstalled),但这不能正确执行.
在处理目标之前,我如何检查文件是否存在并处理错误情况?如果这是一个愚蠢的问题,请道歉.
Sim*_*ter 75
首先,您正在查看以当前路径命名的变量的内容,这可能不是您想要的.一个简单的环境变量引用是$(name)或${name}不是$(${name}).因此,始终评估第13行.
其次,我认为$(error ...)表达式的缩进令人窒息.当表达式解析为空字符串时,行的开头仍然有一个制表符,表示一个命令,而该命令又不能存在于规则之外.
我认为使用空格而不是制表符来缩进会起作用.
当您收到Make错误消息时,请始终查看错误消息文档
在GNU Make 3.81上(error似乎已从较新版本中删除),它说:
这意味着makefile中的第一件事似乎是命令脚本的一部分:它以TAB字符开头,并且似乎不是合法的make命令(例如变量赋值).命令脚本必须始终与目标关联.
让事情更加混乱的是"似乎不是法律制定命令"的一部分.这解释了为什么:
a := b
$(error a)
Run Code Online (Sandbox Code Playgroud)
错误发生在第2行而不是1:make只接受它可以解析的语句,如赋值,因此以下工作:
a := b
a:
echo $a
Run Code Online (Sandbox Code Playgroud)
注意:SO目前将标签转换为代码中的空格,因此您不能将上述代码复制到编辑器中.