2009-10-09 8 views
7

Por lo tanto, para compilar mi ejecutable, necesito tener las ubicaciones de la biblioteca configuradas correctamente. El problema es que la configuración proviene de un conjunto de scripts que exportan la variable env, y lo que debe configurarse puede cambiar (más allá de mi control), así que necesito usar esos scripts en lugar de copiar su funcionalidad. Para compilar en línea de comandos normal, tengo que hacer algo como:¿Cómo manejar el entorno de configuración en makefile?

setup library1 
setup library2 
source some_other_setup_script.bash 
g++ blah.c 
# setup is a executable on my system that run some scripts 

¿Cómo puedo escribir un makefile que logra eso? Por lo que he intentado, la exportación de variable env no se traslada (es decir, "export VAR = remember; echo $ VAR" no funcionará)

Respuesta

5

Si la exportación variable no funciona de la manera que lo hace en su línea de comandos, eso sugiere que Make está eligiendo un shell diferente al que está usando, con diferente sintaxis para manejar variables (export VAR=remember; echo $VAR funciona bien para mí). Realice los usos /bin/sh de forma predeterminada, pero puede anular esto con la variable SHELL, que hace que no importe importar del entorno. Sugiero configurar SHELL (en el Makefile) para lo que sea que estés usando en tu entorno y probando el experimento export VAR=remember nuevamente.

+0

También me doy cuenta de que debería usar $$ VAR para que make no piense que estoy citando una macro ... – polyglot

+3

Realmente no significa eso. GNU make simplemente ejecuta un nuevo shell para cada línea en el comando. (Sospecho que combinó los dos comandos con, por brevedad) http://www.gnu.org/software/make/manual/make.html#Execution "Cuando es hora de ejecutar comandos para actualizar un objetivo, se ejecutan invocando una nueva subcadena para cada línea de comando ". –

3

En última instancia, tendrá que definir la variable y ejecutar el compilador en un shell lista o incluso una secuencia de comandos, en lugar de comandos separados make. Sin embargo, hay un par de mejoras que podrías agregar. Se podría decir make sobre el guión:

maintarget: script.sh blah.c 
    source script.sh; g++ blah.c 

script.sh: 
    setup include script here 

Otra cosa sería que sólo hay que ejecutar todas esas cosas en la misma carcasa

maintarget: blah.c 
    run this; run that; run the other thing; g++ blah.c 

creo que todos los make versiones se ejecutará una lista ; en la misma cáscara , pero siempre puede forzar una subshell con (list) o al invocar específicamente un script de shell como contenedor de comandos del compilador.

No olvides que los objetivos adecuados dependen de tus propios scripts. Por cierto, algunas versiones make (pmake aka bsd make) pueden ejecutar un comando al definir una variable make, y todas las versiones de make las exportan. Pero no creo que gmake pueda hacer eso.

1

Puede escribir otro script de shell que ejecute todos esos comandos, y luego imprime las asignaciones de variables que make puede usar. Ejecute el script, canalice su salida a un archivo, luego incluya ese archivo desde su Makefile. Por ejemplo:

Makefile:

all: 
    echo $(FOO) 

test.mk: test.sh 
    ./$< > $@ 

include test.mk 

test.sh

echo "FOO=1" 

Running "hacer" en el directorio que contiene este Makefile produce:

make: Entering directory `/home/luser/build/mktest' 
Makefile:7: test.mk: No such file or directory 
./test.sh > test.mk 
make: Leaving directory `/home/luser/build/mktest' 
make: Entering directory `/home/luser/build/mktest' 
echo 1 
1 
make: Leaving directory `/home/luser/build/mktest' 

maquillaje crea test.mk ejecutando el script de shell, luego lo incluye. test.mk contiene el resultado de test.sh y se analiza como un Makefile. Ver http://www.gnu.org/software/make/manual/make.html#Include para más detalles.
Utilizamos una variante de esto en el cliente de Mozilla.mk dejar que se definen opciones en un archivo "mozconfig": http://mxr.mozilla.org/mozilla-central/source/client.mk#138

11

También puede agregar variables de entorno correctamente con la maquinaria de GNU make, así:

export TEST:="Something Good!" 
test: 
    echo $$TEST 

Este (creo) tiene diferente la semántica de:

TEST2:="Something not quite so useful?" 
test2: 
    echo ${TEST2} 

Qué (otra vez, creo) hace la sustitución dentro de maquillaje antes de pasar junto a la cáscara. Tenga en cuenta que el comando de exportación no funciona dentro de un bloque de destino, solo no se ha invalidado como un comando ejecutado inmediatamente.

0

Restatement: ¿Cómo obtengo una variable de shell en un archivo make?

Algo así como:

MYVAR := $(shell echo $(MYVAR)) <any_makefile_additions_here> 

Así, esto define MYVAR dentro de una MAKE cuando se establece también una variable de entorno denominada MYVAR.

0

Puede ser interesante que, para anular una opción que ya está definida en un archivo MAKE, make sea compatible (me refiero a GNU Make 3.82, pero probablemente también a otra versión) la opción -e. Ejemplo:

Makefile:

CC=gcc 
... 

Run make:

CC=gcc-4.7 
make -e 

utilizará gcc-4.7 en lugar de gcc.

Cuestiones relacionadas