函数使用方式
函数的使用类似变量是使用,语法
$(function arg1, arg2, arg3,...)
一、字符串函数
1.字符串替换
$(subst <from> ,<to>,<text>)
结果是str_from --> str_to (贪婪模式)
2.模式字符串替换
$(patsubst <pattern> ,<replacement>,<text>)
将符合模式pattern 的text内的部分替换成replacement内容(贪婪),%表示任意长度字符串 。
3.去除开头和结尾的空格
$(strip str)
4.查找字符串
$(findstr <find>,<in>)
在in中找到了就返回 find字符串 否则 返回空字符串。
5.过滤函数 过滤保留符合 模式的字符串
$(filter <pattern ... >,<text>) 可以有多个模式
eg:
sources := foo.c bar.c baz.s ugh.h
$(filter %.c %.s,$(sources))返回的值是“foo.c bar.c baz.s”
6.反过滤函数
$(filter-out <pattern ...>,<text>)
用法同上 结果相反 是要滤除符合模式的字符串
7.排序函数(常用来去除重复)
$(sort <list>)
eg:
$(sort foo bar lose)返回 “bar foo lose”
8.取单词
$(word <n>,<text>)
取字符串中的第n个单词,空格作为分割。
9.取单词串函数
$(wordlist <s>,<e>,<text>)
s 和 e是指字符串中的单词 index
10.统计单词个数
$(words <text>)
11.取首个单词
$(firstword <text>)
二、文件名操作函数
1.从文件路径名(/home/xxx/test/hello.c)中取出路径名/home/xxx/test/,支持文件名序列。
$(dir <names ... >)
2.单独取文件名函数,工作方式类似dir 但是它相反的是最终保留文件名 hello.c。
$(notdir <name ... >)
3.取后缀函数,同样是上面的 /home/xxx/test/hello.c 最后会返回 .c,多个文件序列 可能会返回 .h .c .c .s .lib 这种结果。
$(suffix <names ....>)
4.取前缀名,同suffix相反 他会去除后缀保留其他(例如 /home/xxx/test/hello)的返回。
$(basename <names ... >)
5.添加后缀,将suffix 后缀添加到 名字list中。
$(addsuffix <suffix>,<names ... >)
6.添加前缀,将prefix 加到后面字符串序列前。
$(addprefix <prefix>,<names ...>)
7.连接函数 同样支持多个 如果list1多个数多,则多出来的将保持不变 如果list2 多 则多出来的直接 附加在最终结果中。
$(join <list1>,<list2>) --> list1list2
三、循环控制
$(foreach <var>,<list>,<text>)
将参数list中的每个单词放到var中在执行 text中的表达式
eg: names = a b c d files := $(foreach n,$(names),$(n).o) $(files)= a.o b.o c.o d.o
四、分支
$(if <condition>,<then-part>) or $(if <condition>,<then-part>,<else-part>)
如果满足条件则执行 then部分 ,如果是后者 还可能执行 else部分
五、构造函数
$(call <expression>,<parm1>,<parm2>, ...)
expression为自定义表达式 参数的个数确定了 后面 parma的个数
而在 expression 中访问parm1 时使用$(1)
eg: reverse = $(1) $(2) foo = $(call reverse,a,b) foo = a b
如果 reverse = $(2) $(1) 则 foo = b a
六、变量祖籍查询函数
$(origin <var>)
返回
undefined :变量未定义
default :默认定义的参数
file:makefile中
command line:命令行
override:被override 指示符重新定义过
automatic:自动变量
七、shell函数
这个函数会生成一个新的shell程序来执行命令(并行),注意: Shell脚本在target里才有效,不能放在目标生成规则里
$(shell cmd parma ...)
这个函数会新生成一个Shell程序来执行命令,所以你要注意其运行性能,如果你的Makefile中有一些比较复杂的规则,并大量使用了这个函数,那么对于你的系统性能是有害的。特别是Makefile的隐晦的规则可能会让你的shell函数执行的次数比你想像的多得多。