2013-02-18 115 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