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才把把作为$字符。