删除生成文件中的重复项:目标文件在虚假变量"all"下写入一次,然后再次作为配方目标写入



下面我复制了一个 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( 和特殊依赖关系规则中列出具有特殊依赖关系的每个目标。

相关内容

最新更新