2009-03-24 10 views
5

È possibile aggiornare l'ambiente da un makefile? Voglio essere in grado di creare un obiettivo per impostare le variabili di ambiente client per loro. Qualcosa di simile a questo:Un makefile può aggiornare l'ambiente di chiamata?

AXIS2_HOME ?= /usr/local/axis2-1.4.1 
JAVA_HOME ?= /usr/java/latest 
CLASSPATH := foo foo 

setenv: 
    export AXIS2_HOME 
    export JAVA_HOME 
    export CLASSPATH 

modo che il cliente può semplicemente fare:

make setenv all 
java MainClass 

e farlo funzionare senza la necessità di impostare il classpath per l'esecuzione di Java stessi.

O sto cercando di farlo nel modo sbagliato e c'è un modo migliore?

risposta

5

No, non è possibile aggiornare l'ambiente nel processo di chiamata in questo modo. In generale, un sottoprocesso non può modificare l'ambiente del processo principale. Un'eccezione degna di nota sono i file batch su Windows, quando vengono eseguiti da una shell cmd. Basandomi sull'esempio che mostri, suppongo che tu non stia girando su Windows.

Di solito, ciò che si sta tentando di realizzare è fatto con uno script di shell che imposta l'ambiente e quindi richiama il processo previsto. Ad esempio, è possibile scrivere uno script go.sh come questo:

!#/bin/sh 
AXIS2_HOME=/usr/local/axix2-1.4.1 
JAVA_HOME=/usr/java/latest 
CLASSPATH=foo foo 
export AXIS2_HOME 
export JAVA_HOME 
export CLASSPATH 
java MainClass 

Fai go.sh eseguibile e ora è possibile eseguire la vostra applicazione, come ./go.sh. Puoi anche rendere il tuo script più elaborato, se vuoi - per esempio, potresti voler rendere "MainClass" un parametro per lo script piuttosto che doverlo codificare.

+0

In alternativa, è possibile omettere l'ultima riga ('java MainClass') e quindi comunicare agli utenti di * source * lo script, che è stato progettato esattamente per la propria situazione di impostazione delle variabili di ambiente nel processo della shell principale. – JasonSmith

+0

Trivia: i file .BAT e .CMD su Windows vengono elaborati all'interno della stessa istanza di CMD.EXE che richiede e esegue comandi interattivi. Questo è equivalente al comando source in csh o il. comando in sh. – RBerteig

-5

La risposta rapida è sì, tuttavia nel codice, è necessario definire le variabili nella direttiva setenv :. Farlo all'inizio del Makefile lo rende una variabile locale al Makefile. Vorrei usare LOCAL _... nella parte superiore del file, quindi impostarlo in setenv: direttiva con VAR = LOCAL_VAR, ecc ... Ricorda anche che dovrai chiamare il makefile con make setenv only. Vorrei davvero fare questo in uno script bash in quanto la variabile deve essere creata al di fuori del Makefile. Una volta che la variabile è stata generata nell'ambiente, dovresti essere in grado di assegnare ed esportare dal Makefile.

4

Dalla tua domanda presumo che tu stia usando la shell bash.

È possibile inserire le definizioni di variabili in uno script di shell, in questo modo:

AXIS2_HOME=/usr/local/axis2-1.4.1 
export AXIS2_HOME 
#etc 

E poi source lo script nel contesto attuale, con

source <filename> 

o semplicemente

. <filename> 

Che esegue lo script nella corrente sh ell (ad es. nessun processo figlio), quindi qualsiasi ambiente cambia lo script farà persistere.

+0

Grazie. Mi piace in questo modo.Aggiungerò un obiettivo al makefile per generare questo file per impostare il classpath e aggiungere al documento che deve essere estratto. – brofield