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

3
我正在查看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)

虽然我对Makefiles并不是很熟悉,但我从未见过类似 A: B: C 的规则。起初我认为这意味着 C 是目标 B 的正常和仅顺序先决条件的前提条件列表,而 B 的目标是 A 的前提条件,但我意识到这不可能是正确的,因为(我认为)Make没有一些隐式规则来从其他.o文件生成.o文件。这种语法是什么意思?

你看过Make手册了吗? - Oliver Charlesworth
我现在还在查看中,但是我还没有遇到过这种形式的东西。 - Alex W
2
好的,就像魔术一样,我实际上已经到达了关于静态模式规则的部分。我想知道是否有某种普遍的法则,规定了当我让自己看起来像个傻瓜之后,寻找答案的关键总是出现。 - Alex W
如果你找到了答案,最好回答这个问题。(为了帮助其他人。) - this
2
这是类似于这个现象:https://en.m.wikipedia.org/wiki/Rubber_duck_debugging - Oliver Charlesworth
1个回答

3
如我在这个问题开放者的评论中所述,我在提问之后不久就找到了答案。这种语法在GNUMake文档中被记录为静态模式规则
基本上,语法的形式如下:
target: target-pattern: prerequisites-patterns

对于每个目标,都会将目标模式(B部分)应用于该目标。目标模式应包含1个“%”字符以匹配目标名称中的子字符串。目标模式中的其他字符用于在目标中匹配它们自己。匹配“%”(称为stem)的子字符串将用于替换先决条件模式中未转义的“%”字符的出现。以下是来自GNUMake文档的示例...

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接