GNU Make: attention: ignorer les anciennes commandes pour cible `xxx'

Pourriez-vous s'il vous plaît aidez-moi à comprendre comment GNU Make (version 3.81) processus simple Makefile? Voici le fichier:

.PHONY: a b c e f
a : b c
    @echo "> a(b,c)"
e : a
    @echo "> e(a)"
e : f
    @echo "> e(f)"
f :
    @echo "> f()"
b :
    @echo "> b()"
c :
    @echo "> c()"

Maintenant, je commande exécuter

make e

de construire un " e " à la cible. Prendre la sortie ressemble à ceci:

Makefile:7: warning: overriding commands for target `e'
Makefile:5: warning: ignoring old commands for target `e'
> f()
> b()
> c()
> a(b,c)
> e(f)

http://www.gnu.org/software/make/manual/html_node/Error-Messages.html donne l'explication suivante:

‘avertissement: le remplacement de la recette pour cible "xxx"

‘avertissement: le non-respect vieille recette pour cible "xxx"

GNU make permet qu'une seule recette pour être spécifiée par la cible (sauf pour les double-points de règles). Si vous donner une recette pour une cible qui a déjà été défini, cet avertissement est émis et la deuxième recette remplacera le premier.

Mais à partir de la sortie, nous pouvons voir que les commandes pour bâtir " une " cible sont également effectuées. J'ai pensé que, selon la description de 'Erreur-Messages" en page, lors du traitement de cette Makefile et d'essayer de construire un " e " à la cible (faire e), doivent en premier lieu décide que le 'e' dépend 'a', puis le remplacer à " e "dépend de "f". Et la sortie devrait ressembler à:

Makefile:7: warning: overriding commands for target `e'
Makefile:5: warning: ignoring old commands for target `e'
> f()
> e(f)

Mais il semble que le rendre encore rappeler que les 'e' dépend 'a' et écrase pas la recette.

S'il vous plaît aidez-moi à comprendre ce comportement. Pourquoi sont des commandes pour la construction 'une' cible toujours effectué, même après la recette d'écraser?

OriginalL'auteur bav | 2014-03-02