在 GNU Make 模式规则中使用通配符

not*_*ser 7 make gnu-make

假设doc.pdf是目标。

以下规则触发了doc.pdf每当doc.refer更新时的重新生成,但在doc.refer根本不存在时也很高兴:

doc.pdf: doc.mom $(wildcard doc.refer)
    pdfmom -e -k < $< > $@
Run Code Online (Sandbox Code Playgroud)

但是,以下模式规则并没有完成相同的任务(PDF 生成正确,但更改时不会触发重建doc.refer):

%.pdf: %.mom Makefile $(wildcard %.refer)
    pdfmom -e -k < $< > $@
Run Code Online (Sandbox Code Playgroud)

我怀疑该wildcard命令是在%扩展字符之前执行的。我该如何解决这个问题?

Kus*_*nda 13

GNU Make 函数wildcard采用 shell globbing 模式并将其扩展为与该模式匹配的文件。该模式%.refer不包含任何 shell 通配模式。

你可能想要类似的东西

%.pdf: %.mom %.refer
        pdfmom -e -k < $< > $@

%.pdf: %.mom
        pdfmom -e -k < $< > $@
Run Code Online (Sandbox Code Playgroud)

第一个目标将被调用用于制作PDF文件时,有一个.mom 一个.refer可用于文档的基本名称的文件。当没有.refer文件可用时,将调用第二个目标。

这些目标的顺序很重要。