首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除Makefile中的复制:目标文件在伪变量‘a’下编写一次,然后再作为配方目标写入

问删除Makefile中的复制:目标文件在伪变量‘a’下编写一次,然后再作为配方目标写入
EN

Stack Overflow用户
提问于 2019-10-10 17:29:09
回答 1查看 106关注 0票数 0

下面我复制了一个Makefile示例,用于执行一些脚本来清理和合并数据。

这种Makefile格式要求我列出每个目标文件两次:一次在all下,一次作为每个菜谱的目标。随着makefile变得越来越长,我有时会忘记在创建新的菜谱之后向all添加新的目标。

如果没有all变量,Make将只构建第一个目标及其先决条件。

如何从Makefile中删除这个复制源,如果它们的先决条件发生变化,仍然会检查和重建所有的食谱目标?

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2019-10-10 22:35:35

通常,您可以通过使用模式和列表来避免这种重复。在您的示例中,由于依赖项似乎不遵循简单的模式,因此必须显式定义任何与文件关联的唯一依赖项。假设每个.rds依赖于相应的.R文件,您可以使用静态模式规则消除一些复制,如下所示:

代码语言:javascript
复制
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)和特殊依赖关系规则中列出具有特殊依赖项的每个目标。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58328245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档