makefile之call函数

call函数是唯一一个可以创建定制化参数函数的引用函数。
支持对自定义函数的引用;
支持将一个变量定义为一个复杂的表达式,用call函数根据不同的参数对它进行展开来获取不同的结果;

函数语法:
$(call VARIABLE,PARAM,PARAM,...)

函数功能:
在执行时,将它的参数"PARAM"依次赋给临时变量"$(1)","$(2)".call对参数的数目没有限制,也可以没有参数值。
最后再对VARIABLE展开后的表达式进行处理.
函数返回值:
VARIABLE展开后的表达式的值
函数说明:
1. 变量VARIABLE在定义时最好定义为递归展开式;
2. call函数中对VARIABLE的调用,直接给函数或变量名就好了,不要用"$";
3. 多个PARAM使用逗号分割开,且逗号和PARAM之间不能有空格,否则会导致解析异常;(PS:我自己在这个挖过坑,因为习惯c编码时,在逗号后面加一个空格)

1. 变量的引用

1.1 变量定义为直接展开式

如果这里将VARIABLE1定义为直接展开式,最终调用call函数后,返回值为空
我的理解是,直接展开式在定义时将\((1)和\)(2)展开,而此时它们的值为空,所以变量的值为空.当执行到call函数时,尽管带上了需要传递的参数,但PARAM(\((1)和\)(2))之前已经被展开了,故此时已经取不到传递进来的参数值.

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

这里变量类型的定义再罗嗦一下,所谓的直接展开式,即在定义的时候立即展开;递归展开式,在定义的时候其实相当于声明,只有在实际引用时才展开.

2. 函数的引用

2.1 不带参数的函数引用

define FUNC1
$(info echo 3-"hello")
endef
$(call FUNC1)
all:
    @echo Done

2.2 带参数的函数引用

define FUNC1
$(info echo 4-$(1) $(2))
endef

$(call FUNC1,hello,wolrd)

all:
    @echo Done

2.3 逗号和参数之间有空格的示例

define FUNC1
$(info echo 5-$(1) $(2))
endef

$(call FUNC1, hello, wolrd)

all:
    @echo Done

从执行的结果会发现,逗号和参数之间的空格也被作为参数的一部分.在这个例子中可能看不出明显的负面影响,后面我在举个栗子.

猜你喜欢

转载自www.cnblogs.com/black-mamba/p/9660226.html