圖片播放器(一):Makefile
阿新 • • 發佈:2018-11-16
頂層Makefile解析(隨工程而變):
CROSS_COMPILE = #指定編譯器種類 AS = $(CROSS_COMPILE)as LD = $(CROSS_COMPILE)ld #連結工具 CC = $(CROSS_COMPILE)gcc #編譯工具 CPP = $(CC) -E AR = $(CROSS_COMPILE)ar #打包工具 NM = $(CROSS_COMPILE)nm STRIP = $(CROSS_COMPILE)strip #優化工具 OBJCOPY = $(CROSS_COMPILE)objcopy OBJDUMP = $(CROSS_COMPILE)objdump export AS LD CC CPP AR NM #將定義的變數匯出,方便其他makefile使用 export STRIP OBJCOPY OBJDUMP #將定義的變數匯出,方便其他makefile使用 CFLAGS := -Wall -O2 -g #編譯器引數 CFLAGS += -I $(shell pwd)/include #指定編譯器標頭檔案(根據實際專案手動修改) LDFLAGS := -lm -lfreetype -lvga #指定編譯器連結庫(根據實際專案手動修改) export CFLAGS LDFLAGS #將定義的變數匯出,方便其他makefile使用 TOPDIR := $(shell pwd) #獲得當前程式的頂層目錄 export TOPDIR #輸出頂層目錄 TARGET := XXXXXXX #編譯後的程式名(根據實際專案手動修改) #-------------------------頂層要生成的.o檔案以及頂層資料夾(根據實際專案手動修改)------------ obj-y += main.o obj-y += display/ obj-y += draw/ obj-y += encoding/ obj-y += fonts/ #--------------------------------------------頂層的第一個規則(預設規則)-----------------all : make -C ./ -f $(TOPDIR)/Makefile.build #進入當前目錄,使用頂層的makefile.build進行編譯 $(CC) $(LDFLAGS) -o $(TARGET) built-in.o #將編譯好的built-in.o檔案連結生成我們的目標檔案 #------------------------------------------------頂層的清除規則------------------- clean: rm -f $(shell find -name "*.o") #刪除所有的.o檔案 rm -f $(shell find -name "*.d") #刪除所有的.d檔案 rm -f $(TARGET) #刪除目標檔案 .PHONY:all clean
頂層Makefile.build解析(無需改動):
PHONY := __build #定義一個PHONY變數
__build: #開頭說明__build偽目標,使其成為Makefile.build的第一個目標
obj-y := #定義當前目錄的目標變數,初始值為空
subdir-y := #定義當前目錄的子目錄變數,初始值為空
include Makefile #將當前目錄的Makefile包含進來,初始化obj-y
#obj-y:=a.o b.o c/ d/
__subdir-y := $(patsubst %/,%,$(filter %/, $(obj-y))) #篩選出當前目錄的目標變數中的子目錄,並且去掉/
#$(filter %/, $(obj-y)):c/ d/
#__subdir-y:c d
subdir-y += $(__subdir-y) #將開始定義的subdir-y賦值為__subdir-y
#subdir-y:c d
subdir_objs := $(foreach f,$(subdir-y),$(f)/built-in.o) #對於subdir-y裡面的每一個值(目錄),增加一個相應的目錄/built-in.o的變數值
#subdir_objs:c/built-in.o d/built-in.o
cur_objs := $(filter-out %/, $(obj-y)) #得到obj-y中的.o檔案
#cur_objs:a.o b.o
dep_files := $(foreach f,$(cur_objs),.$(f).d) #對於所有的.o檔案,定義它的依賴檔名
#dep_files: .a.d .b.d
dep_files := $(wildcard $(dep_files))
ifneq ($(dep_files),) #根據依賴檔名,判斷依賴檔案是否存在,存在就包含就來
include $(dep_files)
endif
PHONY += $(subdir-y) #將$(subdir-y)也加入到變數PHONY中
--------------------------------------------Makefile. build的第一個規則--------------------------------------------
__build : $(subdir-y) built-in.o #第一個規則
$(subdir-y): #第一個規則的第一個依賴規則
make -C [email protected] -f $(TOPDIR)/Makefile.build #依次進入該子目錄變數裡面儲存的值,使用的Makefile.build進行編譯
built-in.o : $(cur_objs) $(subdir_objs) #第一個規則的第二個依賴規則
$(LD) -r -o [email protected] $^ #該規則的命令:將該目錄下的.o和$(subdir_obj)打包成built-in.o檔案
dep_file = [email protected] #
%.o : %.c #第一個規則的第二個依賴規則的依賴規則
$(CC) $(CFLAGS) -Wp,-MD,$(dep_file) -c -o [email protected] $< #用於將目錄下所有的.c檔案編譯成.o檔案
.PHONY : $(PHONY) #將PHONY宣告為偽目標
子目錄Makefile(隨工程而變):
子目錄的Makefile就是包含該目錄下所有的目標檔名和子目錄資料夾名。
例如任何一個子目錄可寫成:
objs-y := a.o
objs-y += b.o
objs-y += c/
objs-y += d/