Ich habe ein Makefile, das sowohl musterspezifische Variablen als auch zielspezifische Variablen verwendet, um Kompilierungseinstellungen zu steuern. Einzelne Ziele können zielspezifische Variablen angeben, um allgemeinere Kompilierungseinstellungen zu überschreiben. Einige Einstellungen schließen sich jedoch gegenseitig aus, und ich finde es schwierig, dem Makefile Conditionals hinzuzufügen, um eine Einstellung basierend auf einer anderen nach zielspezifischen Variablen für ein Rezept anzupassen.Wie werden Bedingungen ausgeführt, nachdem zielspezifische Variablen festgelegt wurden?
My Make-Datei auf einem IBM läuft i (GNU 4.0 Stellen), die viele Menschen mit nicht vertraut sind, ist so hier ein erfundenes Beispiel, dass hoffentlich mehr Sinn für die meisten machen:
.PHONY: all
all: object1.o object2.o
%.o: TYPE = solid
%.o: ITEM = stone
%.o: %.c
compile_command -type $(TYPE) -item $(ITEM)
object1.o: ITEM = helium
object1.o: object1.c
object2.o: ITEM = water
object2.o: object2.c
Das Muster spezifisches Variablen legen Standardwerte für TYPE
und ITEM
für alle .o
Dateien fest. object1.o
überschreibt ITEM
zu "Helium". Wie kann ein Conditional eingefügt werden, so dass, wenn ITEM
gleich "Helium" ist, TYPE
automatisch auf "Gas" gesetzt werden kann? Wenn ITEM
gleich "Wasser" ist, wie stellen wir dann automatisch auf "flüssig" ein? Das Ziel besteht darin, zu vermeiden, dass TYPE
als zielspezifische Variable explizit angegeben werden muss. es sollte von der Regel abgeleitet werden können.
Es klingt also wie zu dem Zeitpunkt, zu dem meine Variable im Rezept verwendet werden muss. Dann würden Sie diesen Prozess machen - denn bis dahin sind alle zielspezifischen Variablen bereits gesetzt. Ist es möglich, den Wert anderer Variablen innerhalb einer Bedingung zu setzen? Ich verstehe, dass man 'x = $ (some_expression_that_calculates_x)' sagen kann, aber gibt es eine Möglichkeit, eine Bedingung zu halten, die im Grunde sagt 'if x = 'some_value', dann y auf 3 und z auf 4 'setzen? – smeep
Sie können es tun, mit 'eval', aber es ist nicht einfach zu bedienen. Es ist möglicherweise auch nicht der beste Weg, um Dinge zu tun: Sie könnten zum Beispiel berechnete Variablennamen dafür verwenden. Das klingt nicht nach der gleichen Frage, die Sie oben gestellt haben, und die Antwort ist zu komplex für einen Kommentar. Ich empfehle Ihnen, eine andere SO-Frage zu starten, die nach den echten Informationen fragt, die Sie wünschen, wenn diese Frage nicht tatsächlich das reflektiert. – MadScientist