假设我有一个规则来构建一个大目标并且运行时间太长。 它没有任何依赖。
例如,从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
答案 0 :(得分:0)
您建议的方法有一些我不喜欢的内容:最突出的是,它在update_times
和big_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