gpt4 book ai didi

makefile - Makefile中的函数“patsubst”

转载 作者:行者123 更新时间:2023-12-03 20:45:17 25 4
gpt4 key购买 nike

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可能会也可能不会将所有空白“折叠”成一个空白。

或者,我做错了什么。

最佳答案

实际上,所有内容都在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函数)。
最后,它做替换

关于makefile - Makefile中的函数“patsubst”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32176074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com