2012-01-27 17 views
5

Actualmente estoy frente a un problema con mi Makefile causado por la evaluación de una variable de maquillaje. Reduje la complejidad, solo quedan los elementos esenciales que producen el problema.Makefile expansión de variables/Evaluación

  • $ (lista) se evalúa como una lista de archivos cuando se lee el Makefile.
  • Durante el paso 1 uno de esos ficheros es borrado.
  • Cuando se utiliza la variable en el paso 2 no se evalúa de nuevo y por lo tanto no es válido más que conduce a un error durante la ejecución de la copia.
  • Sería bueno si la variable se evaluó en el momento en que se utiliza, aquí durante el paso 2 .

¿Alguna idea de cómo solucionar este problema o solucionar este problema?


Makefile:

LIST=$(wildcard src/*.txt) 

all: step1 step2 

step1: 
    @echo "---------- step1 ----------" 
    @echo $(LIST) 
    rm src/q1.txt 
    ls src 

step2: 
    @echo "---------- step2 ----------" 
    @echo $(LIST) 
    cp $(LIST) ./dst 

Ejecución de registro:

$ make 
---------- step1 ---------- 
src/q1.txt src/q2.txt 
rm src/q1.txt 
ls src 
q2.txt 
---------- step2 ---------- 
src/q1.txt src/q2.txt 
cp src/q1.txt src/q2.txt ./dst 
cp: cannot stat `src/q1.txt': No such file or directory 
make: *** [step2] Error 1 

Respuesta

7

No utilice la función de comodín.

LIST = src/*.txt 

all: step1 step2 

step1: 
    @echo "---------- step1 ----------" 
    @echo $(LIST) 
    rm src/q1.txt 
    ls src 

step2: 
    @echo "---------- step2 ----------" 
    @echo $(LIST) 
    cp $(LIST) ./dst 
+2

La razón por la que esto funciona es que la cadena "src/*. Txt" se coloca en el pie de la letra '' echo' y comandos cp', donde el shell expande de nuevo para cada comando (en lugar de 'make' , que hizo la expansión de '$ (comodín)'). –

+3

ya que la variable se expande cuando se invoca la receta (que usa "=" para la expansión diferida no ": =" de inmediato, o simple, expansión) se esperaría que el makefile originales para trabajar. Aquí está el problema: para la eficiencia, GNU hace que los cachés contengan el contenido de los directorios a medida que avanza. Por lo tanto, si se realizan cambios en la estructura de directorios de una manera maquillaje no reconoce, puede entrar en estas situaciones en las que la idea de hacer de lo que existen archivos no coincide con la realidad. – MadScientist