如何使用带通配符的makefile在所有子目录中生成文件?

时间:2015-07-21 09:29:23

标签: makefile

我有以下目录结构:

superfolder
    makefile
    subfolder1
        file.tex
    subfolder2
        file.tex
    ...
    subfolderN
        file.tex

这是我目前的superfolder/makefile

file.pdf : file.tex
    pdftex file.tex

如果我当前的工作目录是superfolder/subfolder1我可以使用superfolder/subfolder1/file.pdf创建make --file ../makefile

假设我当前的工作目录是superfolder。如何编辑我的makefile,make all会在每个子文件夹中创建file.pdf? (即创建subfolder1/file.pdfsubfolder2/file.pdf,...,subfolderN/file.pdf
如果它使事情变得更容易,您可以假设每个子文件夹总是包含file.tex

1 个答案:

答案 0 :(得分:2)

试试这个:

OUTPUTS := subfolder1/file.pdf
OUTPUTS += subfolder2/file.pdf
OUTPUTS += ...
OUTPUTS += subfolderN/file.pdf

all: $(OUTPUTS)

$(OUTPUTS): %.pdf: %.tex
    (cd $(dir $<) && pdftex $(notdir $<))

.PHONY: all

这样您就可以管理由make构建的文件。并且,由于它使用的是真实文件目标(而不是虚假目标),make将只重建所需的文件。

因此,您应该能够在make目录中执行make all(或superfolder)来构建所有文件。如果您只想构建一个file,请执行以下操作:

make subfolderN/file

如果您在subfolder目录中,则可以通过以下方式重建所需文件:

make --file ../Makefile

或者仅重建 目录中的文件:

make --file ../Makefile $(basename $(pwd))/file

编辑:要自动执行此过程,您可以将第一行替换为:

OUTPUTS := $(patsubst %.tex,%.pdf,$(wildcard */file.tex))