【问题标题】:Makefile: Targets for CrosscombinationsMakefile:交叉组合的目标
【发布时间】:2016-10-11 03:44:56
【问题描述】:

我有两种类型的文件。脚本和数据集。我想编写一个生成文件来对每个数据集运行每个脚本。 我的想法是为每个输出创建一个目标,其中目标的名称包含脚本和模型名称。这些目标将匹配“目标模式”规则(类型:some_folder/%.eval)。现在“目标模式”规则需要从其名称中找出需要哪些文件。但这似乎是一项艰巨的工作。

有没有更好、更优雅的方式?

例子:

文件:ScriptA、ScriptB、InputA、InputB

目标/输出文件: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>

【问题讨论】:

  • 你的榜样是你拥有,还是你想要的?
  • 这个例子就是我想要的。我可以生成目标的名称。那没问题。但是这种依赖是相反的,很难描述。
  • 这个问题听起来很熟悉。如果我能找到之前的,我会添加一个链接并将这个问题标记为重复。

标签: makefile target


【解决方案1】:

您遇到了 Make 的主要缺点之一:通配符不是很好。

您可以通过使用eval 生成规则来获得您想要的效果,或者通过迭代这两个变量:

define template
$(1)_$(2).eval: $(1) $(2)
    @echo target is $$@
    @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 $$@
    @echo running $$* on $(1)
endef

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 2021-03-14
    相关资源
    最近更新 更多