1. 程式人生 > >圖片播放器(一):Makefile

圖片播放器(一):Makefile

頂層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/