目标文件名中进一步使用通配符的Makefile模式规则

7

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

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

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

它正在正常工作。只是考虑到可能会有更多类似上面的模板,我们可以考虑一个通配符规则,比如

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

“WILDCARD”由制造商决定。是否可以构建这样的规则?
3个回答

4

在受到@eldar和@andres的答案启发后,我认为,我已经自己找到了解决方案

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

这正是我所需要的。有关此方法的详细信息,请参见GNU make手册


1

只需将您的目标合并到一个规则中,如下所示:

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

更新。

正如 Bastian 在评论中所说,此解决方案不适用于模式规则。


谢谢@eldar-abusalimov!听起来很有趣...但是-这会告诉我们,两个文件都是由一个单一的运行创建的,对吗?请考虑只构建_result.pdf... - Bastian Ebeling
好的@eldar-abusalimov,你能解释一下你的建议吗?它描述了与GNU make手册最后一段给出的不同行为。此外,我可以用通配符替换下划线后面的内容吗? - Bastian Ebeling
@BastianEbeling,我提出这个建议是因为规则中的多个目标章节。根据你提供的链接,它似乎不适用于模式规则。 - Eldar Abusalimov
@Beta,我刚刚尝试从 xxx.tex 制作 xxx_test.pdfxxx_result.pdf,但它只生成了第一个。对于后者,它显示“没有为 'xxx_result.pdf' 做任何事情”。 - Eldar Abusalimov
@BastianEbeling:它可以工作。试一下。至于用通配符替换testresult,简短的回答是:不行,长的回答是:可以,但会得到一个更加复杂和晦涩的Makefile,所以几乎肯定不值得这样做。 - Beta
显示剩余3条评论

1
你所要求的并不是一件简单的事情。你可能可以得到满足你需求的东西,但需要付出一些努力。
只是为了明确起见,(假设它能正常工作)
%_WILDCARD.pdf: %.tex
    pdflatex -jobname%_$(WILDCARD) %.tex

对于每个 .tex 文件,可以制定一个规则,使用通配符作为作业名称运行 pdflatex。因此,您可以键入:make doc_test.pdf 从 doc.tex 文件中获取 pdf,使用作业“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

我先声明一下,实际上我还没有运行过它,请原谅任何拼写错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接