2016-10-10 59 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))))