2017-01-23 4 views
0

Ich möchte eine Funktion schreiben, die je nach Argument unterschiedliche Werte zurückgeben würde. Ich habe geschrieben:Mit If innerhalb Makro

define function 
ifeq($(1),a) 
aaaa 
else 
bbbb 
endif 
endef 

$(info MSG: $(call function,a)) 

ich Ausgang:

MSG: ifeq(a,a) 
aaaa 
else 
bbbb 
endif 

dass der ganze Körper der Funktion ist statt aaaa.

Wie soll ich die Funktion umschreiben oder die Art ändern, wie ich sie aufruft, um nur Text aus der passenden if-Verzweigung zu erhalten?

UPDATE: Auch habe ich versucht, Funktionsaufruf in eval, umschließen aber fehlt Separator Fehler.

Antwort

2

Es ist einfacher filter-out zu bedienen, als filter zweimal verwenden:

$(if $(filter-out $(1),$(2)),bbbb,aaaa) 

(Beachten Sie, dass ich die Beine der Bedingung invertieren musste, weil filter-out die Ausgabe gibt (also für"wahr" ist)), wenn sie nicht übereinstimmen.

0

Ich habe eine solche Entscheidung getroffen. Vielleicht nicht sehr elegant, aber immer noch tut es das, was ich brauche:

txtcmp = $(and $(filter $(1),$(2)),$(filter $(2),$(1))) 

define function 
$(if $(call txtcmp,$(1),a),aaaa,bbbb) 
endef 

$(info MSG: $(call function,b)) 
0

Unter Berücksichtigung Implementierung von txtcmp Ihnen eine Funktion zum Testen benötigen, wenn zwei Argumente gleich sind. Wenn dies der Fall ist, geben Sie einen Wert zurück, andernfalls geben Sie einen anderen zurück.

Ihre Lösung sieht nicht gut aus, kann aber ein wenig verbessert werden:

function = $(if $(call txtcmp,$(1),a),aaaa,bbbb) 

Hinweis, es gibt einen anderen Textsuche - findstring. Mit ihm statt filter produzieren leicht unterschiedliche Ergebnisse:

txtcmp = $(and $(filter $(1),$(2)),$(filter $(2),$(1))) 

function = $(if $(call txtcmp,$(1),a),aaaa,bbbb) 

$(info MSG: $(call function,b)) 
$(info MSG: $(call function,a)) 
$(info MSG: $(call function, a)) 

txtcmp = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1))) 

$(info MSG: $(call function,b)) 
$(info MSG: $(call function,a)) 
$(info MSG: $(call function, a)) 

die oben Make-Datei Lauf folgende Ausgabe:

MSG: bbbb 
MSG: aaaa 
MSG: aaaa 
MSG: bbbb 
MSG: aaaa 
MSG: bbbb 
make: *** No targets. Stop.