Makefile 执行一个选项或循环遍历所有选项

Makefile execute for one option or loop over all of them

我有一组植物(我们称它们为 plant_1plant_2 等)和几个步骤来处理它们的数据。我想创建一个可以同时处理一个工厂或所有工厂数据的 makefile。

每个植物都使用相同的一组 Python 命令:例如python join_data plant_1python clean_data plant_1python process_data plant_1 等。 我想写下来避免重复自己

join_data_plant_1:
   python join_data plant_1

等 我知道我可以简单地写 python join_data $@,但是目标必须是 plant_1,我不能以同样的方式写下其他步骤的规则。我也可以将 PLANT = plant_1 设置为变量,然后只写

join_$PLANT:
   python join_data $PLANT

但是我不知道如何编写一个规则来一次生成所有植物。

编写此 makefile 的优雅且非冗余的方法是什么?

我希望它不是重复的;我是 make 的新手,所以我很难搜索到合适的术语。

编辑

回答评论:不,我不只是修改一个文件。 plant_1:

的整个食谱看起来大致像这样
joined_data_plant_1.pckl: data/plant_1/raw_data.xlsx join_data
   python join_data plant_1

cleaned_data_plant_1.pckl: joined_data_plant_1.pckl clean_data
   python clean_data plant_1

processed_data_plant_1.pckl: cleaned_data_plant_1.pckl process_data
   python process_data plant_1

试试这样的:

ALL_PLANTS = plant_1 plant_2 plant_3

all: $(ALL_PLANTS)

$(ALL_PLANTS): % : processed_data_%.pckl

.PHONY: all $(ALL_PLANTS)

joined_data_%.pckl: data/%/raw_data.xlsx join_data
        python join_data $*

cleaned_data_%.pckl: joined_data_%.pckl clean_data
        python clean_data $*

processed_data_%.pckl: cleaned_data_%.pckl process_data
        python process_data $*

现在,如果您 运行 makemake all 它将构建所有这些。如果您 运行 make plant_1make plant_1 plant_3 将仅构建这些。