2012-01-27 166 views
5

目前,我正面臨着一個由我的Makefile引起的問題,它是由一個make變量的評估引起的。我減少了複雜性,只剩下產生問題的基本要素。在讀取Makefile文件時Makefile可變擴展/評估

  • $(LIST)作爲文件列表進行評估。
  • 步驟1其中一個文件被刪除。
  • 當使用步驟2中的變量時,它不再被評估,因此不再有效,從而導致複製命令期間發生錯誤。
  • 如果變量在使用時被評估,這裏會很好,這裏是第2步

任何想法如何解決或解決此問題?


的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 

執行日誌:

$ 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 

回答

7

不要使用通配符功能。

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

這工作的原因是字符串「SRC/*。TXT」被逐字放入'echo'和'cp'命令,其中所述殼再次展開爲每個命令(而不是'make' ,它擴展了$(通配符)')。 – 2012-01-27 20:06:53

+3

因爲變量在調用配方時被擴展(它使用「=」作爲延遲擴展而不是「:=」用於立即或簡單的擴展),你會期望原始的makefile起作用。問題在於:爲了提高效率,GNU將緩存作爲目錄的內容。因此,如果您以某種無法識別的方式對目錄結構進行更改,則可能會遇到這樣的情況,即讓make瞭解存在的文件與現實不符。 – MadScientist 2012-01-28 16:42:01