【转】Makefile文本处理函数

接上一篇【转】Makefile的内嵌函数
摘自《GNU+Makefile中文手册》整理翻译:徐海兵

Makefile文本处理函数

以下是 GNU make 内嵌的文本(字符串)处理函数。

2.1 $(subst FROM,TO,TEXT)

函数名称:字符串替换函数— subst。

函数功能:把字串“ TEXT”中的“ FROM”字符替换为“ TO”。

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

示例:

$(subst ee,EE,feet on the street)

替换“ feet on the street”中的“ ee”为“ EE”,结果得到字符串“ fEEt on the strEEt”。

2.2 $(patsubst PATTERN,REPLACEMENT,TEXT)

函数名称:模式替换函数— patsubst。

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

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

函数说明:参数“ TEXT”单词之间的多个空格在处理时被合并为一个空格,并忽略前导和结尾空格。

示例:

$(patsubst %.c,%.o,x.c.c bar.c)

把字串“ x.c.c bar.c”中以.c 结尾的单词替换成以.o 结尾的字符。函数的返回结果是“ x.c.o bar.o”

本文的第六章在 变量的高级用法的第一小节 中曾经讨论过变量的替换引用,它是一个简化版的“ patsubst”函数在变量引用过程的实现。变量替换引用中:

$(VAR:PATTERN=REPLACEMENT)

就相当于:

$(patsubst PATTERN,REPLACEMENT,$(VAR))

而另外一种更为简单的替换字符后缀的实现:

$(VAR:SUFFIX=REPLACEMENT)

它等于:

$(patsubst %SUFFIX,%REPLACEMENT,$(VAR))

例如我们存在一个代表所有.o 文件的变量。定义为“ objects = foo.o bar.o baz.o”。为了得到这些.o 文件所对应的.c 源文件。我们可以使用以下两种方式的任意一个:

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

2.3 $(strip STRINT)

函数名称:去空格函数— strip。

函数功能:去掉字串(若干单词,使用若干空字符分割)“ STRINT”开头和结尾的空字符,并将其中多个连续空字符合并为一个空字符。

返回值:无前导和结尾空字符、使用单一空格分割的多单词字符串。

函数说明:空字符包括空格、 [Tab]等不可显示字符。

示例:

STR = a b c
LOSTR = $(strip $(STR))

结果是“a b c”。“strip”函数经常用在条件判断语句的表达式中,确保表达式比较的可靠和健壮!

2.4 $(findstring FIND,IN)

函数名称:查找字符串函数— findstring。

函数功能:搜索字串“ IN”,查找“ FIND”字串。

返回值:如果在“ IN”之中存在“ FIND”,则返回“ FIND”,否则返回空。

函数说明:字串“ IN”之中可以包含空格、 [Tab]。搜索需要是严格的文本匹配。

示例:

$(findstring a,a b c)
$(findstring a,b c)

第一个函数结果是字“ a”;第二个值为空字符。

2.5 $(filter PATTERN…,TEXT)

函数名称:过滤函数— filter。

函数功能:过滤掉字串“ TEXT”中所有不符合模式“ PATTERN”的单词,保留所有符合此模式的单词。可以使用多个模式。模式中一般需要包含模式字符“ %”。存在多个模式时,模式表达式之间使用空格分割。

返回值:空格分割的“ TEXT”字串中所有符合模式“ PATTERN”的字串。

函数说明:“ filter”函数可以用来去除一个变量中的某些字符串,我们下边的例子中就是用到了此函数。

示例:

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

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

2.6 $(filter-out PATTERN…,TEXT)

函数名称:反过滤函数— filter-out。

函数功能:和“ filter”函数实现的功能相反。过滤掉字串“ TEXT”中所有符合模式“ PATTERN”的单词,保留所有不符合此模式的单词。可以有多个模式。存在多个模式时,模式表达式之间使用空格分割。

返回值:空格分割的“ TEXT”字串中所有不符合模式“ PATTERN”的字串。

函数说明:“ filter-out”函数也可以用来去除一个变量中的某些字符串,(实现和“ filter”函数相反)。

示例:

objects=main1.o foo.o main2.o bar.o
mains=main1.o main2.o
$(filter-out $(mains),$(objects))

实现了去除变量“ objects”中“ mains”定义的字串(文件名)功能。它的返回值为“ foo.o bar.o”。

2.7 $(sort LIST)

函数名称:排序函数— sort。

函数功能:给字串“ LIST”中的单词以首字母为准进行排序(升序),并取掉重复的单词。

返回值:空格分割的没有重复单词的字串。

函数说明:两个功能,排序和去字串中的重复单词。可以单独使用其中一个功能。

示例:

$(sort foo bar lose foo)

返回值为:“ bar foo lose” 。

2.8 $(word N,TEXT)

函数名称:取单词函数— word。

函数功能:取字串“ TEXT”中第“ N”个单词(“ N”的值从 1 开始)。

返回值:返回字串“ TEXT”中第“ N”个单词。

函数说明:如果“ N”值大于字串“ TEXT”中单词的数目,返回空字符串。如果“ N”为 0,出错!

示例:

$(word 2, foo bar baz)

返回值为“ bar”。

2.9 $(wordlist S,E,TEXT)

函数名称:取字串函数— wordlist。

函数功能:从字串“ TEXT”中取出从“ S”开始到“ E”的单词串。“ S”和“ E”表示单词在字串中位置的数字。

返回值:字串“ TEXT”中从第“ S”到“ E”(包括“ E”)的单词字串。

函数说明:
“ S”和“ E”都是从 1 开始的数字。

当“S”比“TEXT”中的字数大时,返回空。  
如果“E”大于“TEXT”字数,返回从“S”开始,到“ TEXT”结束的单词串。  
如果“S”大于“E”,返回空。  

示例:

$(wordlist 2, 3, foo bar baz)

返回值为:“ bar baz”。

2.10 $(words TEXT)

函数名称:统计单词数目函数— words。

函数功能:字算字串“ TEXT”中单词的数目。

返回值:“ TEXT”字串中的单词数。

示例:

$(words, foo bar)

返回值是“ 2”。所以字串“ TEXT”的最后一个单词就是: (word (words TEXT),TEXT)。

2.11 $(firstword NAMES…)

函数名称:取首单词函数— firstword。

函数功能:取字串“ NAMES…”中的第一个单词。

返回值:字串“ NAMES…”的第一个单词。

函数说明:“ NAMES”被认为是使用空格分割的多个单词(名字)的序列。函数忽略“ NAMES…”中除第一个单词以外的所有的单词。

示例:

$(firstword foo bar)

返回值为“ foo”。

函数“ firstword”实现的功能等效于“ $(word 1, NAMES…)”。

小结

以上 11 个函数是make内嵌的的文本处理函数。书写Makefile时可搭配使用来实现复杂功能。最后我们使用这些函数来实现一个实际应用。例子中我们使用函数“subst”和“patsbust”。Makefile中可以使用变量“ VPATH”(参考 4.5.1 一般搜索 (变量VPATH)一小节)来指定搜索路径。对于源代码所包含的头文件的搜索路径需要使用gcc的“-I”参数指定目录来实现,“ VPATH”罗列的目录是用冒号“ :”分割的。如下就是Makefile的片段:

VPATH = src:../includes
override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH)))

那么第二条语句所实现的功能就是“ CFLAGS += -Isrc –I../includes”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值