2013-07-12 18 views
6

Sto tentando di fare una dichiarazione per verificare l'architettura. Sono molto vicino ad ottenere a lavorare:Errore condizionale Makefile

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

Ho un problema: anche se questo sembra per risolvere a ifeq ("i386", "armv7l") che dovrebbe essere falso, ottengo il seguente errore:

$ 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 

Quindi, è la risoluzione di due stringhe che si confrontano tra loro, ma c'è un errore di sintassi. Cosa c'è che non va qui?

risposta

9

All'interno di una ricetta non è possibile utilizzare dichiarazioni come ifeq. Le ricette (le linee che iniziano con TAB) vengono passate alla shell. La shell non capisce ifeq; questo è un costrutto make.

Dovrai utilizzare le istruzioni if ​​della shell all'interno di una ricetta. Inoltre, non è necessario utilizzare $(shell ...) in una ricetta, perché lo è già in una shell.

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

Questo è probabilmente non è il modo migliore per gestire questo, ma dal momento che non ha fornito alcuna informazione su cosa si sta veramente cercando di fare con questo è tutto quello che possiamo dire.

+0

Quanto più chiara può essere? Sto solo provando a controllare l'architettura e a fare dichiarazioni condizionatamente. Ma grazie per la risposta. Accettato. –

+0

Se davvero volevi scrivere un'istruzione if in ogni singola riga della ricetta, allora sono d'accordo che è chiaro. La maggior parte delle volte, però, le persone vogliono davvero fare qualcosa di più, come usare diversi flag di compilatore o compilatori diversi, aggiungere diversi file sorgenti, ecc. Esistono modi molto più eleganti per fare questo genere di cose che aggiungere molti se -statements in tutte le tue ricette makefile. – MadScientist

+0

Tra l'altro '==' è sinonimo di '=' –

11

Come diceva MadScientist, make sta passando le linee ifeq alla shell, ma se la scrivi correttamente, puoi sicuramente mixare costrutti come ifeq con comandi all'interno di una ricetta. Hai solo bisogno di capire come make analizza un Makefile:

Se una riga inizia con un TAB, è considerato un comando per la shell indipendentemente da dove la linea è all'interno del file.

Se non inizia con TAB, make lo interpreta come parte della propria lingua.

Così, per riparare il file, basta evitare di iniziare le make condizionali con un TAB:

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

Entrambe le risposte sono fantastiche. Grazie per aver spiegato perché non avrebbe funzionato. Lo terrò sicuramente presente! –