0

私は次のようなものを計画していました:

URLS=www.host.com/file1.tar.gz www.host2.com/file2.tar.gz
$(somefunc $URLS): #somefunc produces downloads/file1.tar.gz downloads/file2.tar.gz
   mkdir -P downloads
   wget whatever # I can't get the real url here because the targets don't contain the full url anymore

myproject: $(somefunc URLS)
   #Files should already be in downloads/ here

私が抱えている問題は、URL を somefunc で変換すると URL が失われることです。そうしないと、既にそこにあるときにダウンロードされるのを避けるために、それをターゲットとして使用できません。

何か案は?

4

2 に答える 2

1

実際のファイルsomefunc名ではなくパスのみを変更し、重複がない場合は$(URLS)、元のファイル名を検索してみてください。

多分このようなもの?(未テスト)

$(somefunc $URLS): #somefunc produces downloads/file1.tar.gz downloads/file2.tar.gz
   mkdir -p $(dir $@)
   wget $(filter $(addprefix %/,$(notdir $@)),$(URLS)) -O $@
  • $(notdir $@)file1.tar.gzターゲットの1つに対して評価します。
  • $(addprefix %/,file1.tar.gz)に評価します%/file1.tar.gz
  • $(filter %/file1.tar.gz,www.host.com/file1.tar.gz www.host2.com/file2.tar.gz)に評価されwww.host.com/file1.tar.gzます。

(おそらくあなたhttp://もそこにいたいですか?)

于 2010-02-13T18:14:59.073 に答える
0

現時点では、make で直接行うことはできないと思います。ただし、スクリプトを使用する場合の解決策は次のとおりです。

$(URLS):
    @for url in ${URLS}; do \                                               
        if [ ! -e $$(somefunc $${url}) ]; then \
            echo wget $${url}; \
            wget $${url}; \
        fi \
    done
于 2010-02-13T17:59:08.127 に答える