web-dev-qa-db-fra.com

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 plus connu de générer une liste de dépendances pour le projet que je peux utiliser dans le makefile, autre que l'examen de chaque fichier source à la main ou avec un script Perl écrit à la main?

36
Nathan Fellman

La documentation de GN fournit une bonne solution.

Absolument. g++ -MM <your file> Générera une liste de dépendances compatible avec GMake. J'utilise quelque chose comme ça:

# 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 $<

Remarque: $(CXX)/gcc la commande doit être précédée d'un onglet dur

Cela va générer automatiquement les dépendances pour chaque fichier qui a changé et les compiler selon la règle que vous avez en place. Cela me permet de simplement vider de nouveaux fichiers dans le répertoire src/, Et de les faire compiler automatiquement, les dépendances et tout.

52
Stefan Mai

Ayant maintenant lu cette partie en particulier Je pense qu'il existe une solution beaucoup plus facile, tant que vous avez une version raisonnablement à jour de gcc/g ++. Si vous ajoutez simplement -MMD à votre CFLAGS, définissez une variable OBJS représentant tous vos fichiers objet, puis procédez comme suit:

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

alors cela devrait vous procurer à la fois un système de génération de dépendances automatique efficace et simple.

19
Christopher Smith

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

6
Barry Kelly

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

-include Makefile.deps

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

Le compilateur Digital Mars C/C++ est livré avec un outil makedep .

0
Walter Bright