Makefile 执行一个选项或循环遍历所有选项
Makefile execute for one option or loop over all of them
我有一组植物(我们称它们为 plant_1
、plant_2
等)和几个步骤来处理它们的数据。我想创建一个可以同时处理一个工厂或所有工厂数据的 makefile。
每个植物都使用相同的一组 Python 命令:例如python join_data plant_1
、python clean_data plant_1
、python 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 $*
现在,如果您 运行 make
或 make all
它将构建所有这些。如果您 运行 make plant_1
或 make plant_1 plant_3
将仅构建这些。
我有一组植物(我们称它们为 plant_1
、plant_2
等)和几个步骤来处理它们的数据。我想创建一个可以同时处理一个工厂或所有工厂数据的 makefile。
每个植物都使用相同的一组 Python 命令:例如python join_data plant_1
、python clean_data plant_1
、python 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 $*
现在,如果您 运行 make
或 make all
它将构建所有这些。如果您 运行 make plant_1
或 make plant_1 plant_3
将仅构建这些。