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

我遇到的问题是,如果我用 somefunc 转换 URL,我会丢失 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为目标之一。
  • $(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 回答