#makefile
#makefile
Вопрос:
Изучая make, в следующем Makefile, как я могу определить зависимость %.tar.bz2
to be 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 "$@"
Комментарии:
1. «function_to_cut_from_end_till_ /» существует и называется «notdir», но: 1. Любые функции, которые вы используете в предварительных условиях правила шаблона, оцениваются только один раз, прежде чем
%
заполнитель заменяется чем-либо другим, и 2. даже игнорируя это, я не вижу, как%.tar.bz2: $(function_to_cut_from_end_till_/ %.tar.bz2)
это полезно сделать. Не могли бы вы объяснить результат, которого вы пытаетесь достичь?2. просто хотел использовать make вместо shell для получения имени файла — вы правы, ставить его как зависимость не имеет никакого смысла. Я буду использовать
notdir
внутри правила. не могли бы вы опубликовать его в качестве ответа, чтобы я мог его принять?
Ответ №1:
Чтобы получить часть имени файла целевого имени внутри команд %.tar.bz2
правила, вы можете использовать функцию notdir или переменную $ (@D) .
На самом деле, вы должны сделать так, чтобы целевое имя соответствовало выходному файлу, чтобы make
он мог проверять наличие файла и не пытался загружать его заново при каждом запуске. Простым способом сделать это было бы
source=somefile.tar.bz2
.PHONY: download
download: $(source)
%.tar.bz2:
@wget "http://example.net/$@"
или, если у вас есть разные исходные архивы для загрузки из разных мест (что, я полагаю, у вас есть, иначе зачем вообще беспокоиться о правиле шаблона?), Вы могли бы использовать переменную, зависящую от цели, для хранения 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)/$@"
Ответ №2:
Ну, нет причин быть слишком сложным — хотя это может быть возможно сделать, разве это не было бы намного удобнее для чтения:
domain=http://example.net/
filename=somefile.tar.bz2
source=$(DOMAIN)$(FILENAME)
Тогда имя файла будет прямо там, чтобы использовать
Вы также можете попробовать
$(patsubst %/,,$(source))
Который должен удалить все до последней косой черты из $(source)