makefile eval函数说明

  • 函数说明

函数“ eval”是一个比较特殊的函数。使用它可以在Makefile中构造一个可变的规则结构关系(依赖关系链),其中可以使用其它变量和函数。函数“ eval”对它的参数进行展开,展开的结果作为Makefile的一部分, make可以对展开内容进行语法解析。展开的结果可以包含一个新变量、目标、隐含规则或者是明确规则等。也就是说此函数的功能主要是:根据其参数的关系、结构,对它们进行替换展开。

  • 返回值

函数“ eval”的返回值时空,也可以说没有返回值。

  • 函数说明

“ eval”函数执行时会对它的参数进行两次展开。第一次展开过程发是由函数本身完成的,第二次是函数展开后的结果被作为Makefile内容时由make解析时展开的。明确这一过程对于使用“ eval”函数非常重要。理解了函数“ eval”二次展开的过程后。实际使用时,如果在函数的展开结果中存在引用(格式为: $(x)),那么在函数的参数中应该使用“ $$”来代替“ $”因为这一点,所以通常它的参数中会使用函数“ value” 来取一个变量的文本值。

  • 示例:

借用一下别人的示例:http://bbs.chinaunix.net/thread-2321462-3-1.html

pointer := pointed_value

define foo
var := 123
arg := $1
$$($1) := ooooo
endef

$(info $(call foo,pointer))
#$(info $(eval $(call foo,pointer)))
all:
	@echo "---------------------"
	@echo "var : $(var) arg: $(arg)"
	@echo "pointer: $(pointer), pointed_value:$(pointed_value)"
	@echo "---------------------"
	

在该makefile中,定义了一个foo函数,并且先把$(info $(eval $(call foo,pointer)))这一行注释掉,输出如下:

var := 123
arg := pointer
$(pointer) := ooooo
---------------------
var :  arg: 
pointer: pointed_value, pointed_value:
---------------------

可以看到,通过info打印出了前三行,说明info将后面的结果进行了宏展开打印,即这三行实际上并没有执行,$(call foo,pointer)产生的结果就是这三条语句,所以最后打印var、arg、和pointed_value都为空,接下来将该程序改为如下:

pointer := pointed_value

define foo
var := 123
arg := $1
$$($1) := ooooo
endef

#$(info $(call foo,pointer))
$(info $(eval $(call foo,pointer)))
all:
	@echo "---------------------"
	@echo "var : $(var) arg: $(arg)"
	@echo "pointer: $(pointer), pointed_value:$(pointed_value)"
	@echo "---------------------"
	

仅仅修改了注销的行,运行结果如下:

---------------------
var : 123 arg: pointer
pointer: pointed_value, pointed_value:ooooo
---------------------

可以看到,eval使之前没有执行的三条语句成功执行了,并得到了正确的结果。不过不加eval,call执行到将pointer替代foo函数中的$1就不再执行,而eval会继续执行展开后的程序,即二次展开。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值