Linux 未计算带有百分比符号的生成文件规则
我正在尝试将linux内核的kconfig util移植到我的产品中 编译时,我遇到了下一个错误: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) 它看起来对我来说还可以,它只在内核中工作,但在我的产品中不起作用 然后,
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中设置标志对我没有帮助,现在我知道了为什么会发生这种情况,我将删除百分号。