学习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 "$@"
答案 0 :(得分:1)
要在%.tar.bz2
规则的命令中获取目标名称的文件名部分,您可以使用the notdir function或the $(@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)