引用变量的格式为$(变量名)
,函数调用的格式如下:
$(<function> <arguments>) 或者是 ${<function> <arguments>}
其中,function 是函数名,arguments 是函数的参数,参数之间要用逗号分隔开。而参数和函数名之间使用空格分开。调用函数的时候要使用字符“$”,后面可以跟小括号也可以使用花括号。
$(call <expression>,<parm1>,<parm2>,<parm3>,...)
call 函数是唯一一个可以用来创建新的参数化的函数。我们可以用来写一个非常复杂的表达式,这个表达式中,我们可以定义很多的参数,然后你可以用 call 函数来向这个表达式传递参数。
当 make 执行这个函数的时候,expression
参数中的变量$(1)、$(2)、$(3)等,会被参数parm1
,parm2
,parm3
依次取代。而expression
的返回值就是 call 函数的返回值。
实例 1:
reverse = $(1) $(2)
foo = $(call reverse,a,b)
all:
@echo $(foo)
那么,foo 的值就是“a b”。当然,参数的次序可以是自定义的,不一定是顺序的,
实例 2:
reverse = $(2) $(1)
foo = $(call reverse,a,b)
all:
@echo $(foo)
此时的 foo 的值就是“b a”。
1. 变量的引用
1.1 变量定义为直接展开式
如果这里将VARIABLE1定义为直接展开式,最终调用call函数后,返回值为空
我的理解是,直接展开式在定义时将(1)和(1)和(2)展开,而此时它们的值为空,所以变量的值为空.当执行到call函数时,尽管带上了需要传递的参数,但PARAM((1)和(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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)