Makefile中的patsubst和wildcard函数

时间:2022-02-17 19:49:28

在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能。make所支持的函数也不算很多,不过已经足够我们的操作了。函数调用后,函

数的返回值可以当做变量来使用。

1、函数的调用语法

函数调用,很像变量的使用,也是

$(<function> <arguments> )

或是

${<function> <arguments>}

<function>就是函数名,make支持的函数不多。<arguments>是函数的参数,参数间以逗号“,”分隔,而函数名和参数之间以“空格”分隔。函数调用以“$”开头,以圆括号或花括号把函数名和参数括起。感觉很像一个变量,是不是?函数中的参数可以使用变量,为了风格的统一,函数和变量的括号最好一样,如使用“$(subst a,b,$(x))”这样的形式,而不是“$(substa,b,${x})”的形式。因为统一会更清楚,也会减少一些不必要的麻烦。

讨论这两个函数缘于在工作中一项目中的Makefile的第一句就是这两个函数的组合,当时实在不懂,后来查看了一个GNU Makefile的手册才明白了,

OBJS := $(patsubst %.c,%.o,$(wildcard *.c))

函数wildcard:

在规则中,通配符会被自动展开。但在变量的定义和函数引用时,通配符将失效。这种情况下如果需要通配符有效,就需要使用函数“wildcard”,它的用法是:$(wildcardPATTERN...) 。在Makefile 中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空。需要注意的是:这种情况下规则中通配符的展开和上一小节匹配通配符的区别。

一般我们可以使用“$(wildcard *.c)”来获取工作目录下的所有的.c 文件列表。复杂一些用法;可以使用“$(patsubst%.c,%.o,$(wildcard *.c))”,首先使用“wildcard”函数获取工作目录下的.c 文件列表;之后将列表中所有文件名的后缀.c 替换为.o 。这样我们就可以得到在当前目录可生成的.o 文件列表。因此在一个目录下可以使用如下内容的Makefile 来将工作目录下的所有的.c 文件进行编译并最后连接成为一个可执行文件:

#sample Makefile

objects := $(patsubst %.c,%.o,$(wildcard *.c))

 

foo : $(objects)

cc -o foo $(objects)

函数patsubst:

模式替换函数 $(patsubst PATTERN,REPLACEMENT,TEXT)

搜索“TEXT”中以空格分开的单词,将否符合模式“TATTERN”替换

为“REPLACEMENT”。参数“PATTERN”中可以使用模式通配符“% ”,来代表一个单词中的若干字符。如果参数“REPLACEMENT”中也包含一个“% ”,那么“REPLACEMENT”中的“% ”将是“TATTERN”中的那个“% ”所代表的字符串。在“TATTERN”和“REPLACEMENT”中,只有第一个“% ”被作为模式字符来处理,之后出现的不再作模式字符(作为一个字符)。在参数中如果需要将第一个出现的“% ”作为字符本身而不作为模式字符时,可使用反斜杠“\ ”进行转义处理(转义处理的机制和使用静态模式的转义一致

返回值:替换后的新字符串。