我有一个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中执行定期任务)
答案 0 :(得分: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 $@
我正在使用与此非常相似的方法来定期刷新登录令牌。
如果不是Dave的回答,那就永远不会想到。
通过将目录指定为order-only-prerequisite
来创建目录答案 1 :(得分:0)
我怀疑+ 3600有错。如果删除它会发生什么?
答案 2 :(得分: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 $@