#Makefile#Makefile過程分析

make的執行過程分爲兩個階段。
第一階段:讀取所有的makefile文件(包括“MAKEFILES”變量指定的,指示符“include”指定的,以及命令行選項“-f”指定的makefile文件),內建所有的變量,明確規則和
隱含規則,並建立所有目標和依賴之間的依賴關係結構鏈表。
第二階段:根據第一個階段已經建立的依賴關係結構鏈表決定哪些目標需要更新,並使用對應的規則來重建這些目標。

理解make執行過程的兩個階段是很重要的。它能幫助我們更深入的瞭解執行過程中變量以及函數是如何被展開的。變量和函數的展開問題是書寫Makefile時容易犯錯誤和引起大家迷惑的地方之一。本節將對這些不同的結構的展開階段進行簡單的總結。首先,明確以下基本的概念;在make執行的第一階段中如果變量和函數被展開,那麼稱此展開是“立即”的,此時所有的變量和函數被展開在需要構建的結構鏈表的對應規則中。其他的展開稱之爲“延後”的,這些變量和函數不會被“立即”展開,而是知道後續某些規則需要使用時或者在make處理的第二階段它們纔會被展開。
一、變量取值
變量定義解析的規則如下:

IMMEDIATE = DEFERRED
IMMEDIATE ?= DEFERRED
IMMEDIATE := IMMEDIATE
IMMEDIATE += DEFERRED or IMMEDIATE
define

IMMEDIATE
DEFERRED
endif
當變量使用追加符(+=)時,如果此前這個變量時一個簡單變量(使用:=定義的)則認爲它是立即展開的,其他情況時都被認爲是“延後”展開的變量。
二、條件語句
所有使用到條件語句在產生分支的地方,make程序會根據預設條件將正確地分支展開。就是說條件分支的展開是“立即”的。其中包括:ifdef,ifeq,ifndef,ifneq 所確定的所有分支命令。
三、規則的定義
所有的規則在make執行時,都按照如下的模式展開:
IMMEDIATE:IMMEDIATE;DEFERRED
DEFERRED

其中,規則中目標和依賴如果引用其他的變量,則被立即展開。而規則的命令行中的變量引用會被延後展開。此模板適合所有的規則,包括明確規則、模式規則、後綴規則、靜態模式規則。

總結
make的執行過程如下:
1、一次讀取變量“MAKEFILES”定義的makefile文件列表
2、讀取工作目錄下的makefile文件(根據命名的查找順序“GNUmakefile”,“makefile”,“Makefile”,首先找到哪個就讀取哪個)
3、依次讀取工作目錄makefile文件中使用指示符“include”包含的文件
4、查找重建所有已讀取的makefile文件的規則(如果存在一個目標是當前讀取

的某一個makefile文件,則執行此規則重建此makefile文件,完成以後從第一步開始重新執行)
5、初始化變量值並展開那些需要立即展開的變量和函數並根據預設條件確定執行分支
6、根據“終極目標”以及其他目標的依賴管理建立依賴關係鏈表
7、執行除“終極目標”以外的所有目標的規則(規則中如果依賴文件中任一個文件的時間戳比目標文件新,則使用規則鎖定義的命令重建目標文件)
8、執行“終極目標”所在的規則

自我總結:
每個make命令在調用時都會執行上述過程(可以通過make -d來查看執行過程),比如在命令行調用make -C或者make -f等;如果一個依賴規則的變量在執行之前的文件並不存在,可以使用make -C或者make -f重新進入當前makefile,這樣所有的變量又會重新生成一次。

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