我有一些策略(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
但是我不想写出这个列表,而是想生成它,但是我不知道怎么做。我已经尝试过使用 %
但它似乎不是解决这个问题的正确工具,因为它只适用于一个仓位,而不是两个仓位。
你可以尝试使用一个模板,它将为每个策略实例化一个循环,就像这样。
$ 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_%.txt
和 result_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