makefile call()函数 eval()函数

call() 函数


        语法: $(call <expression> , <parm1>, <parm2>, <parm3>,...)

        作用:当make执行时 expression 这个函数时,参数中的变量,如 $(1),$(2),$(3)等。会被参数<parm1>, <parm2>, <parm3>所代替。

注意了,这个 $(call <expression> , <parm1>) 就是 Makefile 对 <expression> , 函数的第一次求值。实际上求值出来的结果还是 Makefile 代码。 http://bbs.chinaunix.net/thread-2321462-3-1.html

“ call”函数是唯一一个可以创建定制化参数函数的引用函数。使用这个函数可以实现对用户自己定义函数引用。我们可以将一个变量定义为一个复杂的表达式,用“ call”函数根据不同的参数对它进行展开来获得不同的结果。 
函数功能:在执行时,将它的参数“ param”依次赋值给临时变量“ $(1)”、“ $(2)” call 函数对参数的数目没有限制,也可以没有参数值,没有参数值的“ call”没有任何实际存在的意义。执行时变量“ variable”被展开为在函数上下文有效的临时变量,
变量定义中的“ $(1)”作为第一个参数,并将函数参数值中的第一个参数赋值给它;变量中的“ $(2)”一样被赋值为函数的第二个参数值;依此类推(变量$(0)代表变量“ variable”本身)。之后对变量“ variable” 表达式的计算值。
返回值:参数值“ param”依次替换“ $(1)”、“ $(2)”…… 之后变量“ variable”定义的表达式的计算值。
函数说明: 1. 函数中“ variable”是一个变量名,而不是变量引用。因此,通常“ call”函数中的“ variable”中不包含“ $”(当然,除非此变量名是一个计算的变量名)。 2. 当变量“ variable”是一个 make 内嵌的函数名时(如“ if”、“ foreach”、“ strip”等),
对“ param”参数的使用需要注意,因为不合适或者不正确的参数将会导致函数的返回值难以预料。 3. 函数中多个“ param”之间使用逗号分割。 4. 变量“ variable”在定义时不能定义为直接展开式!只能定义为递归展开式。

函数示例:

reverse = $(2)$(1)
foo = $(call reverse,a,b)
all:
    @echo "foo=$(foo)"


执行结果:

foo=ba

eval() 函数


一句话可以概括 : 可以在Makefile中构建一个可变的规则结构关系。并执行相应代码:

函数示例:

OBJ=a.o b.o c.o d.o main.o

define MA
main:$(OBJ)
 gcc  -g -o main $$(OBJ)
endef 

$(eval $(call MA) )

执行结果:

cc -c -o a.o a.c

cc -c -o b.o b.c

cc -c -o c.o c.c

g++ -c -o d.o d.cpp

cc -c -o main.o main.c

gcc -g -o main a.o b.o c.o d.o main.o

请注意到$$(OBJ) ,因为make要把这个作为makefile的一行,要让这个地方出现$,就要用两个$,因为两个$,make才把把作为$字符。

http://bbs.chinaunix.net/thread-2321462-3-1.html

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值