makeのURL依存関係

makeのURL依存関係

URLに依存するファイルの後にURLが更新された場合は、実行されるMakefileに依存関係が必要です。状況は少し複雑です。

  • 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)

おすすめ記事