编写依赖于日期 and/or 时间的 Makefile
writing Makefiles that are dependent on date and/or time
GNU Make 中是否有任何允许依赖日期 and/or 时间的内容?
目前我有一个Makefile
检查是否下载最新的财务数据。目标类似于 stock_symbol.csv
,重要的依赖项是一个名为 last_updated.txt
的文件。 last_updated.txt
每天变化一次,变化时,make
会知道刷新我的历史数据。
烦人的是我最终必须手动更改它,或者让其他程序(例如 cron)按计划修改它。我想知道这里是否有办法消除对外部程序的需求。 Make 有什么东西可以实现这个目标吗?
这是我的礼物Makefile
.PHONY : run
run :
R --quiet -e "shiny::runApp(launch.browser=TRUE)"
# update model
model.RData: model.R data/vix.csv
Rscript fit_model.R
# update data
data/vix.csv: last_updated.txt update_csv.R
Rscript update_csv.R
## remove all target, output and extraneous files
.PHONY: cleanall
cleanall:
rm -f *~ *.Rout *.RData *.docx *.pdf *.html *-syntax.R *.RData
我不是 100% 确定我理解您想要实现的目标。以下假设您想要 运行 完成工作,当且仅当最后一次完成是在 24 小时前或更长时间之前。
您可以使用 GNU make 实现这一点,方法是在每次 运行 make 时首先执行带有 shell
函数的 shell 脚本。为此,我们首先非递归地分配一个 make 变量 (DUMMY := $(shell ...)
)。 shell 脚本触及一个 24 小时前日期的空文件,您使用这个空文件作为时间戳:
TS24 := .timestamp24
DUMMY := $(shell touch -d 'yesterday' "$(TS24)")
job: last_updated.txt
@echo "Let's do the job"
touch "$@"
last_updated.txt: $(TS24)
touch "$@"
每次你 运行 使 .timestamp24
被触摸,使得它的最后修改时间恰好是 24 小时前。因此,如果 last_updated.txt
超过 24 小时,则它比 .timestamp24
早,它的规则被触发并且配方触及它。任何依赖于它的东西也将被重新制作。否则 last_updated.txt
将被视为最新的并且不会导致重新构建依赖它的目标。
然后:
$ make
touch "last_updated.txt"
Let's do the job
touch "job"
$ make
make: 'job' is up to date.
$ touch -d '2 days ago' last_updated.txt
$ make
touch "last_updated.txt"
Let's do the job
touch "job"
GNU Make 中是否有任何允许依赖日期 and/or 时间的内容?
目前我有一个Makefile
检查是否下载最新的财务数据。目标类似于 stock_symbol.csv
,重要的依赖项是一个名为 last_updated.txt
的文件。 last_updated.txt
每天变化一次,变化时,make
会知道刷新我的历史数据。
烦人的是我最终必须手动更改它,或者让其他程序(例如 cron)按计划修改它。我想知道这里是否有办法消除对外部程序的需求。 Make 有什么东西可以实现这个目标吗?
这是我的礼物Makefile
.PHONY : run
run :
R --quiet -e "shiny::runApp(launch.browser=TRUE)"
# update model
model.RData: model.R data/vix.csv
Rscript fit_model.R
# update data
data/vix.csv: last_updated.txt update_csv.R
Rscript update_csv.R
## remove all target, output and extraneous files
.PHONY: cleanall
cleanall:
rm -f *~ *.Rout *.RData *.docx *.pdf *.html *-syntax.R *.RData
我不是 100% 确定我理解您想要实现的目标。以下假设您想要 运行 完成工作,当且仅当最后一次完成是在 24 小时前或更长时间之前。
您可以使用 GNU make 实现这一点,方法是在每次 运行 make 时首先执行带有 shell
函数的 shell 脚本。为此,我们首先非递归地分配一个 make 变量 (DUMMY := $(shell ...)
)。 shell 脚本触及一个 24 小时前日期的空文件,您使用这个空文件作为时间戳:
TS24 := .timestamp24
DUMMY := $(shell touch -d 'yesterday' "$(TS24)")
job: last_updated.txt
@echo "Let's do the job"
touch "$@"
last_updated.txt: $(TS24)
touch "$@"
每次你 运行 使 .timestamp24
被触摸,使得它的最后修改时间恰好是 24 小时前。因此,如果 last_updated.txt
超过 24 小时,则它比 .timestamp24
早,它的规则被触发并且配方触及它。任何依赖于它的东西也将被重新制作。否则 last_updated.txt
将被视为最新的并且不会导致重新构建依赖它的目标。
然后:
$ make
touch "last_updated.txt"
Let's do the job
touch "job"
$ make
make: 'job' is up to date.
$ touch -d '2 days ago' last_updated.txt
$ make
touch "last_updated.txt"
Let's do the job
touch "job"