2013-07-31 6 views
7

Ich weiß, dass Sie verwenden können, wenn Aussagen wie die folgenden in Makefiles:Conditional Ausdruck in Makefile

foo: $(objects) 
ifeq ($(CC),gcc) 
     $(CC) -o foo $(objects) $(libs_for_gcc) 
else 
     $(CC) -o foo $(objects) $(normal_libs) 
endif 

Gibt es eine Möglichkeit, einen bedingten Ersatz wie möglicherweise einen ternären Typen Betreiber zu tun.

(condition?$(CC):$(CC2)) -o foo $(objects) $(libs_for_gcc) 

Und wenn es nicht das, was die meisten idiomatische Weg wäre, ist das Beispiel zu erreichen

Ich habe die C++ Tag, weil die Frage nur 7 Ansichten hatte und ich dachte, jemand, der C++ verwendet könnte wahrscheinlich die Antwort zu wissen, ich weiß, das ist nicht unbedingt eine C++ Frage ist (obwohl ich c zu kompilieren bin die Planung ++ mit ihm)

EDIT: sieht aus wie es ein, wenn die Funktion mit dieser Syntax ist
$(if condition,then-part[,else-part])
Ich bin immer noch ein wenig verwirrt, wie es funktioniert

Antwort

9

Die $(if ...)-Funktion kann als ternärer Operator dienen, wie Sie festgestellt haben. Die wirkliche Frage ist, wie funktionieren Conditionals (true vs. false) in GNU? In GNU make, wo eine Bedingung (boolescher Ausdruck) benötigt wird, wird eine leere Zeichenfolge als falsch betrachtet und jeder andere Wert wird als wahr betrachtet.

Also, um zu testen, ob $(CC) die Zeichenfolge gcc ist, müssen Sie eine Funktion verwenden, die einen leeren Wert zurückgibt, wenn es nicht ist, und einen nicht leeren Wert, wenn es ist.

In der Regel werden dazu die Funktionen filter und filter-out verwendet. Leider ist es am einfachsten, diese so zu verwenden, dass Sie das Ergebnis "nicht gleich" erhalten. mit anderen Worten, mit diesen Funktionen ist es viel einfacher, eine nicht leere Zeichenfolge (true) genau zu generieren, wenn die Zeichenfolge nichtgcc ist, und eine leere Zeichenfolge (false), wenn der Wert gcc ist. Zum Beispiel:

$(if $(filter-out gcc,$(CC)),$(info is not gcc),$(info is gcc)) 
+0

Ich dachte, es gäbe einen Weg, um das zu erreichen, was ich wollte, wird dies beim Schreiben eines Makefiles als idiomatisch angesehen, auch ich würde upvoten, aber ich muss 42 Minuten warten, ran outa votes – aaronman

+0

Ich denke, dass Chris tatsächlich richtig ist: diese Art von Das ist in Makefiles nur selten der Fall. Normalerweise werden andere Methoden verwendet, wie die rekursive Variablenbenennung (etwas wie 'gcc_LIBS = $ (libs_for_gcc)', dann in der Regel '$ ($ (CC) _LIBS)' oder das Einbeziehen verschiedener Makefiles zum Einrichten von Variablen für verschiedene Compiler usw. Ich würde es nicht wirklich idiomatisch nennen, aber es ist nicht unbekannt – MadScientist

+0

ok, der einzige Grund, warum ich Chris Antwort nicht mochte, ist, weil es nichts zur Verfügung stellte, was ich nicht schon wusste. Ich habe jetzt UV war er – aaronman

1

Wenn der einzige Effekt, den Sie versuchen zu erreichen ist, entweder den einen oder den anderen Compiler verwenden, denke ich, der beste Weg ist, eine Variable für diese spezielle verwenden Kompilierungsschritt und setze dies abhängig von deinem Zustand.

ifeq (condition) 
    MYCC=$(CC2) 
    LIBS=$(LIBS_FOR_CC2) 
else 
    MYCC=$(CC) 
    LIBS=$(LIBS_FOR_CC) 
endif 

und dann später in der Regel Verwendung

$(MYCC) -o foo $(objects) $(LIBS) 

Das ist zumindest zu kompilieren, wie ich die Makefiles in eine) Konfiguration Speicher Strukturierung und b) die Regelsätze.

Sorry, wenn das Ihre Frage nicht beantwortet, aber ich bin mir nicht bewusst, einen ternay-Operator für GNU make (und ich nehme an, Sie beziehen sich auf GNU make?).

+0

Nichts für ungut, aber wenn die Antwort im Wesentlichen gehen wird, sagen Sie mir, was ich will, ist unmöglich und bietet sehr wenig neue Informationen, würde ich lieber entweder Sie sichern es mit einem Artikel einer Art oder es kommt aus jemand, der einen hohen Ruf in [tag: make] hat und kein Benutzer der Seite, der heute beigetreten ist – aaronman

+0

nur um klar zu sein, wenn Sie Ihre Antwort sichern können Ich bin vollkommen glücklich, es zu akzeptieren – aaronman

+0

Ich würde vorschlagen, Sie laufen 'info Machen Sie "Bedingte Syntax" und "Info machen bedingte Funktionen" und lesen Sie das Handbuch. Für Ihre Frage bin ich nicht wirklich sicher, was Sie erreichen möchten.Wenn Sie im Makefile auf einen kanonischeren Stil hinarbeiten, würde ich immer noch meinen ersten Vorschlag empfehlen. – Chris