2012-03-07 24 views
9

Quiero hacer una expansión inmediata de un comando de shell dentro de un Makefile, pero quiero que el comando de shell tenga acceso a las variables de entorno dentro del Makefile. Si uso $ (shell ...), se expande inmediatamente, pero no hay acceso a las variables. Si utilizo las comillas inversas, la expansión no es inmediata y me causa problemas más adelante en el Makefile. Me pregunto si hay alguna forma de hacer que las comillas traseras se expandan inmediatamente, o pasar el entorno actual a un comando $ (shell).Exportación de variables de entorno al shell Makefile

Por ejemplo, el siguiente archivo MAKE:

SOME_VAR := some_val 
export SOME_VAR 

VAR1 := `echo $$SOME_VAR` 
export VAR1 
VAR2 := `echo $$VAR1` 

all: 
     @echo VAR1=$(VAR1) 
     @echo VAR2=$(VAR2) 

seria:

~/tmp/t2> make 
VAR1=some_val 
VAR2=`echo $SOME_VAR` 

donde yo quiero para imprimir "VAR2 = some_val". El ejemplo real es un poco más complicado (las variables de entorno se heredan de los makefiles padre, y estoy tratando de usar un script de Perl para editar las variables), pero el principio es el mismo.

Cualquier ayuda es apreciada.

Respuesta

1

Como ya he mencionado en algunos de los comentarios, mi objetivo real era hacer el guión generar nombres de archivo basado en la configuración del objeto estaba siendo compilados con. Entonces necesito otra secuencia de comandos para generar una lista especialmente formateada de todos los nombres de archivo generados (el objetivo es un sistema integrado que no tiene un compilador JIT). En un momento dado, hay más de treinta configuraciones que potencialmente pueden afectar al binario, y esto se puede usar en más de un módulo en el futuro, por lo que me gustaría algo escalable.

Mi solución es la siguiente. En lugar de pasar las variables, he modificado mi guión a la salida de una cadena MAKE-apta para su procesamiento en base a los ajustes:

-include $(SOME_MK_FILE) 

$(SOME_MK_FILE) : .phony 
    script.pl $(SETTINGS_OF_INTEREST_LIST) > $(SOME_MK_FILE) 

someFilename := $(shell script2.pl $(VAR1)) 

script.pl da salida a una cadena que se ve algo como:

VAR1 := CONFIG_X1=$(CONFIG_X1) CONFIG_X2=$(CONFIG_X2) CONFIG_X33=$(CONFIG_X33) 

y SCRIPT2 da salida a un nombre de archivo que se ve algo como 'someFilename.X1_y.X2_n.elf'

y luego, más tarde, en otra norma, que tiene:

someobj: somedep 
    script3.pl $(someFilename) >> builtfiles.txt 

que construye buildfiles.txt correctamente (que a su vez es la entrada para otra secuencia de comandos ...). Al final, esto es una solución al hecho de que make no puede pasar su entorno a $ (shell). No es demasiado bonito, pero funciona.

John

4

¿Qué pasa con esto?

VAR1 := $(shell echo $(SOME_VAR)) 
VAR2 := $(shell echo $(VAR1)) 
+0

Hmmm ... sí, mi ejemplo era defectuoso. ..En el ejemplo anterior, VAR1 se expande dentro del Makefile, pero lo que necesito es que VAR1 se expanda dentro del script de shell. Es decir, estoy llamando a un script de Perl que necesita acceder a ENV {'VAR1'}. Si se invoca desde $ (shell ...) el script no tendrá conocimiento de qué es VAR1. Voy a editar mi pregunta con un mejor ejemplo. Gracias. – John

+0

@John, realmente no puedo entender lo que estás tratando de hacer aquí. Podría hacer algunas conjeturas, pero creo que sería más rápido si editaras tu pregunta. – Beta

+0

Lo que realmente estoy tratando de hacer: tengo un archivo MAKE que se supone que construye un archivo de objeto y lo nombra de acuerdo con las configuraciones de configuración con las que fue construido. Tengo un script de Perl que traduce las configuraciones en un nombre. Para que esto funcione, la secuencia de comandos de perl debe tener acceso a la configuración de configuración (tiene que usar las comillas inversas para eso). Esto estaría bien por sí mismo, pero luego el nombre tiene que ser utilizado en otro script de Perl. Debido a que el nombre no se expande cuando se ejecuta el segundo script, causa un error. Estoy buscando una solución. – John

5

¿Esto es lo que quieres?

VAR2 := $(shell VAR1="$(VAR1)" script_that_uses_var1)

+0

No exactamente, no. Lo que quiero es construir ciertos binarios y nombrarlos de acuerdo con la configuración actual. Si bien podría exportar explícitamente cada una de las configuraciones que quiero, esta solución no es muy escalable. Entonces, lo que tengo que hacer es ejecutar un script que tenga acceso a todas las configuraciones de los archivos MAKE. Entonces sería capaz de dar salida a un nombre de archivo. El nombre de archivo que eventualmente tendría que pasar a otro script más adelante, por lo que el nombre de archivo tendría que resolverse más temprano que tarde. – John

+1

Esto puede no haber ayudado al OP, pero era exactamente lo que necesitaba para buscar esta pregunta. ¡Aclamaciones! –

Cuestiones relacionadas