создание: текстовой функции в зависимости

#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)