[英]GNU Makefile automatic dependency resolve
我過去一直在使用qmake
和CMake
來生成我的makefile,沒有任何問題。 但是,最近我發現在運行代碼的某些集群上,這些工具很難找到/安裝,因此我決定編寫裸Makefile。 另外我還可以學到一些關於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 $@
$(LIB_0): $($(OBJS_DIR)/%.o)
@echo " generating library file: $(@F) ..."
@$(AR) $(AR_FLAGS) $@ $^
.PHONY: clean
clean:
@$(RM) $(OBJS_DIR) $(LIBS_DIR)
這通常可以很好地工作,但是我想在以下幾方面進行改進:1)當我更改頭文件並發出make
,編譯器不知何故沒有all
選擇,並且似乎默認為DEPS
。 這應該在此makefile中發生嗎? 我怎樣才能使all
默認規則? 2)如何使依賴文件不可見? 我嘗試了DEPS := $(patsubst %,$(OBJS_DIR)/.%,$(SRCS:.cpp=.d))
但這無濟於事3)如果您認為此Makefile有什么特別的建議可以給我可以通過其他方式改進嗎?
編輯:說實話,我什至不知道如何make調用編譯器來生成依賴項:p ...我沒有看到任何明確的規則。 是否以某種方式隱藏在DEPS := $(patsubst %,$(OBJS_DIR)/%,$(SRCS:.cpp=.d))
?
1)將-include $(DEPS)
向下-include $(DEPS)
all
規則下方。 第一條規則是默認規則(除非您有意設置一些特殊變量),因此,如果include
優先於以下規則all:
,則將成為默認規則。
2)我相信,通過“讓他們看不見”你的意思是你想.foo.d
而不是foo.d
。 您必須修改使它們成為規則:
$(OBJS_DIR)/%.o: %.cpp
@echo " compiling source file: $< ..."
$(CXX) -c $(CXXFLAGS) -I$(INCLUDE_PATH) -MM $< -o $@
@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
標志,因此編譯器生成依賴項文件作為副作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.