来自docs:
$(patsubst PATTERN,REPLACEMENT,TEXT)
在TEXT中查找与PATTERN和。匹配的空格分隔的单词 用REPLACEMENT替换它们。这里PATTERN可能包含%
充当通配符,匹配任意数量的任何字符 一句话。
...
单词之间的空格 折叠成单个空格 字符; 前导和尾随空格被丢弃。
现在,给定一个makefile,是:
# The pattern for patsubst, does NOT contain '%'
foo := $(patsubst x,y,x x x)
# The pattern for patsubst, does contain '%'
bar := $(patsubst x%,y,x x x)
# The variable 'foo', is a result from a patsubst-pattern, that did NOT contain a '%'
# The variable 'bar', is a result from a patsubst-pattern, that did contain a '%'
all ::
@echo 'foo is: "$(foo)"'
@echo 'bar is: "$(bar)"'
执行,我们得到:
foo is: "y y y"
bar is: "y y y"
因此,很明显,Make,可能或可能 不 "折叠"所有的空白都变成了一个单一的空白。
或者,我做错了什么。
答案 0 :(得分:12)
事实上,所有问题都在doc:
中进行了解释在TEXT中查找以空格分隔的单词...
表示一个或多个空格必须分隔单词。
...匹配PATTERN ......
表示只选择与模式匹配的单词(可以包含一些空格)。
...并用REPLACEMENT替换它们。
表示所选模式将被替换替换。
一张图片胜过千言万语。
PATTERN = X
:
+---- SEPARATORS ----+
| |
+-------+-------+ +--------+------+
| | | |
X space space space X space space space x
| | |
+---------------------+---------------------+
|
PATTERNS
PATTERN = X%
:
+---- SEPARATORS ---+
| |
+-+-+ +-+-+
| | | |
X space space space X space space space x
| | | | |
+------+-----+ +------+-----+ |
| | |
+--- PATTERNS ------+--------------+
有趣的事情:
当您在模式中使用%
字符时,您可以在替换中重复使用它,如下所示:
$(patsubst x%,y%,xa xb xc)
# Will be "ya yb yc"
但是当%
变量中有空格字符时,make会在替换中删除它们。
$(patsubst x%,y%,xa xb xc)
# Will also be "ya yb yc"
编辑:阅读source code后,有趣的事情是:
function.c +146
:函数patsubst_expand_pat
misc.c +337
:函数find_next_token
misc.c +325
:函数next_token
所以这就是行为:
%
中没有pattern
,则这是一个简单的替换(保留空格)。text
并删除所有空格(使用isblank功能)。