簡體   English   中英

GNU Makefile自動依賴關系解析

[英]GNU Makefile automatic dependency resolve

我過去一直在使用qmakeCMake來生成我的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM