2016-11-11 1 views
0

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.

Antwort

1

Sie können wie etwas tun:

GASSES = helium argon 
LIQUIDS = water 
derive_type = $(or $(if $(filter $(ITEM),$(GASSES)),gas),$(if $(filter $(ITEM),$(LIQUIDS)),liquid),$(TYPE)) 

%.o: %.c 
     compile_command -type $(derive_type) -item $(ITEM) 

Grundsätzlich ist die or Funktion ist Kurzschluss und gibt das erste Element in der übergebenen in Liste, die nicht leer ist, und die filter Funktion liefert eine passende Wert. Also sagt das, den ersten Wert zurückgeben, der "Gas" ist, wenn der Wert ITEM in der $(GASSES) Variable existiert, dito für $(LIQUIDS) und liquid, und wenn alles andere fehlschlägt, gebe den Wert des $(TYPE) Wertes zurück.

Es kann etwas Arbeit im Zusammenhang mit dem Standardwert geben, wenn Sie zulassen möchten, dass TYPE als erstes ausgewählt wird, falls gesetzt.

+0

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

+0

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

Verwandte Themen