GNU make产生“命令在第一个目标之前开始”错误

时间:2011-01-17 13:29:18

标签: makefile gnu

在我的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 

我的makefile卡在第13行:

Makefile:13: *** commands commence before first target.  Stop.

在第13行之后,我的makefile有了目标。

我尝试将此条件块放入目标(例如名为isJSONLibraryInstalled的目标),但这不能正确执行。

在处理目标之前,我如何检查文件是否存在并处理错误情况?如果这是一个愚蠢的问题,请道歉。

2 个答案:

答案 0 :(得分:72)

首先,您正在查看以当前路径命名的变量的内容,这可能不是您想要的。一个简单的环境变量引用是$(name)${name},而不是$(${name})。因此,始终评估第13行。

其次,我认为$(error ...)表达式的缩进令人窒息。当表达式解析为空字符串时,行的开头仍然有一个制表符,表示一个命令,而该命令又不能存在于规则之外。

我认为使用空格而不是制表符来缩进是可行的。

答案 1 :(得分:1)

对我而言,在导致此问题的连接器之前是一个不必要的空白区域。 在slickEdit上,我选择了查看所有特殊字符的选项并注意到了黑羊。