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
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)'). –
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