前言
makefile中 支持函数的概念。
一、自定义函数
1. 自定义函数介绍
在 makefile 中支持自定义函数实现
,并调用执行。通过 define
关键字实现自定义函数。
- 自定义函数是一个多行变量,无法直接调用。
- 自定义函数是一种过程调用,没有任何的返回值。
- 自定义函数用于定义命令集合,并应用于规则中。
2. 自定义函数的语法:
define 函数名 # 函数内容 endef
示例: 可以定义单 多行命令。
对于 func2 ,函数体是 @echo “My name is $(0) .” @echo “Param => $(1)”。
$(0) 表示函数名称,在函数体中会被替换为 func2.
$(1) 表示第一个参数,在 下面函数调用时,可得参数。
3. 函数的调用:
test : $(call func1) $(call func2, 参数 1, 参数 2)
可以在 Makefile 中通过 $(call …) 来调用函数。
在上面的代码中,call 的作用是调用自定义函数 func1,func2 并将其返回值赋给变量 var。
call:
是 预定义函数,关于预定义函数下面会详细介绍。
语法 : $(call function-name,arg1,arg2,…)
其中,function-name 是函数的名称,arg1、arg2 等是函数的参数。
代码示例:
.PHONY : test # 声明伪目标 define func1 # 创建 自定义函数 @echo "My name is $(0)" endef define func2 @echo "My name is $(0)" # $(0) 为函数名 @echo "Parm 1 => $(1)" # $(1) 为参数1 @echo "Parm 2 => $(2)" # $(2) 为参数2 endef var := $(func1) # 没有调用 call 函数,则不会将 $(0) 替换为func1 new := $(call fun1) # $(call func1) 表示调用函数 func1,并将其返回值赋给变量 new test : @echo " var => $(var)" @echo " new => $(new)" $(call func1) $(call func2,hello,world) # func1 为函数名,hello 为参数1,world 为参数2
二、预定义函数
1. make 解释器中的预定义函数
make 及解析器提供一系列预定义函数供 makefile 调用。预定义函数在 Makefile 中内置,可以直接使用。
- make 的函数提供了处理文件名,变量 和 命令 的函数。
- 可以在需要的地方
调用函数来处理指定的参数
。 - 函数在
调用的地方被替换为处理结果
。
2. 预定义函数的调用:
这里的 函数名 是 预定义函数名。
示例:
.PHONY : test var := $(abspath ./) # 使用 abspath 函数获取当前目录的绝对路径 new := $(abspath test.cpp) # 使用 abspath 获取当前目录下 test.cpp 文件的绝对路径 test : @echo " var => $(var)" @echo " new => $(new)"
abspath函数:
是 Makefile 中的一个预定义函数,用于获取路径的绝对路径。
语法 : $(abspath names…)
names 表示一个或多个文件名或目录名。abspath 函数会将每个参数转换为绝对路径。
. / 表示当前目录。
3. 常见的预定义函数:
$(call func,arg1,…)
:调用函数函数,调用自定义或预定义函数并返回函数的值。$(wildcard pattern)
:查找文件名函数,返回匹配 pattern 模式的所有文件名。$(patsubst pattern,replacement,text)
:模式字符串替换函数,将 text 中所有匹配模式 pattern 的字符串替换为 replacement。$(shell command)
:执行 shell 命令函数,执行 command 命令并返回其输出结果。$(subst from,to,text)
:字符串替换函数,将 text 中所有的 from 替换为 to。
$(patsubst pattern,replacement,text)
:模式字符串替换函数,将 text 中所有匹配模式 pattern 的字符串替换为 replacement。
总结
下一节介绍 自动生成依赖关系。