2012-01-27 16 views
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 

Odpowiedz

7

Nie używaj funkcji wieloznaczny.

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

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

+3

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

Powiązane problemy