define func1 @echo "my name is $(0)" endef define func2 @echo "my name is $(0)" @echo "Param => $(1)" endef
test : $(call func1) $(call func2, Kevin)
.PHONY : test define func1 @echo "my name is $(0)" endef define func2 @echo "my name is $(0)" @echo "Param 1 => $(1)" @echo "Param 2 => $(2)" endef # 调用 func1 ,返回值赋值给 var # 结果确是 fun1 多行变量的值 var := $(call func1) new := $(func1) test : @echo "var => $(var)" @echo "new => $(new)" $(call func1) # call 关键字调用函数 $(call func2,kevin,666) # func2 里面给参数在上面给出
book@www.100ask.org:/mnt/hgfs/100ask$ make var => @echo my name is func1 new => @echo my name is my name is func1 my name is func2 Param 1 => kevin Param 2 => 666
$(call func1)
作的两件事编程
$(0)
替换成 func1my name is func1
define 用于定义多行变量的,只不过这个多行变量能够在 call 的做用下看成自定函数使用,这个使用有限制,必须在规则中使用。
所以对于 var := $(call func1)
这样写是不会启动函数调用的结果的,仅仅把它func1 看成变量处理了 ubuntu
new 的值没有函数名,说明 call 的做用将实参值替换到对应的位置上去,这里就是 $(0)
函数
var := $(abspath ./) test : @echo "var => $(var)"
为何自定义函数和预约义函数的调用形式彻底不一样?spa
.PHONY : test define func1 @echo "my name is $(0)" endef func2 := @echo "my name is $(0)" test : $(call func1) $(call func2)
zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make my name is func1 my name is
func2 不是 call 处理的范畴code
.PHONY : test define func1 @echo "My name is $(0)" endef define func2 @echo "My name is $(0)" endef var1 := $(call func1) var2 := $(call func2) var3 := $(abspath ./) var4 := $(abspath test.cpp) test : @echo "var1 => $(var1)" @echo "var2 => $(var2)" @echo "var3 => $(var3)" @echo "var4 => $(var4)"
makefile 中真正意义上的函数调用都只能是预约义的函数调用,而自定义的函数调用在本质上是不存在的,仅仅是模拟上的行为blog