Linux 使用Makefile规则下载文件

Linux 使用Makefile规则下载文件,linux,download,makefile,wget,Linux,Download,Makefile,Wget,我的计划是: 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 cont

我的计划是:

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,如果我不使用它,我就不能将它用作目标,以避免在它已经存在时被下载


有什么想法吗?

在这一点上,我认为你不能直接用make来做。但如果您愿意使用一些脚本,这里有一个解决方案:

$(URLS):
    @for url in ${URLS}; do \                                               
        if [ ! -e $$(somefunc $${url}) ]; then \
            echo wget $${url}; \
            wget $${url}; \
        fi \
    done

如果
somefunc
只修改路径,而不是实际的文件名,并且没有重复的文件名,则可以尝试搜索原始文件名

也许是这样的?(未经测试)

  • $(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://
在上面?

但是每次缺少一个目标时,它都会下载所有的URL。我想用Makefile解决方案,而不是依靠wget同时下载多个URL。@Yogur-好的,我已经完全修改了我的解决方案。
$(somefunc $URLS): #somefunc produces downloads/file1.tar.gz downloads/file2.tar.gz
   mkdir -p $(dir $@)
   wget $(filter $(addprefix %/,$(notdir $@)),$(URLS)) -O $@