Makefile make:为多个文件的多个目标调用命令?

Makefile make:为多个文件的多个目标调用命令?,makefile,Makefile,我希望优化现有的Makefile。它用于为给定目录中的每个日志文件创建多个绘图(使用倍频程),为每个绘图使用脚本文件,该脚本文件以logfilename为参数。目前,对于每种可用的绘图,我都使用一条规则,通过手写调用Octave,将特定的scriptfile/logfile作为参数 如果每个绘图都有“他的”倍频程脚本作为依赖项(当然还有日志文件),那么如果他的脚本被更改,那么只会重新生成一个绘图,这将是一件好事 既然我不想输入那么多,我想知道如何通过只使用一个通用规则来构建“a”图来简化这一点

我希望优化现有的Makefile。它用于为给定目录中的每个日志文件创建多个绘图(使用倍频程),为每个绘图使用脚本文件,该脚本文件以logfilename为参数。目前,对于每种可用的绘图,我都使用一条规则,通过手写调用Octave,将特定的scriptfile/logfile作为参数

如果每个绘图都有“他的”倍频程脚本作为依赖项(当然还有日志文件),那么如果他的脚本被更改,那么只会重新生成一个绘图,这将是一件好事

既然我不想输入那么多,我想知道如何通过只使用一个通用规则来构建“a”图来简化这一点

更清楚地说:

  • 日志文件:“$(LOGNAME.log”
  • 脚本文件:“plot$(PLOTNAME).m”创建“$(LOGNAME)$(PLOTNAME).png”
我想到的第一件事是:

%1_%2.png: %1.log
    $(OCTAVE) --eval "plot$<2('$<1')"
%1\u%2.png:%1.log

$(倍频程)--eval“plot$模式规则只能使用一种模式(即,您不能有
%1
%2
,只有
%

因此,根据您拥有的
PLOTNAME
LOGNAME
的数量,选择最小的,并根据需要编写尽可能多的模式规则

%_plot1.png: %.log
        $(OCTAVE) --eval "plot1('$*')"
如果您不想编写不同绘图(或日志)的规则,可以使用双Makefile机制。在子Makefile中,使用上述命令,但使用绘图名称参数。在主Makefile中,使用所需绘图名称的各种值调用它

Makefile.sub:

%_$(PLOTNAME).png: %.log
        $(OCTAVE) --eval "plot$(PLOTNAME)('$*')"
生成文件:

all:
        $(MAKE) PLOTNAME=plot1 -f Makefile.sub
        $(MAKE) PLOTNAME=plot2 -f Makefile.sub
        $(MAKE) PLOTNAME=plot3 -f Makefile.sub

它省去了多次编写规则(并在需要时省去了多次更新),但对于
all
以外的其他目标,例如
clean

make不直接支持这一点,这太疯狂了,我一直都需要它

我目前使用的技术(GNU make)(以Didier Trosset为例):


这是。

Hm,看起来比较复杂,不像我要找的东西。但我试过了,效果很好,所以无论如何,谢谢!这是使用模式规则实现递归依赖项搜索的最清晰的方法。我只会对规范绘图目标使用模式:
all:plot1 plot2 plot3
然后
plot%:\n\t$(MAKE)PLOTNAME=plot$*-f Makefile.sub
噢,非常感谢!非常有用。工作起来很有魅力——只是为了使Makefile更小但更复杂;)这非常有用。需要注意的一点是:define OCT_模板后缺少“=”。make手册似乎指出需要使用“=”,但它的存在阻止了调用从扩展到任何东西。谢谢。@Christopher Mason:你在网上最容易找到的制作手册是3.82,而大多数人的制作仍然是3.81。我相信这是其中一个差异。也可以找到类似的主题。
define OCT_template

all: %_$(1).png

%_$(1).png: %.log
    $$(OCTAVE) --eval "plot$(1)('$$*')"

endef

PLOT_NAMES = plot1 plot2 plot3

$(foreach p, $(PLOT_NAMES), \
  $(eval $(call OCT_template,$(p))) \
)