2012-05-24 32 views
1

我有一个Makefile,如果它在最近一小时内没有发生,它会执行一项任务。它这样做是这样的:在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) [email protected] 

.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

我不是在未来与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 [email protected] 
+0

评论评论我是为什么你有shell在子shell命令中启动命令。通常$()产生一个子shell。是否使文件具体? –

+0

“shell”是一个makefile函数。请参阅http://www.gnu.org/software/make/manual/make.html。它可能看起来像Bash,但有一些显着的差异。 $(shell ...)在子shell中运行“...”。 $(...)只是对名为“...”的变量的变量引用 - 而在bash中,$()是子shell语法。 –

+0

这是有道理的,谢谢你的链接。 –

0

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

+0

如果我删除它,那么它会在每次运行“make”时拉动更改。如果我们还没有在最后一个小时内拉动,整个观点就是拉动... –

+0

任何时候都很高兴。 –