call函數(shù)是唯一一個(gè)可以創(chuàng)建定制化參數(shù)函數(shù)的引用函數(shù)。
支持對自定義函數(shù)的引用;
支持將一個(gè)變量定義為一個(gè)復(fù)雜的表達(dá)式,用call函數(shù)根據(jù)不同的參數(shù)對它進(jìn)行展開來獲取不同的結(jié)果;
函數(shù)語法:
$(call VARIABLE,PARAM,PARAM,...)
函數(shù)功能:
在執(zhí)行時(shí),將它的參數(shù)"PARAM"依次賦給臨時(shí)變量"$(1)","$(2)".call對參數(shù)的數(shù)目沒有限制壤躲,也可以沒有參數(shù)值溜哮。
最后再對VARIABLE展開后的表達(dá)式進(jìn)行處理.
函數(shù)返回值:
VARIABLE展開后的表達(dá)式的值
函數(shù)說明:
1. 變量VARIABLE在定義時(shí)最好定義為遞歸展開式;
2. call函數(shù)中對VARIABLE的調(diào)用,直接給函數(shù)或變量名就好了袁余,不要用"$";
3. 多個(gè)PARAM使用逗號分割開,且逗號和PARAM之間不能有空格,否則會導(dǎo)致解析異常;(PS:我自己在這個(gè)挖過坑,因?yàn)榱?xí)慣c編碼時(shí)粉洼,在逗號后面加一個(gè)空格)
1. 變量的引用
1.1 變量定義為直接展開式
如果這里將VARIABLE1定義為直接展開式,最終調(diào)用call函數(shù)后,返回值為空
我的理解是,直接展開式在定義時(shí)將(2)展開,而此時(shí)它們的值為空,所以變量的值為空.當(dāng)執(zhí)行到call函數(shù)時(shí)叶摄,盡管帶上了需要傳遞的參數(shù),但PARAM(
(2))之前已經(jīng)被展開了,故此時(shí)已經(jīng)取不到傳遞進(jìn)來的參數(shù)值.
VARIABLE1 := $(2) $(1)
$(info 1-$(VARIABLE1))
aa=$(call VARIABLE1,hello,world)
$(info 1-$(aa))
all:
@echo Done
1.2 變量定義為遞歸展開式
VARIABLE1 = $(2) $(1)
$(info 2-$(VARIABLE1))
aa=$(call VARIABLE1,hello,world)
$(info 2-$(aa))
all:
@echo Done
這里變量類型的定義再羅嗦一下,所謂的直接展開式,即在定義的時(shí)候立即展開;遞歸展開式,在定義的時(shí)候其實(shí)相當(dāng)于聲明,只有在實(shí)際引用時(shí)才展開.
2. 函數(shù)的引用
2.1 不帶參數(shù)的函數(shù)引用
define FUNC1
$(info echo 3-"hello")
endef
$(call FUNC1)
all:
@echo Done
2.2 帶參數(shù)的函數(shù)引用
define FUNC1
$(info echo 4-$(1) $(2))
endef
$(call FUNC1,hello,wolrd)
all:
@echo Done
2.3 逗號和參數(shù)之間有空格的示例
define FUNC1
$(info echo 5-$(1) $(2))
endef
$(call FUNC1, hello, wolrd)
all:
@echo Done
從執(zhí)行的結(jié)果會發(fā)現(xiàn),逗號和參數(shù)之間的空格也被作為參數(shù)的一部分.在這個(gè)例子中可能看不出明顯的負(fù)面影響,后面我在舉個(gè)栗子.