Ji *_*Cha 15 makefile gnu-make
来自文档:
$(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)"'
Run Code Online (Sandbox Code Playgroud)
执行,我们得到:
foo is: "y y y"
bar is: "y y y"
Run Code Online (Sandbox Code Playgroud)
因此,很明显,Make,可能会或可能不会将所有空格"折叠"成一个单一的空白.
或者,我做错了什么.
jml*_*jml 14
事实上,所有内容都在文档中解释:
在TEXT中查找以空格分隔的单词...
意味着一个或多个空格必须分开单词.
...匹配PATTERN ...
意味着它只选择与模式匹配的单词(可以包含一些空格).
...并用REPLACEMENT替换它们.
表示所选模式将被替换替换.
一张图片胜过千言万语.
用于PATTERN = X:
+---- SEPARATORS ----+
| |
+-------+-------+ +--------+------+
| | | |
X space space space X space space space x
| | |
+---------------------+---------------------+
|
PATTERNS
Run Code Online (Sandbox Code Playgroud)
用于PATTERN = X%:
+---- SEPARATORS ---+
| |
+-+-+ +-+-+
| | | |
X space space space X space space space x
| | | | |
+------+-----+ +------+-----+ |
| | |
+--- PATTERNS ------+--------------+
Run Code Online (Sandbox Code Playgroud)
有趣的事情:
当您%在模式中使用该角色时,您可以在替换中重复使用它,如下所示:
$(patsubst x%,y%,xa xb xc)
# Will be "ya yb yc"
Run Code Online (Sandbox Code Playgroud)
但是当%变量中有空格字符时,make会在替换中删除它们.
$(patsubst x%,y%,xa xb xc)
# Will also be "ya yb yc"
Run Code Online (Sandbox Code Playgroud)
编辑:阅读源代码后,有趣的事情是:
function.c +146: 功能 patsubst_expand_patmisc.c +337: 功能 find_next_tokenmisc.c +325: 功能 next_token所以这是行为:
%在pattern,这是一个简单的替代(其中保留的空间).text单词并删除所有空格(使用isblank函数).