makefile中有两类函数
- make提供了一系列的预定义函数给makefile使用
- 用户可以使用
define
自定义函数,并使用预定义的call
函数调用
预定义函数
make解释器的预定义函数有如下特点
- 提供了处理变量、文件名和命令的函数
- 函数有返回值,可以在调用的地方被替换成函数的返回结果
预定义函数的形式
var := $(func arg1, arg2, ...)
下面说明几个常用的预定义函数,其他的可以参考make的用户手册
$(addprefix PREFIX,NAMES…)
函数名称:加前缀函数— addprefix。
函数功能:为“NAMES…”中的每一个文件名添加前缀“PREFIX”。参数“NAMES…”是空格分割的文件名序列,将“SUFFIX”添加到此序列的每一个文件名之前。
返回值:以单空格分割的添加了前缀“PREFIX”的文件名序列。
示例:$(addprefix src/,foo bar)
返回值为“src/foo src/bar”。$(wildcard PATTERN)
函数名称:获取匹配模式文件名函数— wildcard
函数功能:列出当前目录下所有符合模式“PATTERN”格式的文件名。
返回值:空格分割的、存在当前目录下的所有符合模式“PATTERN”的文件名。
函数说明:“ PATTERN”使用shell可识别的通配符,包括“?”(单字符)、“*”(多字符)等。
示例:$(wildcard *.c)
返回值为当前目录下所有.c
源文件列表。call函数
call
函数是唯一一个可以创建定制化参数函数的引用函数。使用这个函数可以实现对用户自己定义函数引用。我们可以将一个变量定义为一个复杂的表达式,用call
函数根据不同的参数对它进行展开来获取不同的结果。
这也是下面要说的自定义函数的实现方式。函数的语法:$(call VARIABLE,PARAM,PARAM,...)
自定义函数
自定义函数本质上是多行变量,是自定义的命令的集合。它是在规则中被使用的一种过程调用,没有返回值。
define introduce
@echo "$(0)"
@echo "my name is $(1)"
endef
all :
$(call introduce,madpenguin)
.PHONY : all
上面例子的输出结果是
introduce
my name is madpenguin
makefile中不支持真正的自定义函数,从上面可以看出
- 自定义函数的本质是多行变量
- 预定义的
call
函数在调用时将参数传给多行变量 - 自定义的函数是
call
函数的实参,并在call
函数中被执行