Makefile中的多个模式

Makefile中的多个模式,makefile,dependencies,Makefile,Dependencies,我正在使用makefile来管理计算实验中的依赖关系。有多个模式的目标通常是有用的 例如,我可能有一些条件,比如A和B,以及交叉验证实验的不同折叠(即数据分割),比如1到10 目前,我只是复制并粘贴相同的A和B命令,并在折叠上进行模式匹配,但如果有两种以上的情况,则很快就会成为维护问题 output-%.A: input-% run A input-$* output-$*.A output-%.B: input-% run B input-$* output-$*.B 在makefile中

我正在使用makefile来管理计算实验中的依赖关系。有多个模式的目标通常是有用的

例如,我可能有一些条件,比如A和B,以及交叉验证实验的不同折叠(即数据分割),比如1到10

目前,我只是复制并粘贴相同的A和B命令,并在折叠上进行模式匹配,但如果有两种以上的情况,则很快就会成为维护问题

output-%.A: input-%
run A input-$* output-$*.A

output-%.B: input-%
run B input-$* output-$*.B
在makefile中有更好的方法吗?
如果没有,还有什么工具可以解决这个问题呢?

Make的一个缺点是它不能很好地处理通配符。但是有一种方法可以最小化这个makefile中的冗余

首先,让我们使用来稍微清理一下规则:

output-%.A: input-%
    run A $< $@

output-%.B: input-%
    run B $< $@
最后,我们将条件放入一个变量中,并使用以下方法进行迭代:

条件:=ab
定义折叠规则
输出-.%(1):输入-%
@回显运行$(1)$$<$$@
恩德夫
$(foreach x,$(条件),$(eval$(调用折叠规则,$(x)))
现在,如果要添加新条件,只需修改第一行即可

它并不漂亮,但很有效。

使用的一些功能,例如使用变量作为宏函数,以及使用
$[]
进行早期评估,很容易:

define runner
output-%.$1: input-%
    run $1 $$(input) $$(output)
enddef

$[runner A]
$[runner B]
$[runner C]
如果您想创建很多规则,这可能仍然过于冗长。
foreach
函数的问题是,它将结果与空格连接起来。因此,要分离规则,可以在最后一行放置一个伪空表达式:

define runner
output-%.$1: input-%
    run $1 $$(input) $$(output)
$()
enddef

$[foreach type,D E F,$[runner $[type]]]

我不同意“它不漂亮”。这正是正确的做法,也是它将要得到的美丽。感谢这两个好的答案。这件是普通的,所以我要接受它。
define runner
output-%.$1: input-%
    run $1 $$(input) $$(output)
enddef

$[runner A]
$[runner B]
$[runner C]
define runner
output-%.$1: input-%
    run $1 $$(input) $$(output)
$()
enddef

$[foreach type,D E F,$[runner $[type]]]