2014-01-29 47 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,它被重建。 唯一的是,可執行文件也被重建。