make:依赖项中的text-function

时间:2011-10-17 21:09:40

标签: makefile

学习make,在下面的Makefile中,如何将%.tar.bz2的依赖关系定义为somefile.tar.bz2

它会是这样的: %.tar.bz2: $(function_to_cut_from_end_till_/ %.tar.bz2) 但我在man make找不到如何做到这一点。

我是从错误的一方接近这个吗?

source=http://example.net/somefile.tar.bz2
source:=$(subst :,\:,$(source))

.PHONY: download

download: $(source)

%.tar.bz2:
        @wget "$@"

2 个答案:

答案 0 :(得分:1)

要在%.tar.bz2规则的命令中获取目标名称的文件名部分,您可以使用the notdir functionthe $(@D) variable

但是,实际上,您应该使目标名称与输出文件匹配,以便make可以检查文件是否存在,并且每次运行时都不会尝试重新下载它。一个简单的方法是

source=somefile.tar.bz2

.PHONY: download

download: $(source)

%.tar.bz2:
        @wget "http://example.net/$@"

或者,如果你有不同的源档案可以从不同的位置下载(我想你会这样做,否则为什么还要使用模板规则?),你可以使用target-specific variable来存储下载URL,像这样

source=somefile.tar.bz2 some-other-file.tar.bz2
somefile.tar.bz2: URL=http://example.net
some-other-file.tar.bz2: URL=http://example.org/foobar

.PHONY: download

download: $(source)

%.tar.bz2:
        @wget "$(URL)/$@"

答案 1 :(得分:0)

嗯,没有理由太复杂 - 尽管可能这样做,但这样做不会更具可读性:

domain=http://example.net/
filename=somefile.tar.bz2
source=$(DOMAIN)$(FILENAME)

然后文件名就在那里使用

您也可以尝试

$(patsubst %/,,$(source))

哪个应该从$(source)

删除最后一个正斜杠的所有内容