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

将Makefile中的多个目标视为一个实体,并忽略不存在的先决条件,makefile,Makefile,这个问题基于我的另一个问题: 我正在使用一个Makefile自动生成一些数字,并且 效率高 我的数字是在/论文/数字中使用倍频程.m 当前目录中的文件,Makefile也位于该目录中。 每个.m文件,例如图1.m,可以生成多个图,例如。 图1.p1.tex和图1.p2.tex(以及它们的相关性,其中 也由图1.m生成。然后使用LaTeX编译这些.tex文件(在这种情况下,一次运行pdflatex figure1.p1.tex就足够了;因此,不需要使用latexmk或其他替代方案) 到目前为止,我

这个问题基于我的另一个问题:

我正在使用一个
Makefile
自动生成一些数字,并且 效率高

我的数字是在
/论文/数字
中使用倍频程
.m
当前目录中的文件,
Makefile
也位于该目录中。 每个
.m
文件,例如
图1.m
,可以生成多个图,例如。
图1.p1.tex
图1.p2.tex
(以及它们的相关性,其中 也由
图1.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) $@
这里有两个问题:

1)
figure1.p1.tex
figure.p2.tex
都是通过
octave
第一次运行
figure1.m
生成的。是否有一种方法可以将具有相同基名(或其他模式)的所有目标视为一个先决条件,这样每个
.m
文件最多只能调用一次
octave

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

target: prereq
    recipe

prereq:

但是在这种情况下,如果先决条件是从目标名称派生的,该怎么办呢?

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

发件人:

此模式规则有两个目标:

%.tab.c %.tab.h: %.y
    bison -d $<

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

发件人:

此模式规则有两个目标:

%.tab.c %.tab.h: %.y
    bison -d $<

正如您所提到的,模式规则对于一组固定的目标非常有用。如果没有其他人有更好的建议,我会接受这个答案。到目前为止,我正在考虑使用生成的makefile并将其包括在内,正如您所建议的,但对于这样一个基本任务来说,这似乎有些过头了。生成的makefile在概念上比在实践中更复杂,在很多事情上都能很好地工作(我在工作中使用它们来完成各种复杂的生成任务)。除了列出的模式规则支持之外,没有办法向给定规则添加目标,也没有办法让额外的目标来自单个规则。如果您愿意,您可以改为使用(但这不需要使用特定文件作为先决条件)。正如您所提到的,模式规则对于一组固定的目标非常有用。如果没有其他人有更好的建议,我会接受这个答案。到目前为止,我正在考虑使用生成的makefile并将其包括在内,正如您所建议的,但对于这样一个基本任务来说,这似乎有些过头了。生成的makefile在概念上比在实践中更复杂,在很多事情上都能很好地工作(我在工作中使用它们来完成各种复杂的生成任务)。除了列出的模式规则支持之外,没有办法向给定规则添加目标,也没有办法让额外的目标来自单个规则。如果愿意,您可以选择使用(但这不需要使用特定文件作为先决条件)。
figure1.%1.tex figure1.%2.tex: figure1.m
        $(OCTAVE) $<
figure2.tex: ;