我需要 Makefile 中的依赖项,如果自依赖它的文件以来 URL 已更新,则该依赖项会触发。情况有点复杂:
- URL 1 指向下载页面。我希望该规则取决于此页面的最后修改日期。
- URL 1 的页面内容有一个嵌入的 URL,指向我要下载的实际文件(称为 URL 2)。
我写了一个Python脚本(最后修改) 将创建(通过调用“touch”)一个与 URL 具有相同修改日期的文件。因此现在Makefile
看起来像这样:
output_file: .input_url source_file
wc -l source_file > $@
source_file: .input_url
wget -q -O $@ --no-use-server-timestamps `cat .input_url`
.input_url: .input_modified
wget -q -O - $(DOWNLOAD_URL) | \
sed -n '1,/current version/d;\
/Previous versions/,$$d;
s/.*href="\\([^"]*\\):,*/\\1/p' > $@
lastmod -t $@ $(DOWNLOAD_URL)
.input_modified: FORCE
lastmod -t $@ $(DOWNLOAD_URL)
FORCE:
其中 DOWNLOAD_URL 设置为下载页面。要点是,我希望仅当下载页面自创建以来已被修改时才生成 .input_url。为此,我需要始终重新生成 .input_modified,但仅当(新生成的).input_modified 具有较晚的修改时间时才生成 .input_url。我不知道如何将“运行此规则”的概念与“告诉依赖于此规则的事物运行”区分开来。如果我省略“FORCE”,则 .input_modified 的规则不会运行。如果我将其放入,它始终会运行,但 .input_url 的规则也是如此。有什么方法可以实现我想要的吗?
答案1
您可能想要定义一个仅订购先决条件超过.input_modified目标,这执行如果修改测试,
output_file: .input_url source_file
wc -l source_file > $@
source_file: .input_url
wget -q -O $@ --no-use-server-timestamps `cat .input_url`
.input_url: .input_modified
wget -q -O - $(DOWNLOAD_URL) | \
sed -n '1,/current version/d;\
/Previous versions/,$$d;
s/.*href="\\([^"]*\\):,*/\\1/p' > $@
lastmod -t $@ $(DOWNLOAD_URL)
.input_modified: | if_modified_test # as order-only-prerequisite
.PHONY: if_modified_test # test it
if_modified_test:
lastmod -t .input_modified $(DOWNLOAD_URL)