1

这是一个简单的 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

1 回答 1

4

GNU Make 有两种变量。您使用了递归扩展变量,但您想要一个简单扩展变量。见http://www.gnu.org/software/make/manual/html_node/Flavors.html#Flavors

对于您当前的 Makefile,该变量包含确切的文本,并且每次您引用它时,该文本都会被逐字替换,因此您的 Makefile 相当于:test.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

这样看来,shell 运行date命令两次应该很明显。

要获得您想要的行为,您需要设置一个简单扩展的变量,并且您需要在定义它的位置运行 shell 命令,它不能使用反引号,因为它们是 shell 元字符,但 Make 会忽略它们,所以你改用 Make 的shell函数:

FILENAME := test.$(shell date +"%Y.%m.%d %H:%M:%S").txt
于 2013-02-18T15:12:51.320 回答