我读了这个问题,我很惊讶它没有工作:
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似乎表明这两个变量声明应该是相同的 - 我在这里缺少什么?
编辑:
我所指的手册中的一些引用:
define immediate deferred endef define immediate = deferred endef
以下是定义罐装配方的示例:
define run-yacc = yacc $(firstword $^) mv y.tab.c $@ endef
6.8 Defining Multi-Line Variables
...如果您愿意,可以省略变量赋值运算符。如果省略,make假定它为'='并创建递归扩展变量...
正如您所看到的,显式的预制食谱部分使用=
案例。我正在使用GNU Make 3.81。
答案 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。