我過去一直在使用qmake
和CMake
而沒有任何問題來生成我的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))
?