2012-05-24 71 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

任何時候都很高興。 –