2013-02-18 85 views
1

這是一個簡單的Makefile。在Makefile中使用變量

FILENAME=test.`date +"%Y.%m.%d %H:%M:%S"`.txt 
test: 
    @echo ${FILENAME} 
    @sleep 2s 
    @echo ${FILENAME} 

make test輸出是

test.2013.02.18 15:30:23.txt 
test.2013.02.18 15:30:25.txt 

的問題是,FILENAME被它每次使用時進行計算。我希望它只被計算一次,並且在腳本運行時相同。我做錯了嗎?

回答

4

GNU Make有兩種風格的變量。您已使用遞歸展開的變量,但您想要一個簡單展開的變量。見http://www.gnu.org/software/make/manual/html_node/Flavors.html#Flavors

根據您目前的Makefile中,該變量包含確切文本test.date +"%Y.%m.%d %H:%M:%S" .TXT和每次引用它的文本被逐字取代,所以你的Makefile等同於:

test: 
    @echo test.`date +"%Y.%m.%d %H:%M:%S"`.txt 
    @sleep 2s 
    @echo test.`date +"%Y.%m.%d %H:%M:%S"`.txt 

見過像這應該很明顯,shell運行兩次date命令。

爲了得到你想要的行爲,您需要設置一個簡單的擴展變量,你需要在你定義它的點,不能使用反引號,因爲它們是Shell元字符,但要忽略運行shell命令他們,所以你用Make的shell函數代替:

FILENAME := test.$(shell date +"%Y.%m.%d %H:%M:%S").txt 
+0

太好了,非常感謝! – 2013-02-18 15:27:28