【问题标题】:GNU make yields "commands commence before first target" errorGNU make 产生“命令在第一个目标之前开始”错误
【发布时间】:2011-06-10 11:08:09
【问题描述】:

在我的 makefile 中,我想检查一个库是否存在并给出一个信息性错误消息。我创建了一个条件,当找不到文件时应该退出制作过程:

 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 的目标),但这不能正确执行。

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

【问题讨论】:

    标签: makefile gnu


    【解决方案1】:

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

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

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

    【讨论】:

    • 更丰富:我一直坚持使用制表符而不是空格并得到*** commands commence before first target 错误。你拯救了这一天。非常感谢... :)
    • 很棒的观察 .. 禁区的标签 :)
    【解决方案2】:

    当您收到 Make 错误消息时,请始终检查 Error message documentation

    在 GNU Make 3.81 上(error 似乎已从较新版本中删除),它说:

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

    让事情更令人困惑的是“似乎不是合法的 make 命令”部分。这就解释了为什么在:

        a := b
        $(error a)
    

    错误发生在第 2 行而不是第 1 行:make 只接受它可以解析的语句,例如赋值,所以以下工作:

        a := b
    a:
        echo $a
    

    注意:SO currently converts tabs to spaces in code,所以你不能把上面的代码复制到你的编辑器中。

    【讨论】:

    • error 函数仍然适用于 GNU Make 4.2.1
    【解决方案3】:

    对我来说,导致此问题的连接器之前是不必要的空白。 在 slickEdit 上,我选择了查看所有特殊字符的选项并注意到了害群之马。

    【讨论】:

    • 关闭,$(error ... 替换之前不必要的制表符导致错误。删除它或用空格替换它会使错误消失。
    【解决方案4】:

    您可以使用VSCode检查空白空格制表符 [查看> 渲染空白]

    如你所见;

    • command-1 有一个 tab (->) 和 whitespace 在末尾​​li>
    • command-2 一开始有空格
    • command-3/4tab+空格

    因此,您应该删除末尾的 空格,并使用相同的操作应用相同的空格。例如:标签如下;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      相关资源
      最近更新 更多