下面我复制了一个Makefile示例,用于执行一些脚本来清理和合并数据。
这种Makefile格式要求我列出每个目标文件两次:一次在all
下,一次作为每个菜谱的目标。随着makefile变得越来越长,我有时会忘记在创建新的菜谱之后向all
添加新的目标。
如果没有all
变量,Make将只构建第一个目标及其先决条件。
如何从Makefile中删除这个复制源,如果它们的先决条件发生变化,仍然会检查和重建所有的食谱目标?
DIR_DATA = ./data
DIR_RAW = $(DIR_DATA)/raw
DIR_MUNGE = ./munge
VPATH = $(DIR_RAW) $(DIR_DATA) $(DIR_MUNGE)
########################################################
####################### Recipes ########################
########################################################
ds_mtcars.rds: ds_mtcars.R ds_mt_raw.csv
Rscript $<
ds_mt_agg.rds: ds_mt_agg.R ds_mtcars.rds
Rscript $<
ds_mt_temp.rds: ds_mt_temp.R ds_mtcars.rds ds_mt_agg.rds
Rscript $<
########################################################
####################### Phony vars #####################
########################################################
.Phony: all
all: ds_mtcars.rds ds_mt_agg.rds ds_mt_temp.rds
clean:
rm -f ./data/*.rds
发布于 2019-10-10 14:35:35
通常,您可以通过使用模式和列表来避免这种重复。在您的示例中,由于依赖项似乎不遵循简单的模式,因此必须显式定义任何与文件关联的唯一依赖项。假设每个.rds
依赖于相应的.R
文件,您可以使用静态模式规则消除一些复制,如下所示:
RDS_FILES := ds_mtcars.rds ds_mt_agg.rds ds_mt_temp.rds
all:
# define any unique dependencies explicitly:
ds_mtcars.rds: ds_mt_raw.csv
ds_mt_agg.rds: ds_mtcars.rds
ds_mt_temp.rds: ds_mtcars.rds ds_mt_agg.rds
# use Static pattern rule --
# explicit dependencies will be stacked
$(RDS_FILES) : %.rds : %.R
Rscript $<
.Phony: all
all: $(RDS_FILES)
您仍然必须在起始列表(RDS_LIST
)和特殊依赖关系规则中列出具有特殊依赖项的每个目标。
https://stackoverflow.com/questions/58328245
复制