2015-10-22 24 views
1

假設我有一個規則來構建一個大目標,並且運行時間太長。 它沒有任何依賴關係。如何在Makefile中使用TTL實現規則

例如,從Internet上下載一些內容可能是一項任務,例如下載大量頁面以供日後處理的網絡爬蟲。

我想只在最近一次運行超過1天/小時/分鐘前生成大目標。所以任務有TTL,有時間離開。

我可以通過下面的這個make文件來完成它。

如果有人制作「全部」目標,那麼只有在自上次構建之後超過5秒時纔會製作big_target和small_target。

有沒有人有另一個建議或與make這樣做的規範方式?

.PHONY: all update_times 
all: update_times big_target small_target 

update_times: 
    @for f in TTL_* ;\ 
    do\ 
     seconds=$${f##TTL_};\ 
     if ((`date +%s` - `date +%s -r $$f` > $${seconds}));\ 
     then\ 
      echo "$$f is too old";\ 
      echo $$((`date +%s` - `date +%s -r $$f`)) ;\ 
      rm $$f;\ 
     else\ 
      echo "$$f is up to date";\ 
     fi;\ 
    done 

TTL_%: 
    touch [email protected] 

big_target: TTL_5 
    touch big_target 

small_target: big_target 
    touch small_target 

回答

0

你的建議的方法有一些東西,我不喜歡:最突出的,它具有update_timesbig_target目標之間隱含的順序關係,這是一般可避免(在makefile中關係真正需要的是明確的,沒有暗示)。

我不認爲有任何需要一個不同的目標。也許這樣的事情會更好?

(PS TTL一般是 「時間現場」,而不是 「離開的時候」):

big_target_TTL := 5 

.PHONY: all 
all: big_target small_target 

big_target: 
     secs=$$((`date +%s` - `date +%s -r [email protected]`)); \ 
     if [ $$secs -gt $([email protected]_TTL) ]; \ 
     then \ 
      echo "[email protected] is too old"; \ 
      echo $$secs; \ 
      touch [email protected]; \ 
     else \ 
      echo "[email protected] is up to date"; \ 
     fi 

small_target: big_target 
     touch small_target