我在多个目录中使用了一组通用的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
答案 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
文件制定规则,只需在构建目标文件的相同规则中构建它们。这样你就不会构建它们,除非你真的需要它们。