我想学习如何在我的makefile目标的先决条件中重复使用%符号,假设目标是X.pdf
,并且假设是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,这样当它尝试生成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
也是如此。
如果我将%/%.tex
更改为foo/%.tex
,它会按预期工作,但我不想在其中对foo
进行硬编码,因为将来我会做all: foo.pdf bar.pdf
它应该会找到foo/foo.tex
和bar/bar.tex
。
我对Makefiles很新(经验仅限于根据我的需要修改其他人),并且从未做过一个超过绝对基本的,所以如果有人能给我一个有用的指针(我不喜欢)我真的知道要在Makefile文档中搜索哪些单词 - 唯一看起来很有前途的是%
和$*
,这是我无法工作的。)
答案 0 :(得分:2)
您可以使用VPATH指定要搜索的目录列表。
示例性makefile:
# 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文件。