将Makefile中的多个目标视为一个实体,并忽略不存在的先决条件

时间:2015-06-29 01:19:54

标签: makefile

这个问题是基于我的另一个问题:Getting basename and notdir to work in prerequisite (dependency) list

我正在使用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)


.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.texfigure.p2.tex都是由figure1.m octave的第一次生成生成的。有没有办法将具有相同基本名称(或其他模式)的所有目标作为先决条件处理为一个,这样每个octave文件只能调用.m个?

2)figure2.tex是使用除.m文件之外的其他方式制作的。如果规则的前提条件不存在,我怎么能告诉make忽略规则。我知道如何为明确的先决条件做到这一点:

target: prereq
    recipe

prereq:

但是在这种情况下要做什么,先决条件是从目标的名称派生出来的?

1 个答案:

答案 0 :(得分:0)

GNU make可以教导一个命令调用通过使用这些目标的模式规则来创建多个目标。

来自Pattern Rule Examples

  

此模式规则有两个目标:

%.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将从pa​​rse.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: ;