功能“;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最后请看我的编辑。您是对的,当
    模式
    具有
    %
    时,在进行替换之前有效地去除了空格字符。