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?
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.
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.
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.
J'ajoute juste ceci au makefile et ça marche bien:
-include Makefile.deps
Makefile.deps:
$(CC) $(CFLAGS) -MM *.[ch] > Makefile.deps
Le compilateur Digital Mars C/C++ est livré avec un outil makedep .