Here is a simple Makefile.
FILENAME=test.`date +"%Y.%m.%d %H:%M:%S"`.txt
test:
@echo ${FILENAME}
@sleep 2s
@echo ${FILENAME}
The output of make test
is
test.2013.02.18 15:30:23.txt
test.2013.02.18 15:30:25.txt
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 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
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
Seen like this it should be obvious that the shell runs the date
command twice.
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