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

在我的makefile中,我想检查一个库的存在并给出一个信息错误信息。 我创build了一个条件,当文件没有find时应该退出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的目标),但是这不能正确执行。

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

首先,您正在查看以当前path命名的variables的内容,这可能不是您想要的。 一个简单的环境variables引用是$(name)或$ {name},而不是$($ {name})。 由于这个原因,第13行总是被评估。

其次,我认为这是$(错误…)expression式的缩进窒息。 当expression式parsing为一个空string时,该行的起始处仍然有一个制表符,表示一个命令,而该命令又不能存在于规则之外。

我认为使用空格而不是制表符缩进将工作。

当您收到错误消息时,请检查错误消息文档http://www.gnu.org/software/make/manual/make.html#Error-Messages在GNU Make 3.81上(错误似乎已从新版本中删除), 它说:

这意味着makefile中的第一件事似乎是命令脚本的一部分:它以TAB字符开头,看起来不是合法的make命令(如variables赋值)。 命令脚本必须始终与目标相关联。

更令人困惑的是“似乎不是一个合法的命令”部分。 这解释了为什么在:

  a := b $(error a) 

错误发生在第2行,而不是1:make只是接受它可以像分配一样parsing的语句,所以下面的工作:

  a := b a: echo $a 

注意:SO目前将制表符转换为代码中的空格,所以不能将上面的代码复制到编辑器中: https : //meta.stackexchange.com/questions/143632/tabs-converted-to-spaces

对我来说,这是造成这种情况的连接器之前的一个不必要的空白空间。 在slickEdit上,我select了查看所有特殊字符并注意到黑羊的选项。