2010-07-16 4 views
1

J'utilise un makefile qui a l'intention de générer des dépendances automatiquement. Mais avec mon fichier, je trouve que bien que les modifications apportées aux fichiers d'en-tête provoquent la recompilation du code, elles ne provoquent pas la régénération des dépendances, comme je le pense. Quelqu'un peut-il voir ce que j'ai manqué?La génération de dépendance Makefile ne vérifie pas les en-têtes

.SUFFIXES : .hpp .cpp .d .o 
SOURCES=main.cpp sub1.cpp sub2.cpp 
OBJECTS=${SOURCES:.cpp=.o} 
DEPENDENCIES=${SOURCES:.cpp=.d} 

.cpp.d: 
    g++ -MM $< > [email protected] 
.cpp.o: 
    g++ $< -c `pkg-config gtkmm-2.4 --cflags --libs` -g 

calculator: ${OBJECTS} ${DEPENDENCIES} 
    g++ ${OBJECTS} -o calculator `pkg-config gtkmm-2.4 --cflags --libs` -g 

include ${DEPENDENCIES} 
+0

Ceci est rusé. J'attendrais une réponse profi. Le point crucial du problème (évidemment) que .d ne dépend que du .cpp, et ignore les modifications du fichier d'en-tête. Donc, d'une certaine manière, .d doit dépendre de .d .... Les dépendances sont l'une des raisons pour lesquelles je n'utilise pas make pour tout. – Dummy00001

Répondre

1

Solution trouvée moi-même. L'astuce apparaît également dans le official GNU make documentation.

La ligne pour générer les dépendances devraient ressembler à ça:

.cpp.d: 
     g++ -MM $< | sed 's!^$(<:.cpp=.o):!$(<:.cpp=.o) $(<:.cpp=.d):!' > [email protected] 

Sed se traduit par la ligne de dépendance de "main.o: main.cpp include/hello.hpp" dans « main.o principale. d: main.cpp inclue/hello.hpp "(exemple de mon test minimisé) rendant ainsi .d dépend des mêmes fichiers que le fichier .o lui-même.

Bien que je recommande personnellement d'utiliser par ex. SCons qui est capable de suivre automatiquement les dépendances, car (selon mon expérience), la solution GNU fait souvent sauter la solution lorsqu'un nouveau fichier d'en-tête est introduit ou que certains fichiers sont renommés.

+0

Merci, Dummy00001. Cela semble avoir fait l'affaire. –

1

Bien que je sois d'accord avec la solution de Dummy00001, il peut être utile d'ajouter un indicateur -MP à la commande g ++ pour générer les fichiers de dépendance. Ce qu'il fait est qu'il ajoute des cibles PHONY avec les noms de tous les fichiers d'en-tête dans la liste des dépendances.

à savoir si g++ -MM $< génère

test.o: test.cpp test.h dummy.h etc_bkp.h 

puis g++ -MM -MP $< génère

test.o: test.cpp test.h dummy.h etc_bkp.h 
test.h: 
dummy.h: 
etc_bkp.h: 

cela contribuerait à la marque de ne pas casser même si un changement de nom est fait ou un fichier a été supprimé

+0

Merci, vamsi. Je vais regarder dans ça. –

Questions connexes