2013-05-31 7 views
19

Ho una variabile di ambiente impostata con nome $ MY_ENV_VARIABLE.Leggere la variabile di ambiente nel file make

Come si utilizza questa variabile nel mio makefile per (ad esempio) includere alcuni file sorgente?

LOCAL_SRC_FILES = $(MY_ENV_VARIABLE)/libDEMO.so 

Qualcosa come sopra non sembra funzionare.

Nota: nel mio caso questo è necessario per la creazione con l'NDK di Android, ma immagino che questo si applichi a fare in generale.

+0

Dovrebbe funzionare. Sei sicuro che la variabile sia impostata? – Matthias

+1

@Sander, la variabile dichiarata dovrebbe funzionare. potresti anche provare: = invece di = e rimuovere gli spazi ... hai anche provato l'opzione -e nella tua invocazione make? , -e: forza le variabili di enviornment a prevalere ... – nsd

risposta

11

Assicurati di aver esportato la variabile dalla tua shell. In esecuzione:

echo $MY_ENV_VARIABLE 

mostra se è impostato nella shell. Ma per sapere se hai esportato in modo che sottoshell e gli altri comandi secondari (come make) possono vederlo provare a eseguire:

env | grep MY_ENV_VARIABLE 

Se non è lì, assicurarsi di eseguire export MY_ENV_VARIABLE prima di eseguire make.

Questo è tutto ciò che devi fare: effettuare automaticamente le importazioni di tutte le variabili di ambiente come rendere variabili quando si avvia.

+0

In 'csh' è' setenv MY_VAR my_val' – mpen

15

Giusto per aggiungere un po 'informazioni ...

La sintassi per accedere alla variabile d'ambiente nel make è come le altre variabili in make ...

#export the variable. e.g. in the terminal, 
export MY_ENV_VARIABLE="hello world" 

... 

#in the makefile (replace before call) 
echo $(MY_ENV_VARIABLE) 

Questa esegue la sostituzione prima di eseguire il commmand. Se invece, desidera la sostituzione per accadere durante l'esecuzione del comando, è necessario sfuggire alla $ (ad esempio, echo $MY_ENV_VARIABLE non è corretto e tenterà di sostituire la variabile M di marca, e aggiungerlo al Y_ENV_VARIABLE) ...

#in the makefile (replace during call) 
echo $$MY_ENV_VARIABLE 
3

ho appena avuto un problema simile (sotto Cygwin):

  • esecuzione echo $OSTYPE sulle shell stampa il valore, ma
  • esecuzione env | grep OSTYPE non dà alcun output.

Come io non posso garantire che questa variabile è export cata su tutte le macchine che voglio correre che makefile, ho usato il seguente per ottenere la variabile all'interno del makefile:

OSTYPE = $(shell echo $$OSTYPE) 

Quale naturalmente può essere utilizzato anche all'interno di una condizione come la seguente:

ifeq ($(shell echo $$OSTYPE),cygwin) 
# ...do something... 
else 
# ...do something else... 
endif 

EDIT:

Alcune cose che ho trovato dopo aver sperimentato con le informazioni da jozxyqk's answer, il tutto all'interno del makefile:

  • Se corro @echo $$OSTYPE o @echo "$$OSTYPE" in una ricetta, la variabile viene ampliata con successo in cygwin.
  • Tuttavia, l'utilizzo di tale condizione in una condizione come ifeq ($$OSTYPE,cygwin) o ifeq ("$$OSTYPE","cygwin") non lo espande.
  • Quindi è logico che prima non si imposta una variabile come TEST = "$$OSTYPE" porterà a echo $(TEST) stampa cygwin (l'espansione è fatto dalla chiamata echo), ma che non funziona in una condizione - ifeq ($(TEST),cygwin) è falso.