1. 程式人生 > >makefile中的“立即展開”與“延後展開”

makefile中的“立即展開”與“延後展開”

GUN make的執行過程分為兩個階段。

第一階段:讀取所有的makefile檔案(包括“MAKEFILES”變數指定的、指示符“include“指定的、以及命令列選項“-f(--file)“指定的makefile檔案),內建所有的變數、明確規則和隱含規則,並建立所有目標和依賴之間關係結構連結串列。

第二階段:根據第一階段已經建立的依賴關係結構連結串列決定哪些目標需要更新,並使用對應的規則來重建這些目標。

1.在make執行的第一階段如果變數和函式被展開,那麼稱此展開是“立即“的,其他的展開稱之為“延後“的。

2.變數定義解析規則如下:

IMMEDIATE=DEFERRED
IMMEDIATE?=DEFERRED
IMMEDIATE:=IMMEDIATE
IMMEDIATE+=DEFERRED or IMMEDIATE
define IMMEDIATE
        DEFERRED
Endef
當變數使用追加符(+=)時,如果此前這個變數是一個簡單變數(使用:=定義的)則認為它是立即展開的,其他情況時都被認為是“延後“展開的變數。

3.所有使用到條件語句在產生分支的地方,make程式會根據預設條件將正確的分支展開。即條件分支的展開是“立即“的。其中包括:“ifdef”、“ifeq“、”ifndef“和“ifneq“所確定的所有分支命令

4.所有的規則在make執行時,都按照如下的模式展開:

IMMEDIATE:IMMEDIATE;DEFERRED
        DEFERRED

注:上面的IMMEDIATE表示立即展開,DEFERRED表示延後展開