2012-04-15 4 views
6

Aquí es un Makefile simplificado:¿Cómo establecer variables de entorno en la receta de archivo MAKE?

all: 
    @for ((i = 0; i < 5; ++i)); do \ 
     var="$$var $$i"; \ 
     echo $$var; \ 
    done 
    @echo $$var 

supongo que el valor de "var" es "0 1 2 3 4", pero la salida es:

0 
0 1 
0 1 2 
0 1 2 3 
0 1 2 3 4 
       <--- NOTHING!!! 

Como se puede ver el último echo es "NADA". ¿Qué está mal?

+0

Sospecho que cada comando receta se invoca en un subnivel, por lo que el "var" se define en la primera receta no se puede hacer referencia en la segunda línea. ¿Es esto correcto? –

Respuesta

10

De here:

Cuando es el momento de ejecutar recetas para actualizar un objetivo, se ejecutan mediante la invocación de un nuevo subnivel para cada línea de la receta ...

Tenga en cuenta: esto implica que establecer variables de shell e invocar comandos de shell como cd que establecen un contexto local para cada proceso no afectarán las siguientes líneas en la receta. Si desea usar cd para afectar la siguiente declaración, coloque ambas declaraciones en una sola línea de receta. Entonces make invocará un shell para ejecutar la línea completa, y el shell ejecutará las instrucciones en secuencia.

intente lo siguiente:

all: 
    @for ((i = 0; i < 5; ++i)); do \ 
     var="$$var $$i"; \ 
     echo $$var; \ 
    done; \ 
    echo $$var 
+0

Sí, funciona! ¡Gracias! Hay tantas trampas en Makefile ~ –

+0

@Li, eres bienvenido –

Cuestiones relacionadas