5
Obecnie napotykam problem z plikiem Makefile spowodowanym przez ocenę zmiennej make. Zmniejszyłem złożoność, pozostały tylko istotne elementy, które powodują problem.Zmienna ekspansja/ocena pliku Makefile
- $ (lista) jest oceniany jako lista plików Makefile, gdy jest czytana.
- Podczas step1 jeden z tych plików został usunięty.
- Po użyciu zmiennej w step2 nie jest ona ponownie oceniana, a tym samym nie jest poprawna, co prowadzi do błędu podczas wykonywania polecenia kopiowania.
- Byłoby miło, gdyby zmienna została oceniona w momencie jej użycia, tutaj podczas step2.
Jakieś pomysły na rozwiązanie lub obejście tego problemu?
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
rejestrowanie wykonywania:
$ 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
Powodem tego jest to, że działa string „src/*. Txt” umieszcza verbatim do '' echo' i poleceń cp', gdzie powłoka rozszerza go ponownie dla każdego polecenia (zamiast 'make' , które rozwijało '$ (wildcard)'). –
ponieważ zmienna jest rozwinięta po wywołaniu receptury (użyła "=" dla odroczonego rozwinięcia, a nie ": =" dla natychmiastowego lub prostego rozwinięcia), można by oczekiwać, że oryginalny plik Makefile zadziała. Oto problem: dla wydajności GNU robi pamięci podręczne zawartości katalogów. Tak więc, jeśli wprowadzisz zmiany w strukturze katalogów w sposób, który nie rozpoznajesz, możesz dostać się do tych sytuacji, w których make idea, jakie pliki istnieją, nie pasuje do rzeczywistości. – MadScientist