1

我有一个 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.

任何人都知道如何抑制这些警告?(或在生成文件中执行定期任务)

4

3 回答 3

1

我遇到的大多数触摸版本都可以进行一些日期时间数学运算,从而允许直接通过--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 $@

我正在使用与此非常相似的东西来定期刷新登录令牌。

如果不是戴夫的回答,永远不会想到它。


该目录是通过将其指定为order-only-prerequisite来创建的

于 2020-08-28T16:26:13.623 回答
0

我怀疑+ 3600有问题。如果删除它会发生什么?

于 2012-05-24T01:36:42.030 回答
0

我想了又想,然后愚蠢的明显解决方案击中了我......

我没有使用 HOUR_FROM_NOW 设置未来的时间戳,而是使用实时并与 HOUR_AGO_FILE 进行比较...

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 $@
于 2012-05-24T03:07:21.937 回答