是'%'在模式匹配空字符串?

时间:2015-08-25 04:25:10

标签: makefile gnu-make

来自docs

  

vpath模式是包含%字符的字符串。字符串   必须匹配正在搜索的先决条件的文件名,   %字符匹配零个或多个字符的任何序列(如   在模式规则中)。



现在,虽然%确实与vpath模式中的 字符串(零长度字符串)匹配({{1} }),对于模式规则来说不是这样。

因此,上述文档的 错误 ,在它们之间进行等同,如下所示:

  

......'%'字符匹配零个或多个字符的任何序列(如   在模式规则中。


因为这不是真的,如下面的Makefile所示:

vpath % foo



执行,我们得到:

all ::

al%l :
    @echo '$@'



事实上,这很好documented

  

例如,# It is evident that 'all' doesn't match 'al%l' $ make -r make: Nothing to be done for 'all'. # But, 'all' does match 'al%' $ make -r -f makefile -f <(echo 'al% : ; echo $@') echo all all 作为模式匹配任何结尾的文件名   %.c.c作为模式匹配以s.%.c开头的任何文件名,   以s.结尾,长度至少为五个字符。 (必须有   至少一个与.c匹配的字符。)%的子字符串   匹配被称为&#34; stem&#34;。



同意?

1 个答案:

答案 0 :(得分:0)

是的,确实如此。

您的示例中的问题是您正在混合和匹配单冒号和双冒号配方。明确不允许这样做,您需要为所有匹配规则执行一个或另一个。

此外,使用不同的模式并不符合相同的目标,并且通常会运行最具体的匹配并忽略其他匹配(即使示例中的零宽度匹配可能存在)。