2014-01-29 43 views
1

我已经厌倦了等待我们的生成将依赖文件与目标文件分开制作,所以我试图切换我们的生成以使用-MMD生成.d文件它生成.o文件。使用-MMD生成的依赖项文件在删除后自动生成

这个效果很好,我们的构建时间缩短了一半,但是因为我没有规则来创建一个.d文件,如果它们不存在,make会忽略它们,并且不会重建目标文件。我们的一个要求是,如果依赖文件不存在,我们重建它们,显然我们不喜欢“不要删除依赖文件”解决方案。所以,是的,我们正在研究成功构建基线的情况,然后随时随地删除依赖文件并且懒得做一次清理。

如何判断如果.d文件不存在,只重建.o文件?当我使.d依赖于.o时,我得到“没有规则来制作目标xyz.d”。

+0

所以建立一个规则来生成.d文件。一些make程序足够聪明,可以在.d被更改后重新加载包含在makefile中。 –

+0

使用-MMD标志将.o文件的副产品作为.o文件的副产品生成。如果我分别制作它们,那么我会加倍编译时间,因为它必须制作.d文件和.o文件。 – mjr

+0

我们使用“gcc -M * .cpp> .depend”然后“include .depend” –

回答

1

这是我会怎么做它:

EXE := toto 
SRC := $(wildcard *.cpp) 
DIR := obj 
OBJ := $(SRC:%.cpp=$(DIR)/%.o) 
DEP := $(OBJ:.o=.d) 

CPPFLAGS := -MMD -MP 

.PHONY: all clean fclean re 

all: $(EXE) 

$(EXE): $(OBJ) $(DEPS) 
    $(CXX) $(LDFLAGS) $(OBJ) $(LDLIBS) -o [email protected] 

$(DIR)/%.o $(DIR)/%.d: %.cpp | $(DIR) 
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $*.o -c $< 

$(DIR): 
    @mkdir [email protected] 

-include $(DEPS) 

clean: 
    @$(RM) -r $(DIR) 

fclean: clean 
    @$(RM) $(EXE) 

re:  fclean all 

当我手动删除.d文件之一,并运行make,它被重建。 唯一的是,可执行文件也被重建。