2010-09-16 28 views
7

J'observe un comportement intéressant de make et je me demande s'il y a une explication raisonnable à cela en plus d'un bug dans gmake.makefile pattern rules without recipes

Disons que nous avons les éléments suivants dans makefile:

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

%-fox: %-fox-animal 

%-wolf: %-wolf-animal 

La différence entre les deux dernières cibles est que « % -Wolf » n'a pas de recette, et « % -fox » a une recette vide (c'est-à-dire juste une ligne avec un onglet au début).

Lorsque nous essayons d'exécuter les règles, voici ce qui se passe:

[[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 

règle de schéma i.e.the qui a une recette (bien un vide) fonctionne, celui qui ne fait pas non. Ai-je manqué quelque chose dans la façon dont il est censé fonctionner?

+0

Donc, son message est d'accord avec ce que vous pensez qu'il devrait faire: il y a une règle pour le loup-garou, mais pas de règle pour faire freddy-loup. – reinierpost

+0

@reinierpost: La version GNU Make 3.82 incluait une recherche/remplacement de documentation épique créant le terme «recette» pour l'ensemble des commandes utilisées pour mettre à jour la cible d'une règle. Donc (1) ce n'est pas seulement le terme de m1tk4 et (2) ce fut une surprise pour moi aussi. Voir r1.51 de http://cvs.savannah.gnu.org/viewvc/make/doc/make.texi?root=make&view=log –

+0

@John Marshall: hmmm ... bon à savoir, merci. (Je suis sur 3.81 jusqu'à ce que Cygwin le mettra à jour.) – reinierpost

Répondre

9

Les règles de modèle sans aucune recette sont documentées comme signifiant quelque chose de très différent de ceux fournissant une recette, même vide. Au contraire, ils cancel any pre-existing implicit rule:

Vous pouvez annuler une règle implicite intégrée en définissant une règle de modèle avec la même cible et les conditions préalables, mais pas de recette.

Ainsi votre modèle "% de -Wolf" sert en fait d'annuler toute règle implicite existante pour % -Wolf animal ->% -Wolf. Et il n'y en avait pas de toute façon. Ce que vous appelez «recette», faites des appels «règle à faire»