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

Car*_*rum 26 variables makefile

我读了这个问题,我很惊讶它不起作用:

为什么GNU Make罐头食谱不起作用?

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

define foo
bar
baz
endef

define bar = 
foo
baz
endef

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

all:
Run Code Online (Sandbox Code Playgroud)

这是运行它的输出:

$ make
foo: bar
baz
bar: 
make: Nothing to be done for `all'.
Run Code Online (Sandbox Code Playgroud)

这里发生了什么事?在GNU进行手动似乎表明,这两个变量的声明应该是一样的-我错过什么吗?

编辑:

我所指的手册中的一些引用:

3.7如何读取Makefile

define immediate
  deferred
endef

define immediate =
  deferred
endef
Run Code Online (Sandbox Code Playgroud)

5.8定义罐装食谱

以下是定义罐装食谱的示例:

 define run-yacc =
 yacc $(firstword $^)
 mv y.tab.c $@
 endef
Run Code Online (Sandbox Code Playgroud)

6.8定义多行变量

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

如您所见,罐装食谱部分明确使用了该=案例.我正在使用GNU Make 3.81.

Tim*_*imm 30

来自3.82的CHANGELOG:

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

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


bta*_*bta 18

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

$ make
foo: bar
baz
bar: 
make: Nothing to be done for `all'.
Run Code Online (Sandbox Code Playgroud)

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

C:\>C:\make\make.exe
foo: bar
baz
bar: foo
baz
make: Nothing to be done for `all'.
Run Code Online (Sandbox Code Playgroud)

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