Rekursive Erweiterung

Verwenden Sie keine rekursive Erweiterung in Produkt-/Board-Konfigurations-Makefiles. Bei der rekursiven Erweiterung handelt es sich um die Verwendung eines raw = anstelle eines := für die Variablenzuweisung in Makefiles. Dies führt dazu, dass Variablen, die auf den Wert anderer Variablen gesetzt sind, diese anderen Variablen erst dann auswerten, wenn sie selbst ausgewertet werden. Dies ist eine Funktionalität, die Starlark nicht unterstützt.

Das Entfernen hängt weitgehend vom konkreten Verwendungsszenario ab. Meistens geht es darum, Variablenzuweisungen dorthin zu verschieben, wo sie verwendet werden. Ersetzen Sie beispielsweise:

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

mit:

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

Beim Anhängen an eine Variable mit += wird eine rekursive Erweiterung verwendet, wenn dieser Variablen zuvor noch keine einfache Erweiterung zugewiesen wurde. Wenn Sie nicht sicher sind, ob die Variable bereits zuvor zugewiesen wurde, kann += durch MY_VAR := $(strip $(MY_VAR) new_value) ersetzt werden.

Das Entfernen der verzögerten Erweiterung kann auch die Auswertung der Makefiles beschleunigen, noch bevor die Konvertierung in Starlark abgeschlossen ist. Wenn Variablen auf das Ergebnis teurer Funktionsaufrufe gesetzt würden, würde die Funktion bei einfacher Erweiterung nur einmal aufgerufen, bei rekursiver Erweiterung jedoch möglicherweise mehrmals.