title: Why GNU Make canned recipe doesn't work?
body: <p>I'm expecting to see files <em>foo1</em> and <em>foo3</em> created by the makefile below. However only a file <em>foo3</em> is created. To me it seems that the canned recipe <em>make-foo</em> is simply ignored by make. The debug outcome of targets <em>foo1</em> and <em>foo2</em> (empty recipe) is identical.</p>
  
  <pre><code># 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 $@
  </code></pre>
  
  <p>Running make:</p>
  
  <pre><code>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'.
  </code></pre>
  
  <p>Missing <em>foo1</em>:</p>
  
  <pre><code>xxxx@xxxx:/dev/shm$ ll foo*
  -rw-r--r-- 1 xxxx xxxx 0 2011-02-17 20:04 foo3
  </code></pre>