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

时间:2010-05-21 09:36:33

标签: makefile

我希望优化现有的Makefile。它用于为给定目录中的每个日志文件创建多个图(使用Octave),使用脚本文件为每个以logfilename作为参数的图。在片刻中,我对可用的每种情节使用一个单一的规则,手写调用Octave,将特定的scriptfile / logfile作为参数。

如果每个情节都有“他的”八度脚本作为依赖项(当然还有日志文件),那将是很好的,所以如果他的脚本被更改,只会重新生成一个图。

由于我不想输入那么多内容,我想知道如何通过仅使用一条通用规则来构建“a”情节来简化这一点?

更清楚:

  • 日志文件:“$(LOGNAME).log”
  • Scriptfile:“plot $(PLOTNAME).m”创建“$(LOGNAME)_ $(PLOTNAME).png”

我想到的第一件事是:

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

但似乎不允许这样做。有人能给我一个暗示吗?

2 个答案:

答案 0 :(得分:5)

制作不直接支持这一点非常疯狂,我一直都需要它。

我目前使用的技术(使用GNU make)(基于Didier Trosset的例子):

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))) \
)

这是in the GNU make documentation

答案 1 :(得分:3)

模式规则只能使用1种模式(即您不能拥有%1%2,只需%)。

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

%_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