Linux 未计算带有百分比符号的生成文件规则

Linux 未计算带有百分比符号的生成文件规则,linux,makefile,Linux,Makefile,我正在尝试将linux内核的kconfig util移植到我的产品中 编译时,我遇到了下一个错误: make[6]: *** No rule to make target `zconf.tab.c', needed by `zconf.tab.o'. Stop. 我在Makefile.lib中找到了该文件的下一条规则 $(obj)/%: $(src)/%_shipped $(call cmd,shipped) 它看起来对我来说还可以,它只在内核中工作,但在我的产品中不起作用 然后,

我正在尝试将linux内核的kconfig util移植到我的产品中

编译时,我遇到了下一个错误:

make[6]: *** No rule to make target `zconf.tab.c', needed by `zconf.tab.o'.  Stop.
我在Makefile.lib中找到了该文件的下一条规则

$(obj)/%: $(src)/%_shipped
    $(call cmd,shipped)
它看起来对我来说还可以,它只在内核中工作,但在我的产品中不起作用

然后,我在上一条规则之后添加了另一条规则

$(obj)/%c: $(src)/%c_shipped
    $(call cmd,shipped)
现在它工作得很好

有人能解释一下原始规则有什么问题吗

在我的例子中,
obj=.
src=.
(两者都是点)。当前目录包含适当的
*.\u shipped
文件。

我猜
$(obj)/%:$(src)/%\u shipped
符合。(该手册没有提到如何处理目录组件的目标和先决条件,但它是有意义的。)

请注意手册中的以下内容:

非终端匹配规则不能应用于指示特定数据类型的文件名。如果某个不匹配的任何隐式规则目标与某个文件名匹配,则该文件名指示特定类型的数据

由于已经存在用于创建
.c
文件的内置隐式规则(例如使用解析器生成器),因此从不考虑匹配任何内容规则

内核makefile没有发生错误的原因是它们使用
-r
运行
make
,这消除了内置的隐式规则。通过设置
MAKEFLAGS
变量在顶级makefile中完成:

# Do not use make's built-in rules and variables
# (this increases performance and avoids hard-to-debug behaviour);
MAKEFLAGS += -rR
作为一个简单的实验,我创建了一个文件test.c_foo和以下makefile:

MAKEFLAGS += -r

%: %_foo
   @echo building
make test.c
不带第一行

make:**没有规则将目标设置为“test.c”。停下来


第一行打印“building”.

当规则在第一种情况下失败时,
make-d
的输出会说什么?+1,我有这个错误,但在命令行或makefile中设置标志对我没有帮助,现在我知道了为什么会发生这种情况,我将删除百分号。