Makefile函数详解: subst与patsubst

需积分: 12 1 下载量 84 浏览量 更新于2024-09-09 收藏 190KB PDF 举报
"Makefile函数使用详解" 在Makefile中,函数是进行复杂文本操作和构建规则的关键元素。虽然Makefile支持的函数不多,但它们非常实用,可以帮助编写出更简洁、高效的构建脚本。以下是关于Makefile中两种主要字符串处理函数——`subst`和`patsubst`的详细介绍: 1. 字符串替换函数 —— `subst` `$(subst <from>,<to>,<text>)` 这个函数用于在文本 `<text>` 中将所有出现的 `<from>` 字符串替换为 `<to>`。例如,如果你有一个字符串 "feetonthestreet" 并想将所有的 "ee" 替换为 "EE",你可以这样写: ``` result := $(subst ee,EE,feetonthestreet) ``` 上述代码将返回 "fEEtonthestrEEt"。 2. 模式字符串替换函数 —— `patsubst` `$(patsubst <pattern>,<replacement>,<text>)` 这个函数会遍历 `<text>` 中的所有单词,检查它们是否匹配模式 `<pattern>`。如果匹配,单词会被 `<replacement>` 替换。这里的 `<pattern>` 可以包含通配符 `%`,它代表任意长度的字符串。如果 `<replacement>` 也包含 `%`,那么这个 `%` 将对应于 `<pattern>` 中的 `%` 所代表的字符串。要表示实际的百分号 `%`,需要使用 `\%` 进行转义。 例如,假设你有一个字符串 "x.c.cbar.c",你想将所有以 ".c" 结尾的单词替换为 ".o",你可以这样写: ``` result := $(patsubst %.c,%.o, x.c.cbar.c) ``` 这将返回 "x.c.obar.o"。 `patsubst` 与之前在变量章节中提到的变量替换类似。例如,`$(var:<pattern>=<replacement>)` 可以等同于 `$(patsubst <pattern>,<replacement>,$(var))`,而 `$(var:<suffix>=<replacement>)` 则等同于 `$(patsubst %<suffix>,%<replacement>,$(var))`。 假设你有一个变量 `sources := x.c y.c z.c`,并且你想将所有以 ".c" 结尾的源文件转换为相应的 ".o" 文件,你可以这样写: ``` objects := $(patsubst %.c,%.o,$(sources)) ``` 这将返回 "x.o y.o z.o"。 掌握这些字符串处理函数对于编写高效且灵活的Makefile至关重要。它们允许你在构建过程中进行复杂的文本操作,比如自动生成依赖关系,或者根据源文件的后缀生成目标文件名。通过熟练使用这些函数,可以使Makefile更加智能化,减少手动配置的工作量,提高自动化构建的效率。