通用makefile是如何煉成的(V)

話不多說,上一篇中提到了想把編譯規則集中到單獨的文件夾,今天就來做這個。同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即可

今天的工作到此爲止


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章