Makefile中的"patsubst"功能

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)

编辑:阅读源代码后,有趣的事情是:

所以这是行为:

  1. 如果没有%pattern,这是一个简单的替代(其中保留的空间).
  2. 否则它会拆分text单词并删除所有空格(使用isblank函数).
  3. 最后,它做了替换