Makefile a';%';在模式中是否匹配空字符串?

Makefile a';%';在模式中是否匹配空字符串?,makefile,gnu-make,Makefile,Gnu Make,来自: vpath模式是包含%字符的字符串。弦 必须与正在搜索的前提条件的文件名匹配, %字符匹配零个或多个字符的任意序列(如 在模式规则中) 现在,尽管%确实与vpath模式(vpath%foo)中的空字符串(长度为零的字符串)相匹配,但对于模式规则来说,情况并非如此 因此,将上述文档等同于以下内容是错误的: …与零个或多个字符的任意序列匹配的“%”字符(如下所示) 在模式规则中 因为这根本不是真的,正如下面的Makefile所示: all:: al%l: @回显“$@” 。 执行时

来自:

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



现在,尽管
%
确实与vpath模式(
vpath%foo
)中的空字符串(长度为零的字符串)相匹配,但对于模式规则来说,情况并非如此

因此,将上述文档等同于以下内容是错误的:

…与零个或多个字符的任意序列匹配的“%”字符(如下所示) 在模式规则中


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

all::
al%l:
@回显“$@”


执行时,我们得到:

#很明显,“all”与“al%l”不匹配
$make-r
make:对“所有人”都不做任何事情。
#但是,“所有”与“al%”匹配
$make-r-f makefile-f是的

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

此外,具有不同的模式并不符合作为同一目标的条件,最特定的匹配通常会运行,而忽略其他匹配(即使可能存在示例中的零宽度匹配)