如何在Makefile

时间:2015-10-22 01:52:47

标签: makefile ttl

假设我有一个规则来构建一个大目标并且运行时间太长。 它没有任何依赖。

例如,从Internet下载某些内容可能是一项任务,例如下载大量页面以供以后处理的网络爬虫。

我想生成大目标,只要它的最新运行时间超过1天/小时/分钟。所以任务有一个TTL,是时候离开了。

我可以通过下面的make文件来完成它。

如果有人制作“全部”目标,那么只有在自上次构建以来已经超过5秒时才会生成big_target和small_target。

有没有人有另外的建议或规范方式来做这个?

.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 $@

big_target: TTL_5
    touch big_target

small_target: big_target
    touch small_target

1 个答案:

答案 0 :(得分:0)

您建议的方法有一些我不喜欢的内容:最突出的是,它在update_timesbig_target目标之间存在隐含的顺序关系,这通常是要避免的(关系在makefile确实需要明确,而不是暗示。)

我不认为有任何需要不同的目标。也许这样的事情会更好吗?

(PS.TTL通常是#34;时间生活"而不是"时间离开"):

big_target_TTL := 5

.PHONY: all
all: big_target small_target

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

small_target: big_target
        touch small_target