47 votes

générer des dépendances pour un makefile pour un projet en C / C ++

J'ai un projet qui a un makefile avec des dépendances cassées. Existe-t-il un moyen le plus connu de générer une liste de dépendances pour le projet que je peux utiliser dans le makefile, autre que d'examiner chaque fichier source à la main ou avec un script perl écrit à la main?

58voto

Stefan Mai Points 9477

http://make.paulandlesley.org/autodep.html a une bonne solution.

Absolument. g++ -MM va générer un GMake compatible liste de dépendances. J'utilise quelque chose comme ceci:

# Add .d to Make's recognized suffixes.
SUFFIXES += .d

#We don't need to clean up when we're making these targets
NODEPS:=clean tags svn
#Find all the C++ files in the src/ directory
SOURCES:=$(shell find src/ -name "*.cpp")
#These are the dependency files, which make will clean up after it creates them
DEPFILES:=$(patsubst %.cpp,%.d,$(SOURCES))

#Don't create dependencies when we're cleaning, for instance
ifeq (0, $(words $(findstring $(MAKECMDGOALS), $(NODEPS))))
    #Chances are, these files don't exist.  GMake will create them and
    #clean up automatically afterwards
    -include $(DEPFILES)
endif

#This is the rule for creating the dependency files
src/%.d: src/%.cpp
    $(CXX) $(CXXFLAGS) -MM -MT '$(patsubst src/%.cpp,obj/%.o,$<)' $< -MF $@

#This rule does the compilation
obj/%.o: src/%.cpp src/%.d src/%.h
    @$(MKDIR) $(dir $@)
$(CXX) $(CXXFLAGS) -o $@ -c $<

Ce que cela va faire est de générer automatiquement les dépendances pour chaque fichier qui a été modifié, et de les compiler en fonction de ce que les règles que vous avez en place. Cela me permet juste de vidage de nouveaux fichiers dans le répertoire src/, et les ont compilés automatiquement les dépendances et tous.

25voto

Christopher Smith Points 2077

Après avoir lu cette partie en particulier, je pense qu'il est beaucoup plus facile de solution là-bas, aussi longtemps que vous avez un raisonnablement à jour de la version de gcc/g++. Si vous venez d'ajouter -MMD votre CFLAGS, définir une variable OBJS représentant tous vos fichiers objets, et ensuite il faut faire:

-include $(OBJS:%.o=%.d)

alors que vous devriez obtenir à la fois un moyen simple et efficace automatique de la dépendance du système de construction.

7voto

Barry Kelly Points 30330

Le préprocesseur GNU C cpp a une option, -MM, qui produit un ensemble de dépendances convenables en fonction des modèles d'inclusion.

5voto

mescalinum Points 82

J'ajoute juste ceci au makefile et ça marche bien:

 -include Makefile.deps

Makefile.deps:
    $(CC) $(CFLAGS) -MM *.[ch] > Makefile.deps
 

2voto

user17723 Points 21

MakeDepend est probablement ce dont vous avez besoin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X