在Makefile变量中使用`date`

时间:2016-12-24 19:12:55

标签: 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

我试过(没有成功):

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

我收到此错误:

$ 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
$

我遵循https://stackoverflow.com/a/14939434/3313834和Simply扩展变量https://www.gnu.org/software/make/manual/html_node/Flavors.html#Flavors

的建议

1 个答案:

答案 0 :(得分:6)

使用TAB字符缩进的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)`