我需要创建一个特殊的makefile规则,最好用一个例子来解释。 也许我们使用规则创建文件
%_test.pdf: %.tex
pdflatex -jobname=%_test %.tex
%_result.pdf: %.tex
pdflatex -jobname=%_result %.tex
它工作正常。只是想到会出现更多像上面那样的模板,人们可能会想到一个像
这样的通配符规则%_WILDCARD.pdf: %.tex
pdflatex -jobname=%_$(WILDCARD) %.tex
其中WILDCARD由make决定。是否有可能建立这样的规则?
答案 0 :(得分:4)
受到@eldar和@andres答案的启发,我认为,我自己得到了解决方案
.SECONDEXPANSION:
%.pdf: $$(firstword $$(subst _, ,%))
pdflatex -jobname=$* $+
这完全是我所需要的。有关此方式的详细信息,请访问GNU make manual。
答案 1 :(得分:1)
只需将目标合并为一条规则,如下所示:
%_test.pdf %_result.pdf : %.tex
pdflatex -jobname=$(basename $@) $<
正如巴斯蒂安在评论中所说,这个解决方案不适用于模式规则。
答案 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
我会继续进行免责声明,我实际上没有运行它,所以请原谅任何错别字。