makefile patternrule,目标文件名中包含更多通配符

时间:2012-01-17 14:41:36

标签: makefile design-patterns wildcard

我需要创建一个特殊的makefile规则,最好用一个例子来解释。 也许我们使用规则创建文件

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

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

它工作正常。只是想到会出现更多像上面那样的模板,人们可能会想到一个像

这样的通配符规则
%_WILDCARD.pdf: %.tex
    pdflatex -jobname=%_$(WILDCARD) %.tex

其中WILDCARD由make决定。是否有可能建立这样的规则?

3 个答案:

答案 0 :(得分:4)

受到@eldar和@andres答案的启发,我认为,我自己得到了解决方案

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

这完全是我所需要的。有关此方式的详细信息,请访问GNU make manual

答案 1 :(得分:1)

只需将目标合并为一条规则,如下所示:

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

UPD。

正如巴斯蒂安在评论中所说,这个解决方案不适用于模式规则。

答案 2 :(得分:1)

你所要求的并非微不足道。您可能会得到满足您需求的东西,但这需要一些工作。

要明确,(假设它有效)

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

规则是,对于每个.tex文件,您都可以使用WILDCARD作为作业名称运行pdflatex。因此你可以输入: make doc_test.pdf使用作业“doc_test”从doc.tex文件中获取pdf。

获得类似行为的一种方法是使用:

# 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

我会继续进行免责声明,我实际上没有运行它,所以请原谅任何错别字。