makefile常用函数

1、 subst函数

格式:$(subst <from>, <to>, <text>)
功能:把字串<text>中的<from>字符串替换成<to>
返回:函数返回被替换过后的字符串。

示例:
  $(subst a,the,There is a big tree)
  把“There is a big tree”中的“a”替换成“the”,返回结果是“There is the big tree”。

2、strip函数

格式:$(strip <string> )
功能:去掉<string>字串中开头和结尾的空字符,并将中间的多个连续空字符(如果有的话)合并为一个空字符。
返回:返回被去掉空格的字符串值。
说明:空字符包括 空格,tab等不可显示的字符

示例:
str1 := abc
str2 := abc 
str3 := a     b     c

all:
@echo $(strip $(str1))
@echo $(strip $(str2))
@echo $(strip $(str3))

输出结果:
abc
abc
a b c

3、filter函数
格式:$(filter PATTERN…,TEXT) 
功能:过滤掉字串“TEXT”中所有不符合模式“PATTERN”的单词,保留所有符合此模式的单词。可以使用多个模式,存在多个模式时,模式表达式之间使用空格分割。 模式中一般需要包含模式字符“%”。
返回:空格分割的“TEXT”字串中所有符合模式“PATTERN”的字串。 
说明:“filter”函数可以用来去除一个变量中的某些字符串。

示例: 
sources := foo.c bar.c baz.s ugh.h 
foo: $(sources) 
cc $(filter %.c %.s,$(sources)) -o foo

使用“$(filter %.c %.s,$(sources))”的返回值给 cc 来编译生成目标“foo”,函数返回
值为“foo.c bar.c baz.s”

4、patsubst函数
格式:$(patsubst <pattern>,<replacement>,<text> ) 
名称:模式字符串替换函数patsubst。
功能:查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>,如果匹配的话,则以<replacement>替换。这里,<pattern>可以包括通配符“%”,表示任意长度的字串。如果<replacement>中也包含“%”,那么,<replacement>中的这个“%”将是<pattern>中的那个“%”所代表的字串。(可以用“”来转义,以“\%”来表示真实含义的“%”字符)
返回:函数返回被替换过后的字符串。

示例:
$(patsubst %.c,%.o,x.c.c bar.c)

把字串“x.c.c bar.c”符合模式[%.c]的单词替换成[%.o],返回结果是“x.c.o bar.o”

5、filter函数
格式:$(filter <pattern...>,<text> )
名称:过滤函数filter。 
功能:以<pattern>模式过滤<text>字符串中的单词,保留符合模式<pattern>的单词。可以有多个模式。存在多个模式时,模式表达式之间使用空格分割。
返回:返回符合模式<pattern>的字串。 
示例:
sources := foo.c bar.c baz.s ugh.h 
foo: $(sources) 
cc $(filter %.c %.s,$(sources)) -o foo

$(filter %.c %.s,$(sources))返回的值是“foo.c bar.c baz.s”。

6、filter-out函数
格式:$(filter-out <pattern...>,<text> )
名称:反过滤函数filter-out。 
功能:以<pattern>模式过滤<text>字符串中的单词,去除符合模式<pattern>的单词。可以有多个模式。存在多个模式时,模式表达式之间使用空格分割。
返回:返回不符合模式<pattern>的字串。 
示例:
objects=main1.o foo.o main2.o bar.o 
mains=main1.o main2.o

$(filter-out $(mains),$(objects)) 返回值是“foo.o bar.o”。

7. dir

$(dir <names...>)

    名称:取目录函数——dir。
    功能:从文件名序列<names>中取出目录部分。目录部分是指最后一个反斜杠(“/”)之前的部分。如果没有反斜杠,那么返回“./”。
    返回:返回文件名序列<names>的目录部分。
    示例: $(dir src/foo.c hacks)返回值是“src/ ./”。

8. foreach

 $(foreach <var>,<list>,<text>)


这个函数的意思是,把参数<list>;中的单词逐一取出放到参数<var>;所指定的变量中,然后再执行< text>;所包含的表达式。每一次<text>;会返回一个字符串,循环过程中,<text>;的所返回的每个字符串会以空格分隔,最后当整个循环结束时,<text>;所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。

9. addprefix

$(addprefix fixstring,string1 string2 ...)
fixstring表示任意要添加的固定前缀,在逗号的后面可以是一个或多个要添加前缀的子字符串,多> 个子字符串之间用空格隔开

10. vpath比VPATH更灵活

1)、vpath PATTERN DIRECTORIES 
为符合模式“PATTERN”的文件指定搜索目录“DIRECTORIES”。多个目录使用空格或者
冒号(:)分开。类似上一小节的“VPATH” 
2)、vpath PATTERN 
清除之前为符合模式“PATTERN”的文件设置的搜索路径

Makefile中所有文件的搜索路径,包括依赖文件和目标文件。 
变量“VPATH”的定义中,使用空格或者冒号(:)将多个目录分开。make 搜索的目录顺序
按照变量“VPATH”定义中顺序进行(当前目录永远是第一搜索目录)。

VPATH = src:../headers

它指定了两个搜索目录,“src”和“../headers”。对于规则“foo:foo.c”如果“foo.c”在“src”
目录下,此时此规则等价于“foo:src:/foo.c”

原文地址:https://www.cnblogs.com/fengtai/p/12640473.html