Makefile:交叉组合的目标

Makefile: Targets for Crosscombinations

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

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

示例:

Files: ScriptA, ScriptB, InputA, InputB

Targets/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>

您已经 运行 了解 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))))