Starlark 中的 Include 和 Inherit 语句

在 make 中,include 语句可以包含具有变量的文件路径,并会在前缀中包含减号时忽略不存在的文件。等效的 product 配置为 inherit-product-if-exists 函数。Starlark 会对由字符串字面量标识的文件使用 load 语句;如果文件不存在,Starlark 会抛出错误。

为了规避此限制,Starlark 转换器会:

  • 查找与涉及变量的路径匹配的所有 Makefile
  • 对找到的所有 Makefile 发出 Starlark load 语句
  • 在运行时选择正确的那一项

请注意,生成的 Starlark 代码可能看起来不自然,因为它会列出所有匹配的路径,即便只是执行一个。

我们建议移除 include/inherit-product 语句中的变量引用。

如果无法避免引用变量,请尝试最大限度减少变量部分。 例如:

MY_DIR := path/to/$(TARGET_PRODUCT)
include $(MY_DIR)/file.mk

会导致转换器为源代码树中的每个 file.mk 生成一个 load 语句,而

include path/to/$(TARGET_PRODUCT)/file.mk

会将其限制到 path/to 下的 file.mk 文件。当然,最好一并移除对 TARGET_PRODUCT 的使用。