2016-02-28 44 views
1

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

我建了一个简单的makefile:

FOO=bar 

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

$(firstword $(origin FOO)) 

并运行它。 第一个函数可以工作,但第二个函数不会。

错误消息:

...

$使-d

GNU使3.81 版权所有(C)2006自由软件基金会,公司 这是自由软件;请参阅复制条件的来源。 没有保修;甚至不适用于适销性或特定用途的适用性。

这项计划针对i686-PC-Linux的GNU

阅读的makefile建...

阅读的makefile的`Makefile” ......

栏文件

的Makefile:6: ***缺少分隔符。停止。

...

前两个函数正常工作,那么,为什么会出现这种情况?我没有看到明显的东西,或者这个版本的make不支持$(firstword)函数吗? 感谢您的帮助。

+0

以上示例makefile是John Graham-Cumming出版的“GNU Make Book”一书的直接书籍,它不需要目标或使用制表符或在规则中进行Make构建。我只是找到了一些工作:'MY_LIST =一个定向编译的程序$(info第一个单词是$(firstword $(MY_LIST)))'这解决了我的问题,即$(firstword ...)函数确实有效。所以真正的问题是“为什么函数$(origin ..)不输出一个兼容的字符串?” – timoh

回答

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行上放了尖括号来显示在哪里发生了什么。

同样,请注意,Makefiles上的缩进行使用选项卡不是空格。

0

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

因此,当您调用它时,您正在使用它来构建makefile。 Makefiles具有特殊的语法,就像任何其他编程语言一样。将文本放入makefile中时,必须以特定的方式进行构建 - 您必须创建语句或定义变量或其他内容。

例如,这是一个“生成规则”的样子:

output: input 
    rule to produce output from input 

你把一个单词到生成文件(的$(firstword)的结果),所以请假设你正在做的事情 - 定义变量或指定构建规则。但你没有跟进任何其他的话。基本上,你的make程序有一个语法错误。 :(