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

Ale*_*lds 49 gnu makefile

在我的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 ...)表达式的缩进令人窒息.当表达式解析为空字符串时,行的开头仍然有一个制表符,表示一个命令,而该命令又不能存在于规则之外.

我认为使用空格而不是制表符来缩进会起作用.

  • 更富有:我长期坚持使用制表符而不是空格,并在第一个目标错误之前开始`***命令.你救了这一天.非常感谢... :) (14认同)
  • 伟大的观察..在禁地的标签:) (4认同)

Cir*_*四事件 6

当您收到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目前将标签转换为代码中的空格,因此您不能将上述代码复制到编辑器中.