递归展开

不要在产品/板配置 makefile 中使用递归扩展。递归扩展是在生成文件中使用原始=而不是:=进行变量赋值。它会导致设置为其他变量值的变量在评估它们自己之前不评估这些其他变量。这是 Starlark 不支持的功能。

删除它在很大程度上取决于它的使用方式的具体场景。大多数情况下,它涉及将变量分配移动到使用它们的位置之前。例如,替换:

MY_VAR_2 = foo
# Some stuff in between...
MY_VAR = $(MY_VAR_2)
MY_VAR_2 = bar
# $(MY_VAR) is bar here.

和:

MY_VAR_2 := foo
# Some stuff in between...
MY_VAR_2 := bar
MY_VAR := $(MY_VAR_2)
# $(MY_VAR) is bar here.

如果该变量之前没有通过简单扩展分配给使用+=附加到变量,则使用递归扩展。如果您不确定变量之前是否已分配,可以将+=替换为MY_VAR := $(strip $(MY_VAR) new_value)

即使在转换为 Starlark 之前,删除延迟扩展也可以加快对 Makefile 的评估。如果将变量设置为昂贵函数调用的结果,则该函数只会通过简单扩展调用一次,但可能会通过递归扩展调用多次。