我试图写一个Makefile
来制作一些数字
自动高效。
我的数据是使用Octave ../thesis/figures
在.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
,则应该在$(OCTAVE)
上运行figure1.m
,然后在$(PDFLATEX)
上运行../thesis/figures/figure1.p1.tex
重新编译并更新图。
但是使用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
会删除文件名中第一个.
之后的所有内容(包括.
)。但是,它仅删除最后.
及之后的所有内容(并忽略目录名中的.
)。因此,为了使用我的文件名,上面的内容,包括在下面的答案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
完成他们的工作第二次扩张。
答案 0 :(得分:0)
您也需要转发$(notdir)
和$$(basename)
来电(即$$(notdir)
和$$(patsubst)
。($$@
来电在{您链接到的手册的扩展部分。)
如果不这样做,那么在初始扩展阶段,这些调用将根据$$@
的参数进行评估,并且最终将{{1}}作为二级扩展阶段的剩余部分。