Makefile配方中的日期
我想创建带有时间戳的日志文件。在我的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
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')