【发布时间】:2015-06-28 22:32:34
【问题描述】:
我正在尝试写一个Makefile 来生成一些数字
自动高效。
我的数字是在 ../thesis/figures 中使用 Octave .m 生成的
Makefile 所在的当前目录中的文件。
每个.m 文件,例如figure1.m,可能会生成多个数字,例如
figure1.p1.tex 和 figure1.p2.tex (以及它们的依赖,其中
也由figure1.m 生成)。然后将使用 LaTeX 编译这些 .tex 文件(在这种情况下,一次运行 pdflatex figure1.p1.tex 就足够了;因此,不需要 latexmk 或其他替代方案)。
我目前的Makefile是
OCTAVE = octave --jit-compiler --no-gui --quiet
PDFLATEX = pdflatex
FIGDIR = ../thesis/figures
TEXTARGETS = $(wildcard $(FIGDIR)/*.tex)
.PHONY: figures
figures: $(TEXTARGETS)
$(TEXTARGETS): %.tex : $(basename $(notdir %)).m
$(OCTAVE) $<
$(PDFLATEX) $@
我在先决条件(依赖)规则中要做的只是将../thesis/figures/figure1.p1.tex 转换为figure1.m,因为前者依赖于后者。然后,如果.tex 比.m 旧,则接收方应该在figure1.m 上运行$(OCTAVE),然后在../thesis/figures/figure1.p1.tex 上运行$(PDFLATEX) 以重新编译和更新图形。
但是与make -n 进行试运行,我得到了消息
make: *** No rule to make target `../thesis/figures/figure1.p1.m', needed by `../thesis/figures/figure1.p1.tex'. Stop.
据我所知,这意味着basename 和notdir 函数不是由make 运行的。我怀疑这可能与他们在先决条件列表中有关(例如,我知道$@ 在先决条件列表中扩展为空)。我尝试使用.SECONDEXPANSION:,https://www.gnu.org/software/make/manual/html_node/Secondary-Expansion.html,认为以下可能会起作用
.SECONDEXPANSION:
$(TEXTARGETS): % : $(basename $(notdir $$@)).m
$(OCTAVE) $<
$(PDFLATEX) $@
但它没有,我得到了同样的信息。
我正在运行GNU Make 3.81。我究竟做错了什么?你有什么建议可以更好地完成这项任务吗?
编辑
最初,我认为basename 会删除文件名中第一个. 之后的所有内容(包括.)。但是,它只删除最后一个 . 和之后的所有内容(并忽略目录名称中的 .s)。因此,要使其与我的文件名一起使用,在下面的答案https://stackoverflow.com/a/31105973/2636530 中包含更正后,上面的内容必须是
.SECONDEXPANSION:
$(TEXTARGETS): %.tex : $$(basename $$(notdir %)).m
$(OCTAVE) $<
$(PDFLATEX) $@
这样,目标为../thesis/figures/figure1.p1.tex,% 捕获并扩展为仅../thesis/figures/figure1.p1,然后basename 和notdir 在第二次扩展后完成它们的工作。
【问题讨论】:
标签: makefile