Ich versuche herauszufinden, ob das folgende Verhalten ein Fehler in Make ist, oder absichtlich Teil des Designs (wenn ja, kann ich nicht finde es überall dokumentiert). Es tritt sowohl mit alten als auch mit neuen Versionen von GNU Make auf, die ich ausprobiert habe.Wert der einfach erweiterten Variable über den berechneten Namen unterscheidet sich in Rezept vs außerhalb Rezept
Kurz gesagt besteht das Verhalten darin, dass die Auswertung von Variablen mit berechneten Namen in Rezepten beim Aufruf des Rezepts erfolgt und nicht an der Stelle in der Datei, an der das Rezept definiert ist, auch wenn die Variable einfach- expanded (": =", im Gegensatz zu rekursiv-expanded "=") (nicht, dass das von mir erwartet würde).
Repro-Code:
a_name := alpha
b_name := beta
AB := a
target1 : $($(AB)_name)
echo $^
echo $($(AB)_name)
alpha : ;
beta : ;
AB := b
target2 : target1 ;
nach make target2
Ausgang Aufrufen erwarte ich:
alpha
alpha
tatsächliche Ausgabe:
alpha
beta
Danke! Also, wenn ich Sie richtig verstehe, war meine Hypothese falsch: Es ist * not *, dass berechnete Variablen in Rezepten erweitert werden am Punkt des Aufrufs des Rezepts berechnet. Was wirklich passiert ist: Alle Variablen in Rezepten nehmen den Wert, den sie am Ende des Makefiles haben, unabhängig davon, wo sich das Rezept befindet. Ich sehe Makefiles jetzt anders! –