Удалите дублирование в Makefile: целевые файлы записываются один раз в переменную Phony `all` и снова как цели рецепта - PullRequest
0 голосов
/ 10 октября 2019

Ниже я скопировал пример Makefile для выполнения некоторых скриптов для очистки и объединения данных.

Этот формат Makefile требует от меня перечисления каждого целевого файла дважды: один раз в all и один раз в качестве цели каждого рецепта. Поскольку make-файл становится длинным, я иногда забываю добавлять новые цели в 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

1 Ответ

1 голос
/ 11 октября 2019

Часто вы можете избежать такого дублирования, используя шаблоны и списки. В вашем случае, поскольку зависимости, кажется, не следуют простому шаблону, вы должны явно определить любые уникальные зависимости, связанные с файлом. Предполагая, что каждый .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), так и в специальных правилах зависимостей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...