Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile配方中的日期_Makefile_Gnu Make - Fatal编程技术网

Makefile配方中的日期

Makefile配方中的日期,makefile,gnu-make,Makefile,Gnu Make,我想创建带有时间戳的日志文件。在我的Makefile中,我得到的日期如下: DATE = $(shell date '+%Y-%m-%d-%H:%M:%S') 在我的食谱中,我对日志文件进行了几次grep: my_long_run: cd $(MYDIR); Running a tool for a long time | tee -i ./Log/my_long_run_log.$(DATE) @sleep 2 @grep -iq "Status of the

我想创建带有时间戳的日志文件。在我的Makefile中,我得到的日期如下:

DATE                = $(shell date '+%Y-%m-%d-%H:%M:%S')
在我的食谱中,我对日志文件进行了几次grep:

my_long_run: 
cd $(MYDIR); Running a tool for a long time | tee -i ./Log/my_long_run_log.$(DATE)
@sleep 2
@grep -iq "Status of the Job:0" Log/my_long_run_log.$(DATE)
@if [ ! -z "$(SOME_ENV_VAR)" ]; then ln -fs $(ANOTHER_ENV_VAR)/my_generate_file; fi; \
echo "$$dependencyTree" > $@; \
echo -e "\nWarning Summary:" >> $@; \
if grep -iq "warn.*total" Log/my_long_run_log.$(DATE)  ; then grep -i "warn.*total" Log/my_long_run_log.$(DATE) >> $@;  fi; \
if grep -iq "warn.*check" Log/my_long_run_log.$(DATE) ; then grep -i "warn.*check" Log/my_long_run_log.$(DATE) >> $@; fi; \
echo -e "\nError Summary:" >> $@; \
if grep -iq "error.*total" Log/my_long_run_log.$(DATE) ; then grep -i "error.*total" Log/my_long_run_log.$(DATE) >> $@; fi; \
if grep -iq "error.*check" Log/my_long_run_log.$(DATE) ; then grep -i "error.*check" Log/my_long_run_log.$(DATE) >> $@; fi;
问题是: 在第一行,日期扩展为:2020-02-26-09:14:09。 但是grep命令会查找带有时间戳的文件:2020-02-26-09:14:10 grep:Log/my_long_run_Log.2020-02-26-09:14:10:没有这样的文件或目录 gmake:**[my_long_run]错误2。 当然,因为grep失败,我需要以6-7小时的运行时间重复这个运行

sleep 2
这是故意的。因为我的服务器有一些滞后,文件需要一段时间才能出现。但是,据我所知,Makefile在执行命令之前扩展了所有的方法。为什么$(日期)对于一个配方有两个值?
很抱歉,没有提供实际的MWE,而是一个抽象的MWE。非常感谢您的帮助。

您需要使用
:=
来定义变量,而不是
=
。使用
=
时,每次引用它时都会对其进行求值,而使用
:=
时,仅在您定义它时才对其进行求值,然后再使用它的值

这在中进行了解释,其中使用
:=
定义的变量称为
简单扩展变量
,使用
=
定义的变量称为
递归扩展变量

定义变量时,将一次性扫描简单扩展变量的值,并将任何引用扩展到其他变量和函数

您的Makefile将如下所示:

DATE := $(shell date '+%Y-%m-%d-%H:%M:%S')