5

我想学习如何在我的 makefile 目标的先决条件中重新使用 % 符号,假设目标是X.pdf,并且 prerequesite 在X/X.tex.

详细地说,我目前有一个像这样的makefile:

all: foo.pdf

%.pdf: %.tex
    pdflatex $*.tex

我还有一个文件foo.tex,当我输入make它时,它会foo.pdf运行pdflatex foo.tex

现在由于各种我无法控制的原因,我的目录结构发生了变化:

my_dir
|- Makefile
|- foo
   |- foo.tex

我想修改我的 Makefile 以便当它尝试 make 时X.pdf,它​​会查找文件X/X.tex

我尝试了以下方法(我试图把 '%/%.tex' 告诉它寻找foo/foo.tex):

all: foo.pdf

%.pdf: %/%.tex
    pdflatex $*/$*.tex

但是,这会产生:

No rule to make target `foo.pdf', needed by `all'. Stop.

也是如此%.pdf: $*/$*.tex

如果我将其更改%/%.texfoo/%.tex按预期工作,但我不想foo在那里硬编码,因为将来我会这样做all: foo.pdf bar.pdf,它应该寻找foo/foo.texand bar/bar.tex

我对 Makefiles 相当陌生(经验仅限于根据我的需要修改别人的文件),并且从未做过绝对基本的,所以如果有人能给我一个有用的指针(我真的不知道在 Makefile 文档中搜索什么词 - 唯一看起来很有希望的是%and $*,我无法开始工作)。

4

1 回答 1

2

您可以使用 VPATH 指定 make 应该搜索的目录列表。

示例生成文件:

# Find all tex files
tex := $(shell find -iname '*.tex')

# Make targets out of them
PDFS := $(notdir $(tex:%.tex=%.pdf))
# specify search folder
VPATH := $(dir $(tex))

all : $(PDFS)

%.pdf : %.tex
        pdflatex $<

甚至更好的是使用 vpath (小写):

vpath %.tex $(dir $(tex))

它只会在这些目录中查找 .tex 文件。

于 2012-04-05T08:09:57.577 回答