Почему консервированный рецепт GNU Make не работает?

Я ожидаю увидеть файлы foo1 и foo3, созданные приведенным ниже make-файлом. Однако создается только файл 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 $@

Ходовая марка:

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

person user272735    schedule 17.02.2011    source источник


Ответы (1)


Я думаю, вам не нужна = в конце строки define. Этот makefile работает здесь для меня:

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

.PHONY: foo1
foo1:
    $(make-foo)

Пример:

$ make
echo making foo1
making foo1
touch foo1
$ ls
Makefile  foo1

В руководстве по созданию GNU указано, что = должно быть в порядке, но, как и вы, я получаю другое поведение, если оно у меня есть.

Редактировать: я просто спросил:

GNU делает различия в объявлениях многострочных переменных

Чтобы получить некоторые разъяснения о том, что здесь происходит...

person Carl Norum    schedule 17.02.2011
comment
Я могу подтвердить, что удаление = решило проблему и для меня. Это проблема, которую я, вероятно, никогда не узнал бы сам. Спасибо ! Я также с большим интересом слежу за вопросом о продолжении. - person user272735; 17.02.2011
comment
@ user272735, приятно слышать, что это решило вашу проблему. Последующий вопрос, который я задал, кажется, не получил большой любви... - person Carl Norum; 17.02.2011