曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 11817|回复: 0
打印 上一主题 下一主题

Makefile 中的 patsubst 和 filter 函数

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2010-12-6 19:49:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
filter 函数的使用形式如:
$(filter <pattern…>, <text>)
该函数的功能是,以 <pattern> 模式过滤 <text> 字符串中的单词,保留符合 <pattern> 模式的单词。
该函数的返回值是符合 <pattern> 模式的字符串。

patsubst 函数的使用形式如:
$(patsubst <pattern>, <replacement>, <text>)
该函数的功能是,查找 <text> 中的单词(这些单词以“空格”、“Tab”或“回车”,“换行”分隔)是否符合 <pattern> 中的模式,如果匹配,那么使用 <replacement> 替换。这里,<pattern> 可以包括通配符 “%” (表示任意长字符串)。如果 <replacement> 中也包含 “%” 符号,那么 <replacement> 中的 “%” 所代表的字符串就是 <pattern> 中的的那个字符串。若要使用 % 字符,那么要使用 ‘\’ 符号进行转义,即 “\%” 。
函数的返回值是替换过的字符串。
下面使用一个实例说明这两个函数的应用。下面的代码摘自内核源码树下顶层的 Makefile, 为了演示,做了一点修改:
init-y          := init/ test
drivers-y       := drivers/ sound/
net-y           := net/ test2
libs-y          := lib/
core-y          := usr/
vmlinux-dirs    := $(patsubst %/,%,$(filter %/, $(init-y) \
                     $(core-y) $(drivers-y) \
                     $(net-y) $(libs-y) ))
vmlinux-dirs2   := $(init-y) $(drivers-y) $(net-y) $(libs-y) $(core-y)
all:
        @echo vmlinux-dirs2: $(vmlinux-dirs2)
        @echo vmlinux-dirs: $(vmlinux-dirs)
运行输出:
linux-suse10:~/Makefile_test # make
vmlinux-dirs2: init/ test drivers/ sound/ net/ test2 lib/ usr/
vmlinux-dirs: init usr drivers sound net lib
由上面的vmlinux-dirs2 输出可见,所有变量内容都被输出。
对vmlinux-dirs 的输出,则体现了上述两个函数的应用。首先 filter 过滤掉了没有以 / 符号作为结尾的字符串;然后再经过 patsubst 函数过滤掉了所有以 / 符号结尾字符串中的 / 符号。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 05:54 , Processed in 0.078460 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表