我正在尝试将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=.
(两者都是点)。当前目录包含适当的*_shipped
文件。
答案 0 :(得分:4)
我的猜测是$(obj)/%: $(src)/%_shipped
符合match-anything pattern rule的条件。 (手册中没有提到如何处理目录组件的目标和先决条件,但它是有意义的。)
请注意手册中的以下内容:
非终端匹配任何规则不能应用于指示特定数据类型的文件名。如果某些非匹配任何隐式规则目标与其匹配,则文件名表示特定类型的数据。
由于已经存在用于创建.c
文件的内置隐式规则(例如,使用解析器生成器),因此永远不会考虑match-anything规则。
内核makefile没有发生错误的原因是它们使用make
运行-r
,这消除了内置的隐式规则。通过设置MAKEFLAGS
变量:
# 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
给出了
制作:***没有规则可以制作目标' test.c'。停止。
第一行显示" building"代替。