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))))
我有两种类型的文件。脚本和数据集。我想为每个数据集的每个脚本编写一个 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))))