【问题标题】:GNU make builtin functions not workingGNU 使内置函数不起作用
【发布时间】:2016-06-11 06:33:38
【问题描述】:

试图让 GNU make 3.81 内置函数工作 但不断收到错误消息。

我构建了一个简单的makefile:

FOO=bar

$(info $(FOO) $(origin FOO))

$(firstword $(origin FOO))

然后运行它。 第一个功能有效,但第二个无效。

错误信息是:

...

$ make -d

GNU Make 3.81 版权所有 (C) 2006 Free Software Foundation, Inc. 这是免费软件;查看复制条件的来源。 没有保修;甚至不适合适销性或适合性 特殊目的。

这个程序是为 i686-pc-linux-gnu 构建的

正在读取 makefile...

正在读取 makefile `makefile'...

条形文件

makefile:6: *** 缺少分隔符。停下来。

...

前两个功能正常工作,为什么会发生这种情况?我没有看到明显的东西,还是这个版本的 make 不支持这个 $(firstword) 函数? 感谢您的帮助。

【问题讨论】:

  • 上面的 makefile 示例直接来自 John Graham-Cumming 的“GNU Make Book”一书。它不需要目标或使用选项卡或在规则中让 Make 构建它。我刚刚发现的一个示例有效:MY_LIST = a program for directed compilation $(info The first word is $(firstword $(MY_LIST))) 这解决了我的部分问题,即 $(firstword ...) 函数确实有效。所以真正的问题是“为什么函数 $(origin ..) 没有输出兼容的字符串?”
  • 在食谱之外使用 make 函数是完全合法的,与建议的答案相反。由于您没有任何目标,因此 make 应该投诉为 make: *** No targets. Stop.。但是,它仍然应该打印 $(info ...) 消息....您可以尝试在末尾添加一个空目标,即在末尾添加行 all: 吗?

标签: makefile


【解决方案1】:

在大多数情况下,make 文件看起来像以下一个或多个块:

target: [depends-on]...
        command to build
        another command

命令行以制表符开头。您的错误是抱怨找到 2 条看起来像目标行的连续行。

我从来没有看过你说的那本书,但要么是错的,要么是你读错了。试试这个:

FOO=bar

all:
        $(info $(FOO) $(origin FOO))
        echo '<' $(firstword $(origin FOO)) '>' 

最后一行需要回显,因为firstword 是一个普通的替换函数,而info 更像是一个命令。

我将尖括号放在firstword 行上只是为了显示发生了什么。

再次注意,Makefile 上的缩进行使用制表符而不是空格。

【讨论】:

  • 只是一个精度:您不必在配方中使用 Makefile 函数。 @timoh 所做的在理论上是合法的,无论如何他都应该得到$(info) 消息。
【解决方案2】:

firstword 函数是一个文本操作函数。它将文本作为输入,并返回文本作为输出。它不会写入任何消息或错误输出。

因此,当您调用它时,您是在使用它来构建一个 makefile。 Makefile 具有特殊的语法,就像任何其他编程语言一样。当您将文本放入 makefile 时,它​​必须以特定方式构造 - 您必须做出声明,或定义变量或其他东西。

例如,“构建规则”如下所示:

output: input
    rule to produce output from input

您在 makefile 中输入了一个词($(firstword) 的结果),因此 make 假设您正在做某事 - 定义变量或指定构建规则。但是你没有跟上任何其他的词。基本上,您的 make 程序有语法错误。 :(

【讨论】:

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