来自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;。
同意?
答案 0 :(得分:0)
是的,确实如此。
您的示例中的问题是您正在混合和匹配单冒号和双冒号配方。明确不允许这样做,您需要为所有匹配规则执行一个或另一个。
此外,使用不同的模式并不符合相同的目标,并且通常会运行最具体的匹配并忽略其他匹配(即使示例中的零宽度匹配可能存在)。