"A : B : C" 形式的 makefile 规则语法是什么意思?
What does a makefile rule syntax of the form "A : B : C" mean?
我正在查看 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 文件的隐式规则.
这个语法是什么意思?
正如我在对这个问题的开场白的评论中所述,我在提出问题后不久就找到了答案。此语法在 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"。随后,将词干代入先决条件列表以生成先决条件:foo.c 和 s.foo.c。上面的语法等同于:
s.foo.o: foo.c s.foo.c
我正在查看 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 文件的隐式规则.
这个语法是什么意思?
正如我在对这个问题的开场白的评论中所述,我在提出问题后不久就找到了答案。此语法在 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"。随后,将词干代入先决条件列表以生成先决条件:foo.c 和 s.foo.c。上面的语法等同于:
s.foo.o: foo.c s.foo.c