2010-11-16 8 views
1

J'ai un ensemble commun de règles de création utilisées dans plusieurs répertoires. Chaque marque est très simple:comment configurer les dépendances entre répertoires dans gnu make

BASEDIR:=../.. 
TARGET:=theTarget 
include Makefile.include 

À moins surchargée, j'ai une valeur par défaut du code source:

SRC:= $(wildcard *.cpp) 

Nous voulons construire les fichiers objet dans un répertoire (pas avec les sources), si:

OBJDIR:= ../obj 
BARE:= $(foreach f,$(SRC),$(notdir $(f)) 
OBJ:= $(foreach o,$(BARE),$(OBJDIR)/$(o).o) 

J'ai donc les fichiers .o, mais je dois chacun pour tirer une règle basée sur la cpp tant que le répertoire est connu, c'est facile:Cependant, dans certains des répertoires, il existe des fichiers groupés arbitrairement dans les sous-répertoires. Je suis temporairement ce problème en inscrivant tous dans mon makefile central:

$(OBJDIR)/%.o: a/%.cpp 
    build... 
$(OBJDIR)/%.o: b/%.cpp 
    build... 

Mais ce que je voudrais faire est d'être en mesure de préciser les répertoires de construction dans une variable si possible. Est-il possible de mettre en place les dépendances

$(OBJDIR)/x.o: a/x.cpp 
$(OBJDIR)/y.o: a/y.cpp 

et

$(OBJDIR)/z.o: b/z.cpp 

sans avoir manuellement à la liste les dépendances?

Pour cette question, j'ai aussi des fichiers de dépendance (.d)

$(DEPDIR)/%.d: $(SRC) 

que je veux mettre en place des dépendances en fonction de ce qui est dans la source. Par exemple: .deps/xd: a/g ++ x.cpp -MM -MT $ (objdir)/$ (notDIR $ @) < $ -o $ (DEPDIR)/$ (notDIR $ @)

Existe-t-il un moyen facile de générer ces règles sans les écrire pour chaque répertoire?

est ici où je suis les informations sur la génération des fichiers .d en premier lieu: http://mad-scientist.net/make/autodep.html#advanced

Le but à la fin est d'inclure tous les fichiers .d et ont généré automatiquement arbre dépendance des fichiers . Mais c'est la dernière partie. Je ne sais pas comment utiliser les fichiers .d. Est-ce que je les inclut tous?

include $(DEPDIR)/%.d 

ne fonctionne pas. Je peux les chat tous ensemble dans une règle: cat $ (DEP)> $ (DEPDIR)/deps.inc

puis

include deps.inc 

Répondre

2

Tout d'abord, pour faire face aux répertoires source:

vpath %.cpp a b 

$(OBJDIR)/%.o: %.cpp 
    build... 

Ensuite, si vous voulez, vous pouvez générer les fichiers de dépendance comme celle-ci:

# Might as well use DEPDIR, rather than "deps" 

$(DEPDIR)/%.d: %.cpp 
    g++ -MM ... 

# Note the wildcard. And the '-' at the beginning means 
# "don't panic if there aren't any". 

-include $(DEPDIR)/*.d 

Mais il y a un meilleur moyen qui est décrit dans la source que vous citez. Ne créez pas de règle pour les fichiers .d, construisez-les simplement selon la même règle que celle qui crée les fichiers objets. De cette façon, vous ne les construisez pas, sauf si vous en avez réellement besoin.

+0

Merci pour l'include $ (DEPDIR)/*. D – Dov

Questions connexes