下面我复制了一个 Makefile 的示例,用于执行一些脚本来清理和合并数据。
这种 Makefile 格式要求我将每个目标文件列出两次:一次在all
下,一次作为每个配方的目标。随着生成文件变长,我有时会忘记在创建新配方后向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
通常,您可以通过使用模式和列表来避免此类重复。 在您的情况下,由于依赖项似乎不遵循简单的模式,因此您必须显式定义与文件关联的任何唯一依赖项。 假设每个.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
( 和特殊依赖关系规则中列出具有特殊依赖关系的每个目标。