不评估具有百分比符号的Makefile规则

时间:2015-03-30 14:38:51

标签: 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)

对我来说它看起来不错,它只适用于内核,但不适用于我的产品。

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

$(obj)/%c: $(src)/%c_shipped
    $(call cmd,shipped)

现在它的工作正常。

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

在我的情况下obj=.src=.(两者都是点)。当前目录包含适当的*_shipped文件。

1 个答案:

答案 0 :(得分:4)

我的猜测是$(obj)/%: $(src)/%_shipped符合match-anything pattern rule的条件。 (手册中没有提到如何处理目录组件的目标和先决条件,但它是有意义的。)

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

  

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

由于已经存在用于创建.c文件的内置隐式规则(例如,使用解析器生成器),因此永远不会考虑match-anything规则。

内核makefile没有发生错误的原因是它们使用make运行-r,这消除了内置的隐式规则。通过设置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给出了

  

制作:***没有规则可以制作目标' test.c'。停止。

第一行显示" building"代替。