2011-02-17 7 views
17

Estoy esperando ver los archivos foo1 y foo3 creados por el archivo MAKE a continuación. Sin embargo, solo se crea un archivo foo3. Para mí, parece que la receta en lata make-foo simplemente es ignorada por make. El resultado de depuración de los destinos foo1 y foo2 (receta vacía) es idéntico.¿Por qué la receta enlatada GNU Make no funciona?

# why canned recipe doesn't work ? 
# http://www.gnu.org/software/make/manual/make.html#Canned-Recipes 
define make-foo = 
echo making [email protected] 
touch [email protected] 
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 [email protected] 
    touch [email protected] 

con make:

[email protected]:/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:

[email protected]:/dev/shm$ ll foo* 
-rw-r--r-- 1 xxxx xxxx 0 2011-02-17 20:04 foo3 

Respuesta

28

Creo que no quiere que el = al final de la línea define. Este archivo MAKE funciona aquí por mí:

define make-foo 
echo making [email protected] 
touch [email protected] 
endef 

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

Ejemplo:

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

El GNU make manual parece indicar que el = debe estar muy bien, pero al igual que usted, yo obtener un comportamiento diferente si lo tengo allí.

Editar: Yo sólo preguntó:

GNU make differences in multiline variable declarations

para conseguir algunas aclaraciones sobre lo que está pasando aquí ...

+2

puedo confirmar que el abandono '' = fija el problema también para mí. Ese es un problema que probablemente nunca hubiera descubierto por mi cuenta. Gracias ! También estoy siguiendo la pregunta de continuación con gran interés. – user272735

+2

@ user272735, es bueno saber que resolvió su problema. La pregunta de seguimiento que hice no parece estar recibiendo mucho amor ... –

Cuestiones relacionadas