Как добавить списки в make-файл, используя циклы - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь создать список целей, которые зависят только от одного файла.Список, который я хочу создать, очень длинный, и мне, возможно, придется добавить в него еще больше элементов, поэтому я хотел бы использовать циклы для создания этого целевого списка.Цели различаются в основном по их путям.

Я думаю, мне просто нужно выяснить, как добавить или добавить в список в make-файле, чтобы я мог создать нужный мне список целей (TARGETS) в цикле.

Вот что у меня есть:

.PHONY: all dircreate dircreate_sub

# Create shortcuts to directories ##############################################
DAT4 = data/4-Year/
DAT2 = data/2-Year/
DEPVARS = a b 

# Create directories ###########################################################
dircreate:
    mkdir -p \
    data/ \
    data/4-Year/ \
    data/2-Year/ 

dircreate_sub:
    for d in $(DEPVARS); do \
        mkdir -p data/4-Year/$$d ; \
        mkdir -p data/2-Year/$$d ; \
    done;

TARGETS = \
    for d in $(DEPVARS); do \
        $(DAT4)$$d/train_index.RDS \
        $(DAT2)$$d/train_index.RDS \
        $(DAT4)$$d/test_index.RDS \
        $(DAT2)$$d/test_index.RDS; \
    done;

$(TARGETS): \
    dataprep.R \
    funcs.R \
    ../core/data/analysis.data.RDS
    Rscript $<

all: dircreate dircreate_sub $(TARGETS)

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Возможно, вы хотите что-то вроде:

TARGETS := $(foreach d,$(DEPVARS),\
    $(DAT4)$d/train_index.RDS \
    $(DAT2)$d/train_index.RDS \
    $(DAT4)$d/test_index.RDS \
    $(DAT2)$d/test_index.RDS)

Обратите внимание, что я использовал := вместо = для эффективности.

0 голосов
/ 03 апреля 2019

Вы захотите использовать функцию makefile foreach:

Вы можете сделать что-то вроде этого:

TARGETS := $(foreach depvar,$(DEPVARS),$(DAT4)$$d/train_index.RDS)
TARGETS += $(foreach depvar,$(DEPVARS),$(DAT2)$$d/train_index.RDS)
TARGETS += $(foreach depvar,$(DEPVARS),$(DAT4)$$d/test_index.RDS)
TARGETS += $(foreach depvar,$(DEPVARS),$(DAT2)$$d/test_index.RDS)

или как-то так:

TARGETS := $(foreach dat,$(DAT4) $(DAT2),$\
              $(foreach filename,train_index.RDS test_index.RDS,$\
                 $(foreach depvar,$(DEPVARS),$(dat)$(depvar)/$(filename))))

Примечание: я использовал трюк $\, чтобы пропустить несколько строк без добавления пробелов (см. здесь )

Если вы хотите сделать что-то более сложное, вы всегда можете использовать скрипт оболочки, чтобы сделать все.

TARGETS := $(shell somescript a b c) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...