GNU Makefile - 生成多个组合的目标。

问题描述 投票:0回答:1

我有一些策略(strategy_a.py, strategy_b.py等)和一些输入(input_x.csv, input_y.csv).现在,我希望每当策略或输入文件发生变化时,就重新计算每个策略与每个输入的结果,但如果两者都没有变化,则不需要。手动可以这样表达。

result_of_a_with_x.txt: strategy_a.py input_x.csv
  python strategy_a.py --data input_x.csv > result_of_a_with_x.txt
result_of_a_with_y.txt: strategy_a.py input_y.csv
  python strategy_a.py --data input_y.csv > result_of_a_with_y.txt
result_of_b_with_x.txt: strategy_b.py input_x.csv
  python strategy_b.py --data input_x.csv > result_of_b_with_x.txt
result_of_b_with_y.txt: strategy_b.py input_y.csv
  python strategy_b.py --data input_y.csv > result_of_b_with_y.txt

但是我不想写出这个列表,而是想生成它,但是我不知道怎么做。我已经尝试过使用 % 但它似乎不是解决这个问题的正确工具,因为它只适用于一个仓位,而不是两个仓位。

makefile
1个回答
1
投票

你可以尝试使用一个模板,它将为每个策略实例化一个循环,就像这样。

$ cat Makefile
STRATEGIES := a b

define strategy_template
result_of_$(1)_with_%.txt: strategy_$(1).py input_%.csv
        echo python $$< --data $$(word 2,$$^) > $$@
endef

$(foreach strategy,$(STRATEGIES),$(eval $(call strategy_template,$(strategy))))

all: result_of_a_with_x.txt result_of_b_with_y.txt

在一个模板中 $(1) 将被实际参数值所取代,从而动态地创建了模式规则的 result_of_a_with_%.txtresult_of_b_with_%.txt. 由于 $(eval) 调用将扩展变量,在配方运行时应该扩展的实际值需要被转义(因此 $$< 等模板内)。)

输出。

$ make
echo python strategy_a.py --data input_x.csv > result_of_a_with_x.txt
echo python strategy_b.py --data input_y.csv > result_of_b_with_y.txt
© www.soinside.com 2019 - 2024. All rights reserved.