在 makefile 中是支持函数的概念的,make 解释器提供了一系列的函数供 makefile 调用。在 makefile 中支持自定义函数实现,并调用执行;提供 define 关键字实现自定义函数。下面是自定义函数的语法
我们再来深入地看看自定义函数,自定义函数是一个多行变量,无法直接调用;其次自定义函数是一种过程调用,没有任何的返回值;自定义函数用于定义命令集合,并应用规则中。下来我们还是以代码为例来进行说明
.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 var := $(call func1) new := $(func1) test : @echo "new => $(new)" @echo "var => $(var)" $(call func1) #@echo My name is func1 $(call func2, D.T.Software, delphi_tang)
我们来看看编译结果
我们看到 new 变量只打印了前面的,并么有打印 func1,因为自定义函数其本质是过程调用,没有任何的返回值;而 var 前面加了 call,因此它会输出函数名 func1。在直接进行 call func1 时,打印便是定义的字符串,它的参数 0 是函数名;call func2 时,加了两个参数,因此参数 1 为 D.T.Software,参数 2 为 delphi_tang。下来我们来看看预定义函数的调用,格式如下
那么自定义函数和预定义函数的调用形式为何完全不同呢?我们来分析下 makefile 中的预定义函数,其实在 makefile 中是不支持真正意义上的自定义函数的,自定义函数的本质是多行变量;预定义的 call 函数在调用时将参数传递给多行变量,自定义函数是 call 函数的实参,并在 call 中被执行。
下来我们还是以代码为例来进行说明
.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)"
程序中的 abspath 是输出当前目录的绝对路径,我们来看看结果
我们看到 var1 和 var2 定义的分别是个自定义函数,因此输出函数名;而 var3 是输出当前目录的绝对路径,var4 是输出当前目录下的 test.cpp 路径。结果也正是这样的。通过对 makefile 中的函数定义及调用的学习,总结如下:1、make 解释器提供了一系列的函数供 makefile 调用;2、自定义函数是一个多行变量,无法直接调用;3、自定义函数用于定义命令集合,并应用于规则中;4、预定义的 call 函数在调用时将参数传递给多行变量;5、自定义函数是 call 函数的实参,并在 call 中被执行。
欢迎大家一起来学习 makefile 语言,可以加我QQ:243343083。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。