2015-10-22 5 views
1

Предположим, у меня есть правило для создания большой цели и занимает слишком много времени для запуска. У него нет зависимостей.Как реализовать правила с TTL в Makefile

Например, может потребоваться загрузить некоторый контент из Интернета, например веб-искатель, который загружает большое количество страниц для последующей обработки.

Я хочу сгенерировать большую цель, только если ее последний прогон был более 1 дня/час/минуту назад. Таким образом, задача имеет TTL, время уходить.

Я могу выполнить его через этот файл make ниже.

Если вы делаете цель «все», то big_target и small_target будут сделаны только в том случае, если прошло более 5 секунд с момента их создания.

Есть ли у кого-нибудь другое предложение или канонический способ сделать это с помощью 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 и целями, которые, как правило, следует избегать (отношения в Makefiles действительно должны быть четко , не подразумевается).

Я не думаю, что есть необходимость в другой цели. Может, что-то вроде этого будет работать лучше?

(. 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