功能“;patsubst";在Makefile中
来自:功能“;patsubst";在Makefile中,makefile,gnu-make,Makefile,Gnu Make,来自: $(patsubst模式、替换、文本) 查找文本中与模式和匹配的空格分隔的单词 用替换来替换它们。此处模式可能包含一个% 它充当通配符,匹配任意数量的任意字符 一言以蔽之。 ... 单词之间的空格折叠成单个空格字符; 前导和尾随空格将被丢弃 现在,给定一个makefile,是: #patsubst的模式不包含“%” foo:=$(patsubst x,y,x) #patsubst的模式不包含“%” 条形图:=$(patsubst x%,y,x) #变量“foo”是patsub
$(patsubst模式、替换、文本)
查找文本中与模式和匹配的空格分隔的单词 用替换来替换它们。此处模式可能包含一个
%
它充当通配符,匹配任意数量的任意字符
一言以蔽之。
...
单词之间的空格折叠成单个空格字符; 前导和尾随空格将被丢弃
现在,给定一个makefile,是:
#patsubst的模式不包含“%”
foo:=$(patsubst x,y,x)
#patsubst的模式不包含“%”
条形图:=$(patsubst x%,y,x)
#变量“foo”是patsubst模式的结果,该模式不包含“%”
#变量“bar”是patsubst模式的结果,该模式包含“%”
全部::
@echo'foo is:“$(foo)”'
@echo'条是:“$(条)”
执行时,我们得到:
foo是:“y”
酒吧是:“y”
因此,很明显,Make、may或maynot将所有空格“折叠”为一个单独的空格
或者,我做错了什么事。事实上,所有这些都在下面的章节中解释: 查找文本中以空格分隔的单词 表示必须用一个或多个空格分隔单词 。。。那个匹配模式 意味着它只选择与模式匹配的单词(可以包含一些空格) 。。。并用替换来替换它们 表示所选图案将被替换图案替换
$(patsubst x%,y%,xa xb xc)
# Will also be "ya yb yc"
一幅画抵得上千言万语 对于
模式=X
:
+---- SEPARATORS ----+
| |
+-------+-------+ +--------+------+
| | | |
X space space space X space space space x
| | |
+---------------------+---------------------+
|
PATTERNS
对于模式=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"
编辑:阅读之后,有趣的事情是:
- :功能
patsubst\u expand\u pat
- :功能
find\u next\u token
- :功能
next\u令牌
模式中没有%
,这是一个简单的替换(保留空格)
文本
,并去掉所有空格(使用函数)是的……你的最后一段。很容易看出,Make接受一个空字符串,作为
%
的匹配项,这与模式规则和模式特定变量相反。是的,%
-匹配规则在Make的各个功能中不一致。而且,我们是否都同意,%
匹配了空字符串(在我的示例中),并且只匹配了它。你已经证明了:)@JiCha很清楚,在你的例子中,%
匹配了输入字符串中的空格。并将有效地由输出字符串中的空字符串替换。我强烈反对。当模式
中存在%
时,$(patsubst模式、替换、文本)
的规则是:1)如果文本
在变量扩展后为空或呈现为空,则函数将始终扩展为空字符串。2) 如果,text
是非空的,那么如果它包含WS,那么首先拆分单词,有效地去除所有空白,然后根据每个参数进行模式匹配,其中匹配规则不要求%
匹配非空字符串。是的,这是语义学,但它很重要,正如你文章的最后一段所证明的那样。@JiCha最后请看我的编辑。您是对的,当模式
具有%
时,在进行替换之前有效地去除了空格字符。