2013-05-23 16 views
13

Ho un GNU Makefile (versione 3.81), che è simile al seguente:Verificando variabili sono definite in un makefile

.PHONY: SPOneDot 

SPOneDot: 
    ifndef X 
    X=0.05 
    $$(info X undefined, changed to $X) 
    endif 
    ifndef Y 
    Y=0.05 
    $$(info Y undefined, changed to $Y) 
    endif 
    python ./Submit3DSP.py -f OneDot.qdt -x $(X) -y $(Y) 

eseguo con la seguente riga di comando: make X=0.1 Y=0.1 SPOneDot ma ottengo il seguente risultato:

ifndef X 
make: ifndef: Command not found 
make: *** [SPOneDot] Error 127 

Ho cercato nel makefile documentation e visto others use it. Qualsiasi aiuto è apprezzato, è probabilmente qualcosa di sciocco.

+0

Che tipo di marca è questa? Fare GNU? BSD? POSIX? – Jens

+0

GNU Fare qui la versione 3.81. –

risposta

18

Molto probabilmente le tue direttive di produzione non devono essere rientrate nella scheda ma iniziano nella prima colonna. Sospetto anche che tu voglia .if(...) o simile, non chiaro ifdef. È difficile dirlo senza sapere quale implementazione make si utilizza.

Nella marca GNU, vengono utilizzate le parti condizionali, ad es. In questo modo

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

Il GNU make manual ha tutti i dettagli.

Se davvero intenzione di testare un ambiente variabile (in contrapposizione ad un rendere variabile), poi semplicemente farlo nei comandi:

SPOneDot: 
    if test -z "$$X"; then X=0.05; echo "X undefined, changed to $$X"; fi; \ 
    if test -z "$$Y"; then Y=0.05; echo "Y undefined, changed to $$Y"; fi; \ 
    python ./Submit3DSP.py -f OneDot.qdt -x $$X -y $$Y 

noti che $$ viene passato alla shell come un singolo $ e tutto deve essere un singolo comando per la shell, quindi il punto e virgola e il backslash/newline.

+0

Sono interessato solo a queste variabili se sto facendo questo particolare obiettivo, ho ancora bisogno che siano non indirizzati? –

+1

Grazie, ho imparato che non puoi mettere condizionali all'interno di un bersaglio. Ci sono modi intelligenti per aggirare questo problema, ma userò la correzione della variabile d'ambiente. A proposito, dovresti fare un "after-eco" su entrambe le linee per fare in modo che questo funzioni –

+0

Buona cattura - risolto. – Jens

4

Se la riga inizia con una scheda, verrà considerata parte di una ricetta per una regola. Gli spazi aggiuntivi sono consentiti e ignorati all'inizio della riga della direttiva condizionale, ma non è consentita una scheda.

Problemi correlati