Pourquoi sont .FAUX répétition implicite des règles ne se déclenche pas?
J'ai le récursive makefile:
.PHONY: all clean
%.subdir:
$(MAKE) -C src $*
$(MAKE) -C dict $*
all: all.subdir
clean: clean.subdir
et il fonctionne très bien:
$ make all
make -C src all
make[1]: Entering directory `/or-1.3.6-fix/src'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/or-1.3.6-fix/src'
make -C dict all
make[1]: Entering directory `/or-1.3.6-fix/dict'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/or-1.3.6-fix/dict'
Mais il serait plus logique de définir %.subdir
règles bidons:
.PHONY: all clean all.subdir clean.subdir
et maintenant, faire des arrêts de travail comme je le souhaite:
$ make all
make: Nothing to be done for `all'.
$ make -d all
...
Updating goal targets....
Considering target file `all'.
File `all' does not exist.
Considering target file `all.subdir'.
File `all.subdir' does not exist.
Finished prerequisites of target file `all.subdir'.
Must remake target `all.subdir'.
Successfully remade target file `all.subdir'.
Finished prerequisites of target file `all'.
Must remake target `all'.
Successfully remade target file `all'.
make: Nothing to be done for `all'.
Quelqu'un peut-il m'expliquer pourquoi (ou encore mieux du point de moi de faire de la documentation)?
OriginalL'auteur dma_k | 2010-06-22
Vous devez vous connecter pour publier un commentaire.
Vous avez raison, il serait plus logique de définir le sous répertoire règles BIDONS". Mais Faire ne considère pas les règles implicites de FAUX objectifs, de sorte que vous aurez à réécrire la règle. Je suggère ce qui suit:
PHONY_TARGETS := all clean
et puis.PHONY: $(PHONY_TARGETS) $(addsuffix .subdir,$(PHONY_TARGETS))
Trouvé de la documentation pour que les deux côlon à la recherche de la cible/dep ligne si ça intéresse quelqu'un: gnu.org/software/make/manual/html_node/...
OriginalL'auteur Beta
Que GNU make objectifs déclarés comme
.PHONY
être explicite a déjà été dit dans les autres réponses, qui a également apporté un remède à cela.Dans ce complément de réponse, je voudrais ajouter un autre qui, comme je l'ai testé combine "bidon" de comportement, c'est à dire que les objectifs sont déclenchées chaque fois, peu importe si un fichier du même nom existe déjà (ils sont ignorés). L'alternative qui va comme ceci:
Il fonctionne sur le principe que si seulement les cibles explicites peut être défini comme .FAUX, quelle que soit la dépend donc explicite faux cible est d'hériter de beaucoup (à ma connaissance) de faux attributs.
Implicitement, c'est à dire correspondant à un modèle cible comme le
%.subdir
ci-dessus est juste comme si se serait ajouté à.PHONY
(ce qui est impossible car il n'est pas lui-même explicite), mais de devenir de faux par l'intermédiaire de ses prérequis fauxphony_explicit
.Il revient que chaque règle également implicite par filtrage - qui a dans ses conditions préalables explicite faux cible (c'est à dire une cible qui est ajouté à la
.PHONY
) est via cette dépendance a également exécuté dans un bidon de style (à chaque fois, sans condition de le système de fichiers erronously avoir un fichier avec un coninciding nom).En effet le GNU make documentation mentionne le
FORCE
cible, qui dans certaines versions de GNU qui n'offrent pas de.PHONY
cible émule en partie la.PHONY
comportement. L'alternative présentée ici utilise ceFORCE
cible approuch, mais parce que GNU make est utilisé, il définit également laFORCE
la cible sous.PHONY
éviter d'éventuels conflits avec les fichiers existants du même nom.Avec cette solution, même un
rendement souhaité invocation de
Ce qui pourrait être un potentiel pro point de cette solution est qu'elle ne nécessite aucune déclaration explicite de
clean.subdir
etall.subdir
, mais c'est vraiment à l'aide de l'implicite%.subdir
pattern matching.OriginalL'auteur humanityANDpeace
De cette section de le faire manuellement:
Par conséquent, votre implicite cibles ne sont jamais recherchés parce qu'ils sont faux.
Vous pouvez obtenir ce que vous essayez de le faire d'une autre manière. Essayez ceci:
La réponse a été mis à jour avec une section spécifique sur de fausses règles implicites et des objectifs, ainsi qu'une autre façon d'aborder le problème.
Merci, maintenant est beaucoup mieux.
OriginalL'auteur bta