2016-08-12 74 views
0

我需要寫爲以下情況下的圖案規則:Makefile。多維列表?

  • 有2個文件夾:AB
  • 運行命令python gen.py --a=A/file1.foo --b=file2.bar --c=file3.bar生成B/file1.foo
  • file1file2file3是不同的字符串

有沒有辦法將這些文件名分組在一些多維的ar射線,使所有文件都寫一次(我將使用Python語法):

files = [["a1.foo", "a2.bar", "a3.bar"], 
     #...200 other groups... 
     ["b1.foo", "b2.bar", "b3.bar"]] 

,然後規則是這樣的:

$(files): B/{reference 1 elem}: A/{1 elem} {2 elem} {3 elem} 
    python gen.py --a=A/{1 elem} --b={2 elem} --c={3 elem} 

任何想法如何存檔呢?

回答

1

您可以使用標準的make語法爲:

all : 

targets := 
define add_target 
B/${1}: A/${1} ${2} ${3} 
targets += B/${1} 
endef 

# Build dependencies. 
$(eval $(call add_target,a1.foo,a2.bar,a3.bar)) 
# ... 
$(eval $(call add_target,b1.foo,b2.bar,b3.bar)) 

# One generic rule for all ${targets}  
${targets} : % : 
    @echo Making [email protected] from $^ 

all : ${targets} 

.PHONY: all 

注意,這些$(eval $(call add_target,...)是空白敏感的,不存在插入空格。

如果您想make自動創建的輸出目錄下執行:

${targets} : % : | B 

B : 
    mkdir [email protected] 
+0

哇!這正是我想要的。非常感謝! –

+0

B/$ {1}:A/$ {1} $ {2} $ {3} |我怎樣才能追加所有的參數(如果有多於3個的話)?我在哪裏可以閱讀更多關於它的信息?我還沒有發現任何相關的事情。 –

+0

@ViacheslavKroilov https://www.gnu.org/software/make/manual/make.html#index-call –

0

有時有點重複是沒有那麼糟糕真的

targets := B/a1.foo B/b1.foo 

.PHONY: all 

all: $(targets) 

$(targets): B/%: A/% 
    python gen.py --a=$< --b=$(word 2,$^) --c=$(word 3,$^) 

B/a1.foo: a2.bar a3.bar 
B/b1.foo: b2.bar b3.bar