Makefile GNU使内置函数不工作

Makefile GNU使内置函数不工作,makefile,Makefile,试图让GNU make 3.81内置功能正常工作 但不断收到错误信息 我构建了一个简单的makefile: FOO=bar $(info $(FOO) $(origin FOO)) $(firstword $(origin FOO)) 然后运行它。 第一个函数起作用,但第二个函数不起作用 错误消息是: $make-d GNU Make 3.81 版权所有(C)2006免费软件基金会。 这是自由软件;有关复制条件,请参见源。 没有担保;甚至不是为了适销性或是否适合 特殊目的 这个程序是为i

试图让GNU make 3.81内置功能正常工作 但不断收到错误信息

我构建了一个简单的makefile:

FOO=bar

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

$(firstword $(origin FOO))
然后运行它。 第一个函数起作用,但第二个函数不起作用

错误消息是:

$make-d

GNU Make 3.81 版权所有(C)2006免费软件基金会。 这是自由软件;有关复制条件,请参见源。 没有担保;甚至不是为了适销性或是否适合 特殊目的

这个程序是为i686pclinuxgnu构建的

正在读取生成文件

正在读取makefile“makefile”

条状锉刀

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

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

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

target: [depends-on]...
        command to build
        another command
其中命令行以选项卡开头。您的错误是查找两条看起来像目标线的连续线

我从未见过你提到的那本书,但不是它错了,就是你读错了。试试这个:

FOO=bar

all:
        $(info $(FOO) $(origin FOO))
        echo '<' $(firstword $(origin FOO)) '>' 
FOO=bar
全部:
$(信息$(FOO)$(来源FOO))
回声“
最后一行需要回显,因为
firstword
是一个普通的替换函数,而
info
更像一个命令

我把尖括号放在
第一个单词
行,只是为了显示发生了什么


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

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

因此,当您调用它时,您正在使用它构建一个makefile。Makefiles有一种特殊的语法,就像任何其他编程语言一样。当您将文本放入makefile时,必须以特定的方式对其进行结构化—您必须生成语句、定义变量或其他内容

例如,“构建规则”就是这样的:

output: input
    rule to produce output from input

您将一个单词放入makefile中(这是
$(firstword)
的结果),因此make假设您正在执行某些操作—定义变量或指定生成规则。但是你没有用任何其他的词。基本上,make程序存在语法错误:(

上面的示例makefile直接出自John Graham Cumming的《GNU Make book》。它不需要一个目标,也不需要使用制表符,也不需要按照规则进行Make构建。我刚刚发现的一个示例很有效:
MY_LIST=用于定向编译的程序$(信息第一个单词是$(firstword$(MY_LIST)))
这部分解决了我的问题,即$(firstword…)函数确实有效。因此真正的问题是“为什么函数$(origin…)不输出兼容字符串?”在食谱之外使用make函数是完全合法的,与建议的答案相反。因为你没有任何目标,make应该抱怨
make:**没有目标。停止。
。但是它应该仍然打印
$(信息…)
message尽管如此……您能否尝试在末尾添加一个空目标,即只在末尾添加行
all:
?只是一个精确:您不必在菜谱中使用Makefile函数。@timoh所做的在理论上是合法的,他无论如何都应该得到
$(信息)
消息。