在Makefile中使用变量 [英] Using variables in Makefile
问题描述
这是一个简单的Makefile.
Here is a simple 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
时都在计算它.我希望只计算一次,并且在脚本运行时保持不变.我做错了吗?
The problem is that FILENAME
is being calculated each time it is used. I want it to be calculated only once and be the same while script is running. Am I doing it wrong?
推荐答案
GNU Make具有两种变量.您已经使用了递归扩展的变量,但是想要一个简单扩展的变量.参见 http://www.gnu.org/software/make/manual/html_node/Flavors.html#Flavors
GNU Make has two flavours of variables. You have used a recursively-expanded variable, but you want a simply-expanded variable. See http://www.gnu.org/software/make/manual/html_node/Flavors.html#Flavors
对于当前的Makefile,变量包含确切的文本test.
,并且每次引用该变量时,该文本都会被逐字替换,因此您的Makefile等效于:date +"%Y.%m.%d %H:%M:%S"
.txt
With your current Makefile, the variable contains the exact text test.
and every time you reference it that text gets substituted verbatim, and so your Makefile is equivalent to:date +"%Y.%m.%d %H:%M:%S"
.txt
test:
@echo test.`date +"%Y.%m.%d %H:%M:%S"`.txt
@sleep 2s
@echo test.`date +"%Y.%m.%d %H:%M:%S"`.txt
这样看来,外壳程序两次运行date
命令应该很明显.
Seen like this it should be obvious that the shell runs the date
command twice.
要获得所需的行为,您需要设置一个简单扩展的变量,并且需要在定义变量的位置运行shell命令,该命令不能使用反引号,因为反引号是shell的元字符,但Make会忽略它们,因此您可以使用Make的shell
函数:
To get the behaviour you want, you need to set a simply-expanded variable and you need to run the shell command at the point where you define it, which can't use backticks because they are shell metacharacters but Make ignores them, so you use Make's shell
function instead:
FILENAME := test.$(shell date +"%Y.%m.%d %H:%M:%S").txt
这篇关于在Makefile中使用变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!