Makefile 函数

函数使用方式

函数的使用类似变量是使用,语法

$(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函数执行的次数比你想像的多得多。

原文地址:https://www.cnblogs.com/w-smile/p/12519923.html