make 中的 URL 依赖

make 中的 URL 依赖

我需要 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)

相关内容