功能" patsubst"在Makefile中

时间:2015-08-24 06:54:17

标签: makefile gnu-make

来自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,可能或可能 "折叠"所有的空白都变成了一个单一的空白。

或者,我做错了什么。

1 个答案:

答案 0 :(得分:12)

事实上,所有问题都在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后,有趣的事情是:

所以这就是行为:

  1. 如果%中没有pattern,则这是一个简单的替换(保留空格)。
  2. 否则它会按字词分割text并删除所有空格(使用isblank功能)。
  3. 最后,它进行了替换