我希望优化现有的Makefile。它用于为给定目录中的每个日志文件创建多个图(使用Octave),使用脚本文件为每个以logfilename作为参数的图。在片刻中,我对可用的每种情节使用一个单一的规则,手写调用Octave,将特定的scriptfile / logfile作为参数。
如果每个情节都有“他的”八度脚本作为依赖项(当然还有日志文件),那将是很好的,所以如果他的脚本被更改,只会重新生成一个图。
由于我不想输入那么多内容,我想知道如何通过仅使用一条通用规则来构建“a”情节来简化这一点?
更清楚:
我想到的第一件事是:
%1_%2.png: %1.log
$(OCTAVE) --eval "plot$<2('$<1')"
但似乎不允许这样做。有人能给我一个暗示吗?
答案 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))) \
)
答案 1 :(得分:3)
模式规则只能使用1种模式(即您不能拥有%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
。