2017-04-06 132 views
0

我試圖將* .s文件作爲輸入,並將擴展名爲.txt的文件作爲輸出文件去除。我以爲我可以使用($basename ...)立即綁定,但這不起作用。我的小例子:Makefile:immedate任務評估懶惰?

INPUT := *.s 
OUTPUT := $(basename $(INPUT)) 

all: 
    echo 'input:' $(INPUT) 
    echo 'output:' $(OUTPUT) 
運行時

,產生

echo 'input:' *.s 
input: hello.s int3.s 
echo 'output:' * 
output: Makefile int3 hello hello.o hello.s int3.s 

我以爲:=將迫使即時評價,但似乎真正做一個懶惰的結合,以及基本名稱去掉了「.S」來自 」*」。因此這將導致目錄中的所有文件。如何得到這只是給我的擴展名刪除的.s文件?

回答

1

你需要更換:

INPUT := *.s 

有:

INPUT := $(wildcard *.s) 

*.s第一個原因直接分配給INPUT,你不希望 。第二個導致立即分配文件名列表$(wildcard *.s)的擴展 ,你確實需要。

4.4.1 Wildcard Examples 及注意事項:當你定義一個變量

通配符擴展不會發生。因此,如果你這樣寫:

objects = *.o 

那麼變量對象的值是實際字符串「*的.o」。 [...] 爲對象設置爲擴展,而是使用:

objects := $(wildcard *.o) 
+0

因此,如果':='並不意味着「評估*」,它是如何從'='操作不同? – Ant6n

+0

@ Ant6n嗨。查看更新。 –