如何在gnu make中设置跨目录依赖项

时间:2010-11-16 16:54:25

标签: dependencies g++ makefile build-automation

我在多个目录中使用了一组通用的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 / x.d:a / x.cpp         g ++ -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

1 个答案:

答案 0 :(得分: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文件制定规则,只需在构建目标文件的相同规则中构建它们。这样你就不会构建它们,除非你真的需要它们。