2016-10-10 58 views
0

我有2種類型的文件。腳本和數據集。我想寫一個makefile來爲每個數據集運行每個腳本。 我的想法是爲每個輸出創建一個目標,其中目標的名稱包含腳本和模型名稱。這些目標將匹配「目標模式」 - 規則(類型:some_folder /%。eval)。現在,「目標模式」規則需要從名稱中找出需要哪些文件。但這似乎是一項艱鉅的工作。Makefile:跨組​​合的目標

有更好,更優雅的方式嗎?

例子:

文件:SCRIPTA,ScriptB,InputA,InputB

目標/ Outputfiles:InputA_ScriptA,InputA_ScriptB,InputB_ScriptA,InputB_ScriptB

# generate all combinations 
RT_HW = $(foreach script,$(RT_SCRIPT_HW),$(foreach input, $(RT_INPUTS), $(input)_$(script))) 

$(SANDBOX)%.eval: <requires Script X and input X> 
+0

是你的例子*你擁有的*,或者你想要的* – Beta

+0

這個例子就是我想要的。我可以生成目標的名稱。那沒問題。但是,依賴性是另一種方式,很難形容。 – Botnic

+0

這個問題聽起來很熟悉。如果我能找到以前的內容,我會添加一個鏈接並將此問題標記爲重複。 – Beta

回答

2

你已經運行到Make的主要缺點之一:通配符不太好。

可以,或者通過遍歷兩個變量得到你想要用eval產生規則的效果:

define template 
$(1)_$(2).eval: $(1) $(2) 
    @echo target is [email protected] 
    @echo running $(2) on $(1) 
endef 

$(foreach script,$(RT_SCRIPT_HW),$(foreach input, $(RT_INPUTS), $(eval $(call template,$(input),$(script))))) 

或通過生成模式規則,遍歷只有一個,如輸入:

define template 
$(1)_%.eval: $(1) % 
    @echo target is [email protected] 
    @echo running $$* on $(1) 
endef 

$(foreach input, $(RT_INPUTS), $(eval $(call template,$(input))))