2010-11-16 74 views
1

我在多個目錄中使用了一套常用的make規則。每個化妝也很簡單:如何在gnu中設置交叉目錄依賴關係make

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

除非重寫,我對源代碼中的默認值:

SRC:= $(wildcard *.cpp) 

我們要建立一個目錄中的目標文件(不是源)所以:

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

所以我有.o文件,但我需要每個人根據在.cpp 只要目錄被稱爲火的規則,這是很容易:

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

但是在一些目錄中,在子目錄中有任意分組的文件。我這周圍暫時得到通過硬編碼它們都在我的makefile中心:

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

但我想要做的是能如果可能的話在一個變量指定編譯目錄。有什麼辦法來建立依賴關係

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

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

,而無需手動不必列出的依賴?

對於這個問題,我也有相關文件(.D)

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

我想基於無論是在源頭上建立依賴性。 例如: .deps/XD:A/x.cpp 克++ -MM -MT $(objdir)/ $(notdir $ @)$ < -o $(DEPDIR)/ $(notdir $ @)

有沒有簡單的方法來生成這些規則,而不寫入每個目錄?

這裏就是我上首先生成.d文件中的信息: http://mad-scientist.net/make/autodep.html#advanced

最終的目標是包括所有的.d文件,並有從文件中依賴樹自動生成。但這是最後一部分。我不知道如何使用.d文件。我只是將它們全部包括在內?

include $(DEPDIR)/%.d 

不起作用。

我可以將它們放在一起: cat $(DEP)> $(DEPDIR)/ deps。INC

然後

include deps.inc 

回答

2

首先,應對源目錄:

vpath %.cpp a b 

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

然後,如果你願意,你可以生成依賴文件是這樣的:

# 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 

但是在你引用的來源中描述的更好。不要爲.d文件制定規則,只需使用構建目標文件的相同規則構建它們即可。這樣,除非你真的需要它們,否則你不會構建它們。

+0

感謝您的包括$(DEPDIR)/ *。d – Dov 2010-11-16 19:38:14

相關問題