这个问题是基于我的另一个问题:Getting basename and notdir to work in prerequisite (dependency) list。
我正在使用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)
.SECONDEXPANSION:
$(TEXTARGETS): %.tex : $$(basename $$(notdir %)).m
$(OCTAVE) $<
$(PDFLATEX) $@
make -n
的干跑让我
octave --jit-compiler --no-gui --quiet figure1.m
pdflatex ../thesis/figures/figure1.p1.tex
octave --jit-compiler --no-gui --quiet figure1.m
pdflatex ../thesis/figures/figure1.p2.tex
make: *** No rule to make target `figure2.m', needed by `../thesis/figures/figure2.tex'. Stop.
这里有两个问题:
1)figure1.p1.tex
和figure.p2.tex
都是由figure1.m
octave
的第一次生成生成的。有没有办法将具有相同基本名称(或其他模式)的所有目标作为先决条件处理为一个,这样每个octave
文件只能调用.m
个?
2)figure2.tex
是使用除.m
文件之外的其他方式制作的。如果规则的前提条件不存在,我怎么能告诉make忽略规则。我知道如何为明确的先决条件做到这一点:
target: prereq
recipe
prereq:
但是在这种情况下要做什么,先决条件是从目标的名称派生出来的?
答案 0 :(得分:0)
GNU make可以教导一个命令调用通过使用这些目标的模式规则来创建多个目标。
此模式规则有两个目标:
%.tab.c %.tab.h: %.y bison -d $<
这告诉make配方'bison -d x.y'将同时生成x.tab.c和x.tab.h.如果文件foo依赖于文件parse.tab.o和scan.o而文件scan.o依赖于文件parse.tab.h,则当parse.y更改时,配方'bison -d parse.y'将只执行一次,并且将满足parse.tab.o和scan.o的先决条件。 (推测文件parse.tab.o将从parse.tab.c重新编译,文件scan.o从scan.c重新编译,而foo则从parse.tab.o,scan.o及其他先决条件链接,并且它将永远幸福地执行。)
所以你可以使用像
这样的东西figure1.%1.tex figure1.%2.tex: figure1.m
$(OCTAVE) $<
但要为N
输出N
变量的输出文件执行此操作,需要生成一个包含的makefile,将该信息从.m
文件(或类似文件)中提取出来。
如果存在与目标匹配但未找到匹配的先决条件文件的文件,则make将仅使用它找到的文件并忽略该规则(该规则不适用)。你不应该为此做任何事情。
但是,如果文件与规则匹配(但您不希望make遵循该文件的规则),则可以通过为该文件提供明确的目标来取消该应用程序。像这样。
figure2.tex: ;