2013-07-12 18 views
6

Ich versuche eine Make-Anweisung zu machen, um die Architektur zu überprüfen. Ich bin sehr nah es darum geht, zu arbeiten:Makefile bedingter Fehler

test: 
     ifeq ("$(shell arch)", "armv7l") 
       echo "This is an arm system" 
     else 
       echo "This is not an arm system." 
     endif 

ich ein Problem haben: obwohl dies ifeq ("i386", "armv7l") zu lösen scheint, was falsch sein sollte, bekomme ich folgende Fehlermeldung:

$ make 
ifeq ("i386", "armv7l") 
/bin/sh: -c: line 0: syntax error near unexpected token `"i386",' 
/bin/sh: -c: line 0: `ifeq ("i386", "armv7l")' 
make: *** [test] Error 2 

es also, löst sich in zwei Strings auf, die miteinander verglichen werden, aber es gibt einen Syntaxfehler. Was ist hier falsch?

Antwort

9

Sie können keine make-Anweisungen wie ifeq in einem Rezept verwenden. Rezepte (die Zeilen, die mit TAB beginnen) werden an die Shell übergeben. Die Shell versteht nicht ifeq; das ist ein make-Konstrukt.

Sie müssen Shell-If-Anweisungen innerhalb eines Rezepts verwenden. Und Sie müssen nicht $(shell ...) in einem Rezept verwenden, weil Sie bereits in einer Shell sind.

test: 
     if [ `arch` = armv7l ]; then \ 
      echo "This is an arm system"; \ 
     else \ 
      echo "This is not an arm system."; \ 
     fi 

Dies ist wahrscheinlich nicht der beste Weg, dies zu handhaben, aber da Sie keine Informationen zu bieten haben, was Sie wirklich damit zu tun versuchen, es ist alles, was wir sagen können.

+0

Wie viel klarer kann es sein? Ich versuche nur die Architektur zu überprüfen und bedingungslos Aussagen zu machen. Aber danke für die Antwort. Akzeptiert. –

+0

Wenn Sie wirklich nur eine if-Anweisung in jede einzelne Rezeptzeile schreiben wollten, dann stimme ich zu, dass es klar ist. Meistens möchten die Leute jedoch etwas mehr als das tun, wie zum Beispiel verschiedene Compiler-Flags oder andere Compiler benutzen, verschiedene Quelldateien hinzufügen, etc. Es gibt viel elegantere Möglichkeiten, solche Dinge zu tun, als viele If hinzuzufügen - Anweisungen in all deinen Makefile-Rezepten. – MadScientist

+0

Übrigens '==' ist auch mit '=' –

11

Wie MadScientist sagte make ist vorbei, die ifeq Linien an der Schale, aber wenn man es richtig schreiben, können Sie auf jeden Fall Konstrukte wie ifeq mit Befehlen in einem Rezept mischen. Sie müssen nur wissen, wie make ein Makefile parst:

Wenn eine Zeile mit einem TAB beginnt, wird ein Befehl für die Shell als unabhängig davon, wo die Zeile innerhalb der Datei. Wenn es nicht mit einem TAB beginnt, interpretiert make es als Teil seiner eigenen Sprache.

Also, um Ihre Datei zu reparieren, nur zu vermeiden, die mit einem TABmake conditionals Start:

test: 
ifeq ("$(shell arch)", "armv7l") 
     echo "This is an arm system" 
else 
     echo "This is not an arm system." 
endif 
+1

Beide Antworten sind großartig. Danke für die Erklärung, warum es nicht funktionieren würde. Ich werde es mir merken! –