2009-03-24 7 views
5

¿Es posible actualizar el entorno desde un archivo MAKE? Quiero ser capaz de crear un objetivo para establecer las variables de entorno del cliente para ellos. Algo como esto:¿Puede un makefile actualizar el entorno de llamadas?

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 

Para que el cliente puede simplemente hacer:

make setenv all 
java MainClass 

y hacer que funcione sin necesidad de que establecer la ruta de clases para la ejecución de Java sí mismos.

¿O estoy buscando hacer esto de la manera incorrecta y hay una manera mejor?

Respuesta

5

No, no puede actualizar el entorno en el proceso de llamada de esta manera. En general, un subproceso no puede modificar el entorno del proceso principal. Una excepción notable son los archivos por lotes en Windows, cuando se ejecutan desde un shell cmd. Basado en el ejemplo que muestra, supongo que no se está ejecutando en Windows.

Normalmente, lo que está tratando de lograr se hace con un script de shell que configura el entorno y luego invoca su proceso previsto. Por ejemplo, puede escribir un guión go.sh así:

!#/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 

Hacer go.sh ejecutable y ahora puede ejecutar su aplicación como ./go.sh. También puede hacer que su script sea más elaborado, si lo desea, por ejemplo, puede hacer que "MainClass" sea un parámetro para el script en lugar de codificarlo con dificultad.

+0

Alternativamente, puede omitir la última línea ('JavaClassClass') y luego decirle a sus usuarios * fuente * la secuencia de comandos, que está destinado exactamente para su situación de configuración de variables de entorno en el proceso de shell principal. – JasonSmith

+0

Trivia: Los archivos .BAT y .CMD en Windows se procesan dentro de la misma instancia de CMD.EXE que está solicitando y ejecutando comandos interactivos. Esto es equivalente al comando fuente en csh o the. comando en sh. – RBerteig

-5

La respuesta rápida es sí; sin embargo, en su código, deberá definir las variables en la directiva setenv :. Hacerlo al comienzo del Makefile lo convierte en una variable local del Makefile. Utilizaría LOCAL _... en la parte superior del archivo y luego lo establecería en la directiva setenv: con VAR = LOCAL_VAR, etc. También recuerde que deberá llamar al archivo MAKE con make setenv únicamente. Vería realmente hacer esto en un script bash ya que la variable debe crearse fuera del Makefile. Una vez que la variable ha sido generada en el entorno, debería poder asignar y exportar desde el Makefile.

4

De su pregunta, supongo que está utilizando el shell bash.

Puede colocar las definiciones de las variables en un script de shell, así:

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

Y luego source la secuencia de comandos en el entorno actual, con

source <filename> 

o simplemente

. <filename> 

Eso ejecuta el script en el sh actual ell (es decir no hay proceso hijo), por lo que cualquier cambio de entorno persistirá.

+0

Gracias. Me gusta de esta manera.Agregaré un objetivo al archivo MAKE para generar este archivo para establecer el classpath y agregar al documento que debe ser fuente. – brofield

Cuestiones relacionadas