这是一个简单的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具有两种变量.您已经使用了递归扩展的变量,但是想要一个简单扩展的变量.参见 www.gnu/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 www.gnu/software/make/manual/html_node/Flavors.html#Flavors
对于当前的Makefile,变量包含确切的文本test.date +"%Y.%m.%d %H:%M:%S" .txt ,并且每次引用该变量时,该文本都会被逐字替换,因此您的Makefile等效于:
With your current Makefile, the variable contains the exact text test.date +"%Y.%m.%d %H:%M:%S".txt and every time you reference it that text gets substituted verbatim, and so your Makefile is equivalent to:
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中使用变量
发布评论