GNU在多行变量声明中有所区别

时间:2011-02-17 18:47:46

标签: variables makefile

我读了这个问题,我很惊讶它没有工作:

Why GNU Make canned recipe doesn't work?

所以我自己尝试了,并得到了相同的结果。这是makefile的一个例子:

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

     

以下是定义罐装配方的示例:

 define run-yacc =
 yacc $(firstword $^)
 mv y.tab.c $@
 endef
     

6.8 Defining Multi-Line Variables

     

...如果您愿意,可以省略变量赋值运算符。如果省略,make假定它为'='并创建递归扩展变量...

正如您所看到的,显式的预制食谱部分使用=案例。我正在使用GNU Make 3.81。

2 个答案:

答案 0 :(得分:29)

来自3.82的CHANGELOG:

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

似乎在 define 语句之前不支持使用'='

答案 1 :(得分:18)

这可能是您的make版本。我在Cygwin中使用make 3.81测试了我的机器上的makefile并得到了:

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

我使用make 3.82(本机Windows版本)测试了相同的makefile并得到了:

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

我相信在线make手册适用于v3.82。