2010-03-16 3 views
2

Je joue avec les fichiers make et la variable VPATH. Fondamentalement, je prends des fichiers source à partir de quelques endroits différents (spécifiés par le VPATH), et les compile dans le répertoire courant en utilisant simplement une liste de fichiers .o que je veux. Jusqu'ici tout va bien, maintenant je génère des informations de dépendance dans un fichier appelé '.depend' et je l'inclut. Gnumake va essayer d'utiliser les règles définies jusqu'à présent pour créer le fichier inclus s'il n'existe pas, donc c'est ok. Fondamentalement, mon makefile ressemble à ceci. Maintenant, pour la vraie question, puis-je supprimer la génération du fichier .depend de quelque façon que ce soit? Je travaille actuellement dans un environnement clearcase -> sloooow, donc je préférerais avoir un peu plus de contrôle quand mettre à jour les informations de dépendance. C'est plus ou moins un exercice académique car je peux juste envelopper la chose dans un script qui touche le fichier .depend avant d'exécuter make (ce qui le rend plus récent que n'importe quel fichier source), mais il serait intéressant de savoir si je peux en quelque sorte le supprimer en utilisant la marque «pure».Tricher Makefile en utilisant VPATH et inclure

Je ne peux pas supprimer la dépendance aux fichiers source (c'est-à-dire en utilisant simplement .depend:), car je dépends de la variable $^ pour faire la résolution VPATH pour moi.

S'il n'y aurait aucun moyen de dépendances uniquement de mise à jour à la suite des directives #include mises à jour, ce serait encore mieux bien sûr .. Mais je ne retiens pas mon souffle pour que l'on .. :)

+0

Pourquoi ne pas envelopper '.depend: ...' 'cible dans le travail de directive if'? –

+0

@Pavel: intéressant, je n'y avais jamais pensé. – falstro

Répondre

2

Si vous ne souhaitez pas reconfigurer .depend à chaque fois, vous ne devez pas avoir de règle pour cela. Notez que chaque fois que vous avez vraiment besoin de refaire le fichier de dépendances, vous devez également refaire un fichier objet (ce n'est pas mon point de vue, il vient de Advanced Auto-Dependency Generation, et il m'a fallu du temps pour le saisir). Donc, construire .depend dans la règle de liaison, en utilisant une cible PHONY:

DEPEND_FILE = .depend 
# put this command in the executable rule 
    $(MAKE) DEPENDENCIES 

.PHONY: DEPENDENCIES 
DEPENDENCIES: $(objects:.o=.c) 
    $(CC) -MM $^ > $(DEPEND_FILE) 

-include $(DEPEND_FILE) 

Vous pouvez rendre les choses plus efficaces en ayant séparé dépendent des fichiers, un pour chaque objet, de sorte que lorsque l'on change vous n'avez pas recalcule les dépendances de tous les objets:

# put this command in the %.o rule 
    $(CC) -MM $< > $*.d 

-include *.d 

(EDIT: il suffit de corriger une erreur stupide.)

+0

ooh .. cette dernière chose est assez bonne réflexion. il y a un drapeau à gcc (-MD) pour générer des fichiers de dépendance lors de la compilation aussi, vous n'avez donc pas besoin de l'exécuter deux fois dans le préprocesseur. – falstro

+0

J'ai accepté cela car cela m'a inspiré à faire ce que j'ai fait, c'est-à-dire avoir des fichiers .d séparés pour chaque objet, en compilant chaque objet avec -MMD. Et le '-include * .d'. Ceci provoque le déclenchement de la recompilation en cas de besoin, produisant des dépendances en tant que sous-produit. Aucun travail n'est fait quand ce n'est pas nécessaire. Excellent! – falstro