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
Vous devez vous connecter pour publier un commentaire.
Les dépendances sont distincts des commandes. La dépendance à l'égard
a
n'est pas oublié, mais les commandes sont.Notez que la documentation dit le recette sera remplacé, non pas que le règle sera remplacé. La recette est un ensemble de commandes qui sont exécutées à la mise à jour de la cible. Donc, la documentation décrit précisément ce qui se passe en réalité: seulement la recette de la partie de la règle est écrasé.
OriginalL'auteur tripleee