在Makefile变量中使用'date'

在Makefile变量中使用'date',makefile,gnu-make,Makefile,Gnu Make,使用GNU Make 4.1,在我的Makefile中,我可以创建一个带有以下内容的时间戳日志文件: flush_log: @echo "==> flush logs" cat file > file_`date +%FT%T%Z`.log 但谁该说: file_`date +%FT%T%Z`.log 在Makefile内的var中,例如在其上生成wc 我尝试过(没有成功): 我得到这个错误: $ make flush_log ==> flu

使用GNU Make 4.1,在我的Makefile中,我可以创建一个带有以下内容的时间戳日志文件:

flush_log:
        @echo "==> flush logs"
        cat file > file_`date +%FT%T%Z`.log
但谁该说:

file_`date +%FT%T%Z`.log
在Makefile内的var中,例如在其上生成
wc

我尝试过(没有成功):

我得到这个错误:

$ make flush_log
==> flush logs
logfile:=file_2016-12-24T20:09:52CET.log
/bin/sh: 1: logfile:=file_2016-12-24T20:09:52CET.log: not found
Makefile:7: recipe for target 'flush_log' failed
make: *** [flush_log] Error 127
$
我遵循了来自的建议,只是简单地扩展了变量

makefile中的每一行(出现在规则语句之后)都缩进了制表符,这是规则配方的一部分。规则配方中的行被传递到shell进行处理,make不会解析它们(除了展开变量/函数引用)

因此,您的行
logfile:=file…
将被传递到shell并由shell解释。。。shell中没有有效的
:=
操作符,因此shell认为整行是一个单词,并尝试运行一个具有该名称的程序,而该名称显然不存在

您可能希望创建一个make变量,该变量必须在配方之外完成,如下所示:

logfile := file_$(shell date +%FT%T%Z).log
flush_log:
        @echo "==> flush logs"
        cat my_log > $(logfile)
        echo `wc -l $(logfile)`
logfile := file_$(shell date +%FT%T%Z).log
flush_log:
        @echo "==> flush logs"
        cat my_log > $(logfile)
        echo `wc -l $(logfile)`