2013-07-12 18 views
6

Próbuję wykonać instrukcję make, aby sprawdzić architekturę. Jestem bardzo blisko do uzyskania go do pracy:Błąd warunkowy pliku Makefile

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

mam jeden problem: choć wydaje się to rozwiązać do ifeq ("i386", "armv7l") które powinny być fałszywe, pojawia się następujący błąd:

$ 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 

tak, to rozróżnia dwa ciągi w porównaniu do siebie, ale występuje błąd składni. Co jest nie tak?

Odpowiedz

9

Nie można używać instrukcji, takich jak ifeq w recepturze. Przepisy (linie zaczynające się od TAB) są przekazywane do powłoki. Powłoka nie rozumie ifeq; to jest konstrukt make.

Będziesz musiał użyć instrukcji powłoki if w przepisie. I nie musisz używać $(shell ...) w przepisie, ponieważ jesteś już w powłoce.

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

Jest to prawdopodobnie nie jest to najlepszy sposób, aby sobie z tym poradzić, ale ponieważ nie podała żadnych informacji o tym, co tak naprawdę stara się zrobić z tym, że to wszystko, co możemy powiedzieć.

+0

Ile wyraźniej to może być? Po prostu próbuję sprawdzić architekturę i warunkowo wykonać instrukcje. Ale dziękuję za odpowiedź. Przyjęty. –

+0

Jeśli naprawdę chciałeś napisać instrukcję if w każdym wierszu receptury, to zgadzam się, że jest to jasne. Zazwyczaj jednak ludzie chcą zrobić coś więcej, np. Użyć różnych flag kompilatora lub różnych kompilatorów, dodać różne pliki źródłowe itp. Istnieje wiele bardziej eleganckich sposobów na zrobienie tego typu rzeczy, niż dodanie wielu -wskazania na wszystkie twoje receptury plików makefile. – MadScientist

+0

Przy okazji '==' jest równoznaczne z '=' –

11

Jak powiedział MadScientist, make przechodzi przez linie ifeq do powłoki, ale jeśli napiszesz to poprawnie, możesz zdecydowanie wymieszać konstrukty takie jak ifeq z poleceniami w ramach przepisu. Trzeba tylko zrozumieć jak make analizuje Makefile:

Jeśli linia rozpoczyna się TAB, to jest uważany za polecenie powłoki niezależnie od tego, gdzie linia jest w pliku.

Jeśli nie zaczyna się od TAB, make interpretuje go jako część własnego języka.

Tak, aby naprawić plik, po prostu uniknąć rozpoczęciem make warunkowe z TAB:

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

Obie odpowiedzi są świetne. Dziękuję za wyjaśnienie, dlaczego to nie zadziała. Z pewnością będę o tym pamiętać! –