【问题标题】:Getting basename and notdir to work in prerequisite (dependency) list让 basename 和 notdir 在先决条件(依赖项)列表中工作
【发布时间】:2015-06-28 22:32:34
【问题描述】:

我正在尝试写一个Makefile 来生成一些数字 自动高效。

我的数字是在 ../thesis/figures 中使用 Octave .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 旧,则接收方应该在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.

据我所知,这意味着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 会删除文件名中第一个. 之后的所有内容(包括.)。但是,它只删除最后一个 . 和之后的所有内容(并忽略目录名称中的 .s)。因此,要使其与我的文件名一起使用,在下面的答案https://stackoverflow.com/a/31105973/2636530 中包含更正后,上面的内容必须是

.SECONDEXPANSION:
$(TEXTARGETS): %.tex : $$(basename $$(notdir %)).m
       $(OCTAVE) $<
       $(PDFLATEX) $@

这样,目标为../thesis/figures/figure1.p1.tex% 捕获并扩展为仅../thesis/figures/figure1.p1,然后basenamenotdir 在第二次扩展后完成它们的工作。

【问题讨论】:

    标签: makefile


    【解决方案1】:

    您还需要转义$(basename)$(notdir) 调用(即$$(basename)$$(notdir)。($$(patsubst) 调用在您链接到的手册的二级扩展部分中转义的方式。)

    如果不这样做,这些调用将在初始扩展阶段根据 $$@ 的参数进行评估,而您最终会得到 $$@ 是第二扩展阶段剩下的所有内容。

    【讨论】:

    • 是的,确实,我忘记了逃避那些电话。这样就解决了问题。
    猜你喜欢
    • 2013-05-19
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多