Makefile规则错误:***混合隐式和普通规则

时间:2012-02-20 05:50:04

标签: makefile

内核Makefile中的

# Modules                                                                                                                                                                               
/ %/: prepare scripts FORCE
    $(cmd_crmodverdir)
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
    $(build)=$(build-dir)
%.ko: prepare scripts FORCE
    $(cmd_crmodverdir)
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1)   \
    $(build)=$(build-dir) $(@:.ko=.o)
    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost

导致错误 Makefile混合隐式和普通规则。(对提供的代码的第一个字符串)

我认为 /%/ 语法有问题,我该如何修复它?

到目前为止,我正在考虑以这种方式分离规则:

# Modules                                                                                                                                                                               
/: prepare scripts FORCE
    $(cmd_crmodverdir)
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
    $(build)=$(build-dir)
%/: prepare scripts FORCE
    $(cmd_crmodverdir)
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
    $(build)=$(build-dir)
%.ko: prepare scripts FORCE
    $(cmd_crmodverdir)
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1)   \
    $(build)=$(build-dir) $(@:.ko=.o)
    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost

但这对我来说很困惑。

1 个答案:

答案 0 :(得分:3)

您认为/ %/规则做了什么(除了让您和make和我混淆)?你想用%/位做什么?

你可以在冒号的左边有两个(或更多)目标,但它们都需要是无百分比。

prog1 prog2: something
    $(CC) -o $@ $@.o ${LIBRARIES}

%元字符不能与没有任何%的规则一起使用,但make正在解释:

/ %/:

prog1 prog2示例类似,但其中一个目标有%而另一个没有,并且您不允许将它们混合起来。 /规则是明确的规则;它似乎是有关如何更新系统根目录的说明。 %/是隐含的规则;它可能正在做一些与使目录更新有关的事情。


从评论中复制一些材料:

DIRECTORY_BUILD_RULES = \
    $(cmd_crmodverdir); \
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) $(build)=$(build-dir)

/:  prepare scripts FORCE; $(DIRECTORY_BUILD_RULES)

%/: prepare scripts FORCE; $(DIRECTORY_BUILD_RULES)

这种表示法应该有效(这就是我在评论中使用它的原因),但我在makefile中写的是:

DIRECTORY_DEPENDENCIES = prepare scripts FORCE
DIRECTORY_BUILD_RULES = \
    $(cmd_crmodverdir); \
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) $(build)=$(build-dir)

/:  $(DIRECTORY_DEPENDENCIES)
    $(DIRECTORY_BUILD_RULES)

%/: $(DIRECTORY_DEPENDENCIES)
    $(DIRECTORY_BUILD_RULES)

如果这仍然会导致问题,请查看第一个(/:)规则的作用。你确定需要吗?