为什么 GNU Make 罐头食谱不起作用?
我期望看到由下面的 makefile 创建的文件 foo1 和 foo3。但是,仅创建了一个文件 foo3。对我来说,罐头食谱 make-foo 似乎被 make 忽略了。目标 foo1 和 foo2(空配方)的调试结果是相同的。
# why canned recipe doesn't work ?
# http://www.gnu.org/software/make/manual/make.html#Canned-Recipes
define make-foo =
echo making $@
touch $@
endef
.PHONY: all
all: foo1 foo2 foo3
# foo1 is not created, but why ?
.PHONY: foo1
foo1:
$(make-foo)
# debug output similar to foo1
.PHONY: foo2
foo2:
# this works
.PHONY: foo3
foo3:
echo making $@
touch $@
运行 make:
xxxx@xxxx:/dev/shm$ make -dRr
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for i686-pc-linux-gnu
Reading makefiles...
Reading makefile `makefile'...
Updating makefiles....
Considering target file `makefile'.
Looking for an implicit rule for `makefile'.
No implicit rule found for `makefile'.
Finished prerequisites of target file `makefile'.
No need to remake target `makefile'.
Updating goal targets....
Considering target file `all'.
File `all' does not exist.
Considering target file `foo1'.
File `foo1' does not exist.
Finished prerequisites of target file `foo1'.
Must remake target `foo1'.
Successfully remade target file `foo1'.
Considering target file `foo2'.
File `foo2' does not exist.
Finished prerequisites of target file `foo2'.
Must remake target `foo2'.
Successfully remade target file `foo2'.
Considering target file `foo3'.
File `foo3' does not exist.
Finished prerequisites of target file `foo3'.
Must remake target `foo3'.
echo making foo3
Putting child 0x0914c5f0 (foo3) PID 3132 on the chain.
Live child 0x0914c5f0 (foo3) PID 3132
making foo3
Reaping winning child 0x0914c5f0 PID 3132
touch foo3
Live child 0x0914c5f0 (foo3) PID 3133
Reaping winning child 0x0914c5f0 PID 3133
Removing child 0x0914c5f0 PID 3133 from chain.
Successfully remade target file `foo3'.
Finished prerequisites of target file `all'.
Must remake target `all'.
Successfully remade target file `all'.
缺少 foo1:
xxxx@xxxx:/dev/shm$ ll foo*
-rw-r--r-- 1 xxxx xxxx 0 2011-02-17 20:04 foo3
I'm expecting to see files foo1 and foo3 created by the makefile below. However only a file foo3 is created. To me it seems that the canned recipe make-foo is simply ignored by make. The debug outcome of targets foo1 and foo2 (empty recipe) is identical.
# why canned recipe doesn't work ?
# http://www.gnu.org/software/make/manual/make.html#Canned-Recipes
define make-foo =
echo making $@
touch $@
endef
.PHONY: all
all: foo1 foo2 foo3
# foo1 is not created, but why ?
.PHONY: foo1
foo1:
$(make-foo)
# debug output similar to foo1
.PHONY: foo2
foo2:
# this works
.PHONY: foo3
foo3:
echo making $@
touch $@
Running make:
xxxx@xxxx:/dev/shm$ make -dRr
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for i686-pc-linux-gnu
Reading makefiles...
Reading makefile `makefile'...
Updating makefiles....
Considering target file `makefile'.
Looking for an implicit rule for `makefile'.
No implicit rule found for `makefile'.
Finished prerequisites of target file `makefile'.
No need to remake target `makefile'.
Updating goal targets....
Considering target file `all'.
File `all' does not exist.
Considering target file `foo1'.
File `foo1' does not exist.
Finished prerequisites of target file `foo1'.
Must remake target `foo1'.
Successfully remade target file `foo1'.
Considering target file `foo2'.
File `foo2' does not exist.
Finished prerequisites of target file `foo2'.
Must remake target `foo2'.
Successfully remade target file `foo2'.
Considering target file `foo3'.
File `foo3' does not exist.
Finished prerequisites of target file `foo3'.
Must remake target `foo3'.
echo making foo3
Putting child 0x0914c5f0 (foo3) PID 3132 on the chain.
Live child 0x0914c5f0 (foo3) PID 3132
making foo3
Reaping winning child 0x0914c5f0 PID 3132
touch foo3
Live child 0x0914c5f0 (foo3) PID 3133
Reaping winning child 0x0914c5f0 PID 3133
Removing child 0x0914c5f0 PID 3133 from chain.
Successfully remade target file `foo3'.
Finished prerequisites of target file `all'.
Must remake target `all'.
Successfully remade target file `all'.
Missing foo1:
xxxx@xxxx:/dev/shm$ ll foo*
-rw-r--r-- 1 xxxx xxxx 0 2011-02-17 20:04 foo3
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我认为您不希望在
define
行末尾添加=
。这个 makefile 在这里对我有用:示例:
GNU make 手册 似乎表明
=
应该没问题,但像你一样,如果我有它,我会得到不同的行为。编辑:我刚刚问:
GNU 在多行变量声明中做出差异
澄清一下这里发生的事情......
I think you don't want the
=
at the end of thedefine
line. This makefile works here for me:Example:
The GNU make manual seems to indicate that the
=
should be just fine, but like you, I get different behaviour if I have it there.Edit: I just asked:
GNU make differences in multiline variable declarations
To get some clarification on what's happening here...