# 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
但这对我来说很困惑。
答案 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)
如果这仍然会导致问题,请查看第一个(/:
)规则的作用。你确定需要吗?