Time 压制;时钟歪斜“;Makefile中的未来时间警告

Time 压制;时钟歪斜“;Makefile中的未来时间警告,time,makefile,gnu-make,Time,Makefile,Gnu Make,我有一个Makefile,如果任务在最后一个小时内没有发生,它会执行任务。它是这样做的: HOUR_FROM_NOW = $(shell perl -e '($$s,$$m,$$h,$$d,$$M)=localtime(time()+3600); printf("%02d%02d%02d%02d\n",$$M+1,$$d,$$h,$$m);') NOW_FILE = $(shell mkdir -p .make; touch .make/now; echo .make/now )

我有一个Makefile,如果任务在最后一个小时内没有发生,它会执行任务。它是这样做的:


HOUR_FROM_NOW = $(shell perl -e '($$s,$$m,$$h,$$d,$$M)=localtime(time()+3600); printf("%02d%02d%02d%02d\n",$$M+1,$$d,$$h,$$m);')
NOW_FILE      = $(shell mkdir -p .make; touch .make/now; echo .make/now )

.PHONY: externals
externals: $(PROJECTS:%=.make/proj_%)
.make/proj_%: $(NOW_FILE)
     $(MAKE) -s $(*F)
     touch -t $(HOUR_FROM_NOW) $@

.PHONY: $(PROJECTS)
$(PROJECTS): 
     # do stuff, specifically, clone git-repo if not exists, else pull latest
这部分效果很好,只是我现在收到了警告:

make: Warning: File `.make/proj' has modification time 3.5e+03 s in the future
make: Nothing to be done for `externals'.
make: warning:  Clock skew detected.  Your build may be incomplete.

有人知道如何抑制这些警告吗?(或在makefile中执行定期任务)

我怀疑+3600有故障。如果拆下它会发生什么情况?

我怀疑+3600有故障。如果你把它拿走会发生什么?

我想了又想,然后愚蠢的显而易见的解决方案击中了我

我没有用HOUR\u FROM\u NOW设置将来的时间戳,而是使用实时并与HOUR\u AGO\u文件进行比较

HOUR_AGO      = $(shell perl -e '($$s,$$m,$$h,$$d,$$M)=localtime(time()-3600); printf("%02d%02d%02d%02d\n",$$M+1,$$d,$$h,$$m);')
HOUR_AGO_FILE      = $(shell mkdir -p .make; touch -t $(HOUR_AGO) .make/hour_ago; echo .make/hour_ago )

.PHONY: externals
externals: $(PROJECTS:%=.make/proj_%)
.make/proj_%: $(HOUR_AGO_FILE)
     $(MAKE) -s $(*F)
     @touch $@

我想了又想,然后愚蠢的显而易见的解决方案击中了我

我没有用HOUR\u FROM\u NOW设置将来的时间戳,而是使用实时并与HOUR\u AGO\u文件进行比较

HOUR_AGO      = $(shell perl -e '($$s,$$m,$$h,$$d,$$M)=localtime(time()-3600); printf("%02d%02d%02d%02d\n",$$M+1,$$d,$$h,$$m);')
HOUR_AGO_FILE      = $(shell mkdir -p .make; touch -t $(HOUR_AGO) .make/hour_ago; echo .make/hour_ago )

.PHONY: externals
externals: $(PROJECTS:%=.make/proj_%)
.make/proj_%: $(HOUR_AGO_FILE)
     $(MAKE) -s $(*F)
     @touch $@

我遇到的大多数touch版本都可以进行一些日期-时间数学运算,允许直接通过
--date
选项设置文件的时间戳

这一点以及分配给
:=
的变量仅“计算一次”这一事实使其更易于阅读

HOUR_AGO := .make/hour_ago
__UGLY := $(shell mkdir -p .make && touch --date='1hour ago' $(HOUR_AGO))
# The preceding line will be executed once

.make/proj_%: .make/hour_ago | .make
    $(MAKE) -s $(*F)
    @touch $@

.make:
    mkdir -p $@
我正在使用类似的东西定期刷新登录令牌

如果不是戴夫的回答,我绝对不会想到这一点



该目录是通过将其指定为一个

来创建的。我遇到的大多数touch版本都可以进行一些日期-时间数学运算,允许直接通过
--date
选项设置文件的时间戳

这一点以及分配给
:=
的变量仅“计算一次”这一事实使其更易于阅读

HOUR_AGO := .make/hour_ago
__UGLY := $(shell mkdir -p .make && touch --date='1hour ago' $(HOUR_AGO))
# The preceding line will be executed once

.make/proj_%: .make/hour_ago | .make
    $(MAKE) -s $(*F)
    @touch $@

.make:
    mkdir -p $@
我正在使用类似的东西定期刷新登录令牌

如果不是戴夫的回答,我绝对不会想到这一点



该目录是通过将其指定为

来创建的。如果我将其删除,则每次运行“make”时它都会进行更改。关键是只有在我们在最后一个小时还没有拉的情况下才拉…如果我删除它,那么每次我运行“make”时它都会拉更改。整个要点是,如果我们在最后一个小时内还没有拉取,那么只拉取…我的评论是,为什么要在子shell命令中使用shell启动命令。通常,$()生成一个子shell。“shell”是一个makefile函数。看见它可能看起来像Bash,但有一些显著的区别$(shell…)在子shell中运行“…”$(…)只是对名为“…”的变量的变量引用,而在bash中,$()是子shell语法。查看注释I是为什么要在子shell命令中使用shell启动命令。通常,$()生成一个子shell。“shell”是一个makefile函数。看见它可能看起来像Bash,但有一些显著的区别$(shell…)在子shell中运行“…”$(…)只是对名为“…”的变量的变量引用,而在bash中,$()是子shell语法。