奇怪的 Makefile,需要解释

Strange Makefile, need explanations

我正在尝试编译内核,但无法弄清楚它的 Makefile 是如何工作的:https://github.com/LineageOS/android_kernel_sony_msm8994/blob/cm-14.1/scripts/Makefile.build

因为我在构建时遇到这个错误:Build of a custom Linux/Android/LineageOS kernel in C doesn't work,我现在试图理解直到第 44 行。

  1. 为什么有几个扩展名为 .build .clean 等的 Makefile 而不是将这些操作作为主 Makefile 中的“目标”?

  2. 我怎样才能弄清楚第一个 $(obj) var 指的是什么?

  3. 数学语法 :=“根据定义等于”而不是 = 是特定于开发人员的吗?如果我是对的,我确实在数学笔记或符号语言(例如 Wolfram/Mathematica 中看到了这一点,但从未在程序中看到过。

  4. 为什么 PHONY := 是一个变量而不是文档中的“操作类型”?它应该写成 .PHONY: 作为文件的最后一行。我没有得到这个技巧。

  5. 为什么__buildPHONY的值前有2个下划线?

感谢您的精确

  1. 因为编写 makefile 的人想将它们分解成单独的文件。也许它们包含在多个其他文件中,或者他们只是想让顶级 makefile 更清晰易读。
  2. 您可以 运行 使用 -p 选项进行制作,它将打印 makefile 中所有变量的所有值。
  3. 我不太明白这个问题:makefile中的:=运算符用于简单扩展变量赋值。有关详细信息,请参阅 GNU make manual
  4. 设置变量PHONY包含一些内容。这只是一个普通的变量赋值,这里没有什么特别的。大概在 makefile 的其他地方会出现一行:.PHONY: $(PHONY) and that will make all the targets in the PHONY variable phony.
  5. 因为写makefile的人想用两个下划线