2016-04-26 36 views
1

我有一個參數空間,說A = {1,2},B = {u,v},我需要爲A x B中的每個對(a,b)創建一個文件。 我需要的產生是一組Makefile的目標,如:參數化Makefile目標

file_1_u.csv: 
    ./run_program --A 1 --B u > file_1_u.csv 
file_1_v.csv: 
    ./my_program --A 1 --B v > file_1_u.csv 
file_2_u.csv: 
    ./run_program --A 2 --B u > file_1_u.csv 
file_2_v.csv: 
    ./my_program --A 2 --B v > file_1_u.csv 

是否有可能生成目標於各所產生的目標使用有關的參數?

PS: 我知道可以使用變量創建目標,但[email protected]只給出完整的目標名稱(例如file_1_u.csv)。相反,我需要分別將ab作爲參數傳遞給my_program

+0

請問我的答案[這裏](http://stackoverflow.com/a/33156456/258523)幫助這裏? –

+0

你不能使用$ *和模式規則嗎?手冊的第4.12.1節描述了靜態模式規則。 10.5.3自動變量 –

回答

1

一般來說,在一個makefile模式處理超過1元需要EVAL,$$,包括和其他非直接的處理。

然而,在具體的例子有,可以這樣使用的替代明顯:

A:=1 2 
B:=u v 
l:=$(foreach a, $(A), $(foreach b, $(B), $(a)_$(b))) 

all: $(l:%=file_%.csv) 

file_%.csv: 
     ./run_program --A $(subst _, --B ,$*) > [email protected] 
+0

感謝您的回答!我接受了它,因爲你的答案是最短的解決方案,但@ andrey-starodubtsev的答案也適用。 – dubadu

1

它看起來像你需要的東西是這樣的:

define foo 
test_$(1)_$(2) : 
    ./my_program --A $(1) --B $(2) > file_$(1)_$(2).csv 
endef 

a=1 2 
b=u v 
$(foreach a_,$(a),$(foreach b_,$(b),$(eval $(call foo,$(a_),$(b_))))) 
+0

作爲一個額外的好處,這個解決方案會給你額外的工作安全性,因爲幾乎沒有其他人會知道Makefile的功能,更別提能夠維護它了......(抱歉,無法抗拒: - ) – John

+0

作爲一種額外的工作安全性,不會丟失代碼的可維護性,您可以隨時使用加密註釋=) –