什么是makefile规则语法的形式" A:B:C"意思?

时间:2015-08-02 08:39:02

标签: c makefile cyanogenmod

我正在查看CyanogenMod代码,试图让设备运行最新版本。在build / core / binary.mk Makefile中,有一个如下规则:

$(gen_c_objects): $(intermediates)/%.o: $(intermediates)/%.c $(yacc_cpps) $(proto_generated_headers) \
$(LOCAL_ADDITIONAL_DEPENDENCIES) \
| $(my_compiler_dependencies)
    $(transform-$(PRIVATE_HOST)c-to-o)

虽然我对Makefile很陌生,但我从来没有见过A:B:C形式的规则。我认为它最初意味着C是先决条件列表(正常和仅订单)目标B的先决条件,B的目标是A的先决条件,但我意识到这是不可能的,因为(我不认为)Make没有一些隐含的生成规则.o来自其他.o文件的文件。

这种语法是什么意思?

1 个答案:

答案 0 :(得分:2)

正如我对这个问题开场白的评论所述,我在提出问题后不久就找到了答案。 GNUMake的文档将此语法记录为static pattern rule

基本上,语法的格式为

target: target-pattern: prerequisites-patterns

对于每个目标,目标模式(B部分)将应用于目标。目标模式应包含1'%'字符,以匹配目标名称中的子字符串。目标模式中的其他字符用于在目标中匹配自身。 '%'的匹配子字符串(称为词干)将用于替换先决条件模式中未转义的'%'字符的出现。建立GNUMake文档中的示例...

s.foo.o: s.%.o: %.c s.%.c

在这种情况下,目标s.foo.o将应用模式s。%。c。这意味着干将设置为“foo”。随后,将stem替换为先决条件列表以生成先决条件:foo.c和s.foo.c.上述语法等同于:

s.foo.o: foo.c s.foo.c