2011-02-17 79 views
23

差异我看了这个问题,我很惊讶,它不工作:GNU使多变量声明

Why GNU Make canned recipe doesn't work?

所以我没有尝试过自己,得到了相同的结果。下面是一个例子生成文件:

define foo 
bar 
baz 
endef 

define bar = 
foo 
baz 
endef 

$(info foo: $(foo)) 
$(info bar: $(bar)) 

all: 

下面是从运行它的输出:

$ make 
foo: bar 
baz 
bar: 
make: Nothing to be done for `all'. 

这里发生了什么? GNU make manual似乎表明这两个变量声明应该是相同的 - 我在这里错过了什么?

编辑:

从手动,我指的是一些语录:

3.7 How make Reads a Makefile

define immediate 
    deferred 
endef 

define immediate = 
    deferred 
endef 

5.8 Defining Canned Recipes

^h ERE是定义一个罐装配方的例子:

define run-yacc = 
yacc $(firstword $^) 
mv y.tab.c [email protected] 
endef 

6.8 Defining Multi-Line Variables

...如果你愿意的话,可以省略变量赋值运算符。如果省略,使假定它是“=”,并创建一个递归扩展变量...

正如你所看到的,罐装配方部分明确使用=情况。我正在使用GNU Make 3.81。

+1

恰好碰到了这个确切同样的问题,容易` - 升级; apt-get install make`告诉我,v3.81是最新的,所以我变得越来越富裕起来,非常感谢...非常感谢! – 2011-08-12 11:08:43

回答

18

这可能是你的make版本。我测试使用make 3.81 Cygwin中我的机器上生成文件,并得到:

$ make 
foo: bar 
baz 
bar: 
make: Nothing to be done for `all'. 

我测试使用使3.82(原生Windows版本)相同的生成文件,并得到:

C:\>C:\make\make.exe 
foo: bar 
baz 
bar: foo 
baz 
make: Nothing to be done for `all'. 

相信网上make手册适用于v3.82。

+0

那么,这是一个简单的解决方案 - 感谢指出我的错误! – 2011-02-18 06:56:14

+0

接受这个答案,因为它在这里第一 - 抱歉蒂姆! – 2011-02-18 06:57:16

27

从更新日志中的3.82:

* read.c (do_define): Modify to allow assignment tokens (=, :=, etc.) 
after a define, to create variables with those flavors. 

好像使用“=”是不是在此之前,在支持定义声明