話不多說,上一篇中提到了想把編譯規則集中到單獨的文件夾,今天就來做這個。同products,我們將所有編譯規則移動的targets目錄下,
## main.mk
。。。
## 只要給定源文件目錄以及目標hello.exe
## 調用executable.mk,就可以自動編譯得到想要的可執行文件
SRC_FILES:= hello.cpp main.cpp
TARGET:=hello.exe
## 定義瞭如何生成可執行文件的通用規則
include build/targets/executable.mk
相關的生成obj的編譯規則,自動導出頭文件依賴關係的命令,以及生成可執行文件的規則,都集中到executable.mk。這時,我猜你肯定會立馬想到,是不是還要有一個static-library.mk, shared-library.mk?binggo,這是必須的。(這裏簡化起見,我只討論static-library.mk)。當開始專注於編寫static-library.mk時,會發現obj的生成規則可以複用,所以我們又將obj的生成規則集中到object.mk
# object.mk
#
OBJS:=$(SRC_FILES:.cpp=.o)
DEPS:=$(OBJS:.o=.d)
## -MMD 可以用於自動生成頭文件依賴關係
%.o : %.cpp
$(CXX) $(CXXFLAGS) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -MT"$(@:%.o=%.d)" -c "$<" -o "$@"
ifneq "$(MAKECMDGOALS)" "clean"
-include $(DEPS)
endif
# static-library.mk
## 編譯生成obj文件的通用規則
include build/targets/object.mk
## 定義靜態庫文件的編譯規則
$(TARGET): $(OBJS)
$(AR) $(ARFLAGS) $@ $^
all: $(TARGET)
## 定義 目標clean,一般就是刪除所有obj文件,以及可執行文件。
clean:
$(RM) $(TARGET) $(OBJS) $(DEPS)
上面的AR,ARFLAGS就可以定義在platforms/platform.mk中。
使用時,如果是編譯生成靜態庫文件,那麼只要將TARGET改爲hello.a, 同時將include build/targets/executable.mk 改爲include build/targets/static-library.mk即可
今天的工作到此爲止