Makefile学习5 - call和eval函数
一. 前言
call函数是一个可以定制化函数参数的引用函数,使用这个函数可以实现对用户自定义函数的引用。也可以将一个变量定义为一个复杂的表达式,用call函数根据不同的参数对他进行展开获得不同的结果。
eval对它的参数进行展开,展开的结果作为Makefile的一部分,eval函数根据其参数的关系,结构,对它们进行替换展开。
二. call和eval函数的区别
call函数只是根据不同的参数对表达式进行展开,并不执行表达式,其中变量值还是原来的值。eval函数也是对表达式进行展开,但是会对其中的变量值进行替换,其中的变量值会被重新赋值。举例如下:
call函数:
define test
foo:=$(1)
endef
$(warning $(call test,apple))
all:
@echo foo=$(foo).
结果:
test1.mk:8: foo:=apple
foo=.
从中可以看出,调用call函数已经生成了表达式foo:=apple,但是此时表达式还未运行,foo变量的值还并不是apple。
eval函数:
define test
foo:=$(1)
endef
$(warning $(eval $(call test,apple)))
all:
@echo foo=$(foo).
结果:
test2.mk:7:
foo=apple.
本例与上例的区别是在call的基础上多调用了eval函数,从结果中可以看出,变量foo的值已经是apple了。说明执行eval后,test函数已经执行了,其中的变量的值也做了相应的替换。
三. 总结
call函数的作用是能够函数的参数,并将函数内的表达式和变量进行展开,但是表达式和变量的值并不会发生改变,只是做了纯粹的展开而已。eval函数则不止对函数的表达式和变量展开,而且会将表达式和变量作相应的替换,变量的值会改变。