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