获取basename和notdir以在先决条件(依赖项)列表

时间:2015-06-28 22:32:35

标签: makefile

我试图写一个Makefile来制作一些数字 自动高效。

我的数据是使用Octave ../thesis/figures.m中生成的 Makefile也在当前目录中的文件。 每个.m文件,例如figure1.m,可能会生成多个数据,例如 figure1.p1.texfigure1.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.

据我所知,这意味着basenamenotdir函数不会由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,然后basenamenotdir完成他们的工作第二次扩张。

1 个答案:

答案 0 :(得分:0)

您也需要转发$(notdir)$$(basename)来电(即$$(notdir)$$(patsubst)。($$@来电在{您链接到的手册的扩展部分。)

如果不这样做,那么在初始扩展阶段,这些调用将根据$$@的参数进行评估,并且最终将{{1}}作为二级扩展阶段的剩余部分。