在Makefile中,是支持函数使用的,Makefile中的函数包括make解释器自身预定义的函数,同时也支持我们自己定义函数。
在Makefile中, 通过define关键字来实现函数的自定义,并以endef关键字结束,自定义函数使用预定义函数call调用,后边跟自定义函数名及参数。
自定义函数,不是真正的函数,本质上是多行命令,只是放在目标外部,通过命令进行调用。
(1)自定义函数格式
define 函数名cmd1cmd2... cmdn
endef
(2)调用格式
$(call 函数名, 参数1, 参数2 ...)
root@xingwei-virtual-machine:/home/xingwei/makefile/05# cat Makefile
.PHONY: testdefine fun1@echo "function name is:> ${0}"
endefdefine fun2@echo "function name is:> ${0}"@echo "param1 is:> $(1)"@echo "param2 is:> $(2)"
endeff1 := $(call fun1)
f2 := $(call fun2, Hello, 1111)test:@echo $(f1)@echo $(f2)$(call fun2, world, 2222)
Make的函数提供了处理文件名,变量和命令的函数,可以在需要的地方调用函数来处理指定的参数,函数再调用的地方被替换为处理结果。
(1)内置函数的调用格式
$(函数名 arg1, arg2...)
(2)为什么自定义函数和预定义函数的调用形式完成不同?
本质上,Makefile不支持真正意义上的自定义函数,自定义函数本质上是多行变量,预定义的call函数在调用时将参数传递给多行变量,自定义函数时call函数的参数,并在call中被执行。
以下只是少许内置函数,使用起来非常简单。
$
(abspath names…)
$
(wildcard pattern)
$
(addprefix prefix,names…)
$
(addsuffix suffix,names…)
…
root@xingwei-virtual-machine:/home/xingwei/makefile/05# cat Makefile
.PHONY: testtest:@echo $(abspath ./)@echo $(wildcard *.c)
关于使用,此处不再赘述,可参考以下文章:
(1)https://m.rookiew.com/mirrors/6947.html
(2)https://zhuanlan.zhihu.com/p/362917196?utm_id=0
(3)https://blog.csdn.net/oqqHuTu12345678/article/details/125617988
更多基于make的内置函数,请参考官方内置函数。