【问题标题】:Reuse percent sign in Makefile prerequesite as subdirectory name在 Makefile prerequesite 中重用百分号作为子目录名称
【发布时间】:2012-04-05 04:54:31
【问题描述】:

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

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

all: foo.pdf

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

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

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

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 文档中搜索什么词 - 唯一看起来很有希望的是 %$*,我无法开始工作)。

【问题讨论】:

  • 这比应该的要难;处理通配符是 Make 非常不擅长的事情之一。可以做到,但很丑陋,所以如果@wisent 的解决方案足以满足您的目的,您可能应该这样做。

标签: bash unix makefile


【解决方案1】:

您可以使用 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 文件。

【讨论】:

  • 如果没有foo.texfoo/foo.tex,这将运行得很好。如果周围有./foo.texbar/baz/foo.tex,那就麻烦了。
  • 幸运的是我不会有这个问题(我所有的 %.tex 都保证在文件夹 % 中)。这适用于我的目的(尽管我很惊讶您不能在 Makefile 的先决条件中使用 $* 等,但我认为我的困难是由于是 Makefile 新手)。干杯!
  • 你可以使用$* IFF (a) 你有足够新的 GNU make 版本,(b) 你启用 .SECONDEPANSION 特殊目标,(c) 你将它们转义为$$* .有关二次扩展的文档,请参阅 GNU make 手册。
  • @MadScientist;我们可以看到使用您在此处描述的技术的解决方案吗?这看起来很有趣,并且可能会展示一些高级 Make 技术
猜你喜欢
  • 2017-10-17
  • 2011-11-16
  • 2023-03-27
  • 2011-12-13
  • 1970-01-01
  • 2021-05-19
  • 2017-01-19
  • 1970-01-01
  • 2016-10-15
相关资源
最近更新 更多