2013-11-28 37 views
1

我正在使用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中有這樣做的更好方法嗎? 如果沒有,還有什麼其他工具可以解決這個問題?

回答

2

Make的一個缺點是它不能很好地處理通配符。但是有一種方法可以最小化這個makefile中的冗餘。

首先,讓我們使用automatic variables清理規則一點點:

output-%.A: input-% 
    run A $< [email protected] 

output-%.B: input-% 
    run B $< [email protected] 

然後我們定義規則模板,使用call來評估它的A和B,以及eval解釋這些事情實際規則:

define fold-rule 
output-%.$(1): input-% 
     @echo run $(1) $$< [email protected]  # <-- note the doubled '$' 
endef 

$(eval $(call fold-rule,A)) 
$(eval $(call fold-rule,B)) 

最後我們把條件變量,並使用迭代foreach

CONDITIONS := A B 

define fold-rule 
output-%.$(1): input-% 
     @echo run $(1) $$< [email protected] 
endef 

$(foreach x, $(CONDITIONS), $(eval $(call fold-rule,$(x)))) 

現在,當您想要添加新條件時,只需修改第一行。

這不是很漂亮,但它的工作原理。

+0

我不同意「它不漂亮」。這是完全正確的事情,並且像它將要得到的那樣美好。 –

+0

感謝您的好答案。這個是平淡的,所以我會接受它。 –

1

使用的makepp的一些功能,如使用變量作爲宏觀功能,和早期評價;與$[]很容易:

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]]]