Makefile、正则表达式和多个依赖项

Max*_*ier 6 gnu-make

假设以下文件与 makefile 位于同一目录中:

01.1.dot
01.2.dot
02.1.dot
03.1.dot
03.2.dot
03.3.dot
Run Code Online (Sandbox Code Playgroud)

这意味着我们有 [0-9][0-9].[0-9].dot 形式的文件

此外,makefile 包含以下目标:

%.dot.tex: %.dot
    dot2tex <...>
Run Code Online (Sandbox Code Playgroud)

现在我想创建一个依赖于 [0-9][0-9].tex 形式的文件的目标,并且它们还应该依赖于 [0-9][0-9].* 形式的所有文件.dot.tex,使得前两位数字匹配。例如,应make 03.pdf依赖于03.tex03.1.dot.tex03.2.dot.tex03.3.dot.tex我想出了以下几点:

%.pdf: %.tex $(addsuffix .tex,$(wildcard %.*.dot))
        @echo $?
        pdflatex <...>
Run Code Online (Sandbox Code Playgroud)

但是,通配符函数中不会计算百分比。有人知道如何解决这个问题吗?

Rog*_*ate 3

函数在模式匹配规则之前应用,因此不能在 glob 中使用 %。

可能有更好的解决方案,但我想出了:

.dep-%.pdf: %.tex
    @bash -c 'shopt -s nullglob; for x in $*.*.dot; do \
      echo "$*.pdf: $$x.tex"; \
    done' > $@
PDFS := $(patsubst %.tex,%.pdf,$(wildcard [0-9][0-9].tex))
include $(patsubst %,.dep-%,$(PDFS))
%.pdf: %.tex | .dep-%.pdf
Run Code Online (Sandbox Code Playgroud)

只要您不添加或创建 X.*.dot 文件而不修改 X.tex 文件,这应该可以工作。