Makefile GNU使内置函数不工作
试图让GNU make 3.81内置功能正常工作 但不断收到错误信息 我构建了一个简单的makefile: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
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所做的在理论上是合法的,他无论如何都应该得到$(信息)
消息。