重复使用Makefile prerequesite中的百分号作为子目录名称

时间:2012-04-05 04:54:31

标签: bash unix makefile

我想学习如何在我的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.texbar/bar.tex

我对Makefiles很新(经验仅限于根据我的需要修改其他人),并且从未做过一个超过绝对基本的,所以如果有人能给我一个有用的指针(我不喜欢)我真的知道要在Makefile文档中搜索哪些单词 - 唯一看起来很有前途的是%$*,这是我无法工作的。)

1 个答案:

答案 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文件。