2010-09-16 21 views
7

Estoy observando un comportamiento interesante de make y me pregunto si hay una explicación razonable además de un error en gmake.reglas del patrón makefile sin recetas

Digamos que tenemos lo siguiente en el archivo MAKE:

%-animal: 
     echo "$* is an animal" 

%-fox: %-fox-animal 

%-wolf: %-wolf-animal 

La diferencia entre los dos últimos objetivos es que "% -wolf" no tiene ninguna receta, y "% -Fox" tiene una receta vacía (es decir, solo una línea con una pestaña al principio).

Cuando tratamos de ejecutar las reglas, esto es lo que sucede:

[[email protected] tmp]# make freddy-animal 
echo "freddy is an animal" 
freddy is an animal 
[[email protected] tmp]# make freddy-wolf 
make: *** No rule to make target `freddy-wolf'. Stop. 
[[email protected] tmp]# make freddy-fox 
echo "freddy-fox is an animal" 
freddy-fox is an animal 

regla de patrón i.e.the que tiene una receta (aunque una vacía) trabaja, el que no lo hace no lo hace. ¿Me estoy perdiendo algo de la forma en que debería funcionar?

+0

Lo que usted llama 'receta', hacer llamadas 'regla para hacer'. De modo que su mensaje concuerda con lo que crees que debería hacer: hay una regla para freddy-wolf, pero no hay una regla '* para hacer * freddy-wolf. – reinierpost

+0

@reinierpost: La versión GNU Make 3.82 incluye una búsqueda/reemplazo de documentación épica creando el término 'receta' para el conjunto de comandos utilizados para actualizar el objetivo de una regla. Entonces (1) no es solo el término de m1tk4 y (2) esto también fue una sorpresa para mí. Ver r1.51 de http://cvs.savannah.gnu.org/viewvc/make/doc/make.texi?root=make&view=log –

+0

@John Marshall: hmmm ... es bueno saberlo, gracias. (Estoy en 3.81 hasta que Cygwin lo actualice). – reinierpost

Respuesta

9

Las reglas de patrón sin recetas están documentadas como algo completamente diferente de las que proporcionan una receta, incluso una vacía. En su lugar, cancel any pre-existing implicit rule:

Usted puede cancelar una regla implícita incorporada mediante la definición de una regla patrón con el mismo objetivo y requisitos previos, pero hay una receta.

lo tanto su patrón "% -wolf" en realidad sirve para cancelar cualquier regla implícita existente para % -wolf animal ->% -wolf. Y no había uno de todos modos.

Cuestiones relacionadas