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

use*_*735 18 gnu-make

我期待看到下面的makefile创建的文件foo1foo3.但是只创建了一个文件foo3.对我而言,似乎罐头配方make-foo被make简单地忽略了.目标foo1foo2(空配方)的调试结果是相同的.

# 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 $@
Run Code Online (Sandbox Code Playgroud)

跑步:

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'.
Run Code Online (Sandbox Code Playgroud)

缺少foo1:

xxxx@xxxx:/dev/shm$ ll foo*
-rw-r--r-- 1 xxxx xxxx 0 2011-02-17 20:04 foo3
Run Code Online (Sandbox Code Playgroud)

Car*_*rum 29

我想你不希望=在最后define一行.这个makefile适用于我:

define make-foo
echo making $@
touch $@
endef

.PHONY: foo1
foo1:
    $(make-foo)
Run Code Online (Sandbox Code Playgroud)

例:

$ make
echo making foo1
making foo1
touch foo1
$ ls
Makefile  foo1
Run Code Online (Sandbox Code Playgroud)

GNU进行手动似乎表明了=应该就好,但是像你这样,我得到,如果我有它有不同的行为.

编辑:我刚才问:

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

要弄清楚这里发生了什么......

  • 我可以确认,删除`=`也解决了我的问题.这是我自己从未发现过的问题.谢谢 !我也非常感兴趣地关注这个延续问题. (2认同)
  • @ user272735,很高兴听到它解决了你的问题.我问的后续问题似乎没有得到太多的爱... (2认同)