Makefile中給變量賦值:
= 是遞歸展開式變量
value1 = 5
value2 = $(value1)
value1 = 6
最終$(value2)就變成了6
:= 是直接展開式變量
value1 := 5
value2 := $(value1)
value1 :=6
最終$(value2)是5
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表示延后展開
第一階段:讀取所有的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表示延后展開