makefile patternrule с дополнительными подстановочными знаками в имени целевого файла - PullRequest
6 голосов
/ 17 января 2012

Мне нужно создать специальное правило make-файла, которое лучше всего объяснить на примере.Может быть, мы создаем файлы с правилами

%_test.pdf: %.tex
    pdflatex -jobname=%_test %.tex

%_result.pdf: %.tex
    pdflatex -jobname=%_result %.tex

, и все работает нормально.Просто думая, что встречается больше шаблонов, подобных приведенным выше, можно подумать об одном шаблонном правиле, например

%_WILDCARD.pdf: %.tex
    pdflatex -jobname=%_$(WILDCARD) %.tex

, где WILDCARD определяется командой make.Можно ли построить такое правило?

Ответы [ 3 ]

4 голосов
/ 26 июня 2012

Вдохновленный ответами @eldar и @andres, я думаю, я получил решение от себя

.SECONDEXPANSION:
%.pdf: $$(firstword $$(subst _, ,%))
    pdflatex -jobname=$* $+

Это именно то, что мне было нужно. Подробную информацию об этом способе можно найти в GNU make manual .

1 голос
/ 17 января 2012

То, что вы просите, не тривиально. Возможно, вы могли бы получить что-то, что соответствует вашим потребностям, но это займет немного работы.

Просто чтобы прояснить, (если предположить, что это сработало)

%_WILDCARD.pdf: %.tex
    pdflatex -jobname%_$(WILDCARD) %.tex

Было бы правило, что для каждого файла .tex вы должны запустить pdflatex с WILDCARD в качестве имени задания. Таким образом, вы можете ввести: make doc_test.pdf чтобы получить pdf из файла doc.tex, используя задание "doc_test".

Один из способов получить похожее поведение - использовать:

# First get the names of all the .tex files
TEX_FILE_NAMES := $(wildcard *.tex)

#Find the names of the pdfs that could be made with those .tex files
# Use the wildcard for the job-name instead of the file-name
define PDF_Template
$(1)_%.pdf: $(1).tex
    paflatex -jobname=$$@ $$<
endef

$(foreach TEX_FILE,$(TEX_FILE_NAMES),$(eval $(call PAF_TEMPLATE,$(basename $(TEX_FILE)))))

И запустить его с

make doc_test.pdf

Я просто сделаю заявление об отказе от ответственности, что я на самом деле не запускал его, поэтому прошу прощения за любые опечатки.

1 голос
/ 17 января 2012

Просто объедините ваши цели в одно правило следующим образом:

%_test.pdf %_result.pdf : %.tex
    pdflatex -jobname=$(basename $@) $<

UPD.

Как сказал Бастиан в комментариях, это решение не работает для шаблонных правил.

...