Что я могу использовать для значения макроса конкретного шаблона - PullRequest
0 голосов
/ 02 марта 2019

Я бы хотел, чтобы значение макроса для конкретного шаблона основывалось на основе шаблона.

$(BINDIR)/%.gz: LOGFILE := %.dir/%.log

Возможно ли что-то подобное?

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Зачем путать себя с переменными, специфичными для шаблона?Обычный подойдет и упростит загрузку.

В рецепте шаблонного правила $* расширяется до того, что соответствует % в правиле.(Здесь я буду использовать статическое шаблонное правило, просто потому что они лучше, чем обычные шаблонные правила, ИМХО.)

${BINDIR}/test1.gz ${BINDIR}/test2.gz: ${BINDIR}/%.gz:
    @echo "logfile for $@ is $*.dir/$*.log"

Естественно, переменная или две могут несколько привести это в порядок:

logfile = $*.dir/$*.log
targets := $(patsubst %,${BINDIR}/test%.gz,1 2)

${targets}: ${BINDIR}/%.gz:
    @echo "logfile for $@ is ${logfile}"
0 голосов
/ 02 марта 2019

Нет, вы не можете: шаблон % работает только для соответствия правил.Предлагаемое решение на основе $* также не работает корректно для всех случаев.

Следующее выглядит не очень хорошо, но дает то, что вы хотите:

  • использовать ленивую оценку(=) для отсрочки оценки содержимого до выполнения рецепта
  • используйте $(notdir $@) для извлечения части имени файла цели
  • используйте $(basename ...) для удаления конца файла
BINDIR := bin

.PHONY: all
all: $(BINDIR)/test1.gz $(BINDIR)/test2.gz

$(BINDIR)/%.gz: LOGFILE = $(basename $(notdir $@)).dir/$(basename $(notdir $@)).log

$(BINDIR)/test2.gz:
    @echo "logfile for $@ is $(LOGFILE)"

$(BINDIR)/%.gz:
    @echo "logfile for $@ is $(LOGFILE)"

Тестовый прогон:

$ make
logfile for bin/test1.gz is test1.dir/test1.log
logfile for bin/test2.gz is test2.dir/test2.log
...