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?
Réponses
Trop de publicités?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.
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.
MakeDepend est probablement ce dont vous avez besoin.