2012-09-05 259 views
0

我過去一直在使用qmakeCMake而沒有任何問題來生成我的makefile。然而,最近我想到了一些運行我的代碼的集羣,這些工具很難找到/安裝,所以我決定編寫裸機Makefile。除此之外,我還可以學習一些關於Makefiles的東西;)GNU Makefile自動依賴關係解析

我的項目涉及到幾個帶有源文件/頭文件的目錄,並且通常在它們之間交叉依賴。我通過SO瞭解到,使用-MM標誌來自動生成依賴信息。我的Makefile文件看起來像這樣

include $(HEAD_DIR)/common.mk 

OBJS_DIR = objs 
LIBS_DIR = libs 

SRCS = Matrix.cpp MatrixFull.cpp 
OBJS = $(patsubst %,$(OBJS_DIR)/%,$(SRCS:.cpp=.o)) 
LIB_0 = $(patsubst %, $(LIBS_DIR)/%,libalgebra.a) 

DEPS := $(patsubst %,$(OBJS_DIR)/%,$(SRCS:.cpp=.d)) 
-include $(DEPS) 

.PHONY: all 
all:  
    @echo " ===== Building dependencies in lib/algebra ===== " 
    @$(MKDIR) $(OBJS_DIR) 
    @$(MAKE) $(OBJS) 
    @$(MKDIR) $(LIBS_DIR) 
    @$(MAKE) $(LIB_0) 
    @echo " ===================== done ===================== " 

$(OBJS_DIR)/%.o: %.cpp 
    @echo " compiling source file: $< ..." 
    $(CXX) -c $(CXXFLAGS) -I$(INCLUDE_PATH) -MM $< -o [email protected] 

$(LIB_0): $($(OBJS_DIR)/%.o) 
    @echo " generating library file: $(@F) ..." 
    @$(AR) $(AR_FLAGS) [email protected] $^ 

.PHONY: clean 
clean: 
    @$(RM) $(OBJS_DIR) $(LIBS_DIR) 

這通常工作得很好,但我想,以提高兩件事: 1)當我改變一個頭文件和我發出make,不知何故編譯器不挑all和似乎默認爲DEPS。這應該發生在這個makefile?我如何使all爲默認規則? 2)如何使依賴性文件不可見?我試過DEPS := $(patsubst %,$(OBJS_DIR)/.%,$(SRCS:.cpp=.d))但是沒有幫助 3)如果你認爲這個Makefile可以用其他方式改進,是否有任何具體的建議可以給我?

編輯:說實話,我甚至不知道如何調用編譯器來生成依賴關係:p ...我沒有看到任何明確的規則。它是不是隱藏在DEPS := $(patsubst %,$(OBJS_DIR)/%,$(SRCS:.cpp=.d))

回答

1

1)將-include $(DEPS)向下移動到all規則的下方。第一個規則是默認規則(除非您故意設置一些特殊變量),所以如果includeall:以上的規則中取得,那將是默認規則。

2)我推測,通過「讓它們隱形」,你的意思是你想要.foo.d而不是foo.d。您必須修改,使它們的規則:

$(OBJS_DIR)/%.o: %.cpp 
    @echo " compiling source file: $< ..." 
    $(CXX) -c $(CXXFLAGS) -I$(INCLUDE_PATH) -MM $< -o [email protected] 
    @mv $(OBJS_DIR)/$*.d $(OBJS_DIR)/.$*.d 

,然後是發現他們的變量:

DEPS := $(patsubst %.cpp,$(OBJS_DIR)/.%.d,$(SRCS)) 

3)我想擺脫遞歸調用($(MAKE) ...),但你應該確保其他一切正常工作。我很驚訝$(OBJS_DIR)/%.o規則不會在common.mk去。除此之外,它看起來不錯。

4(?))$(OBJS_DIR)/%.o規則中的編譯器命令使用-MM標誌,因此編譯器會生成依賴文件作爲副作用。