如何使用循环在makefile中追加列表

时间:2019-04-03 17:22:39

标签: list makefile append

我正在尝试创建仅依赖于一个文件的目标列表。我要创建的列表很长,可能需要向其中添加更多元素,因此我想使用循环来创建该目标列表。目标的主要区别在于路径。

我想我只需要了解如何在makefile中追加或添加列表,这样就可以循环创建所需的目标列表(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 个答案:

答案 0 :(得分:1)

可能您想要类似的东西:

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

请注意,我使用:=而非=来提高效率。

答案 1 :(得分:0)

您将要使用foreach makefile函数:

您可以执行以下操作:

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))))

注意:我使用了$\技巧,可以在不添加空格的情况下跳过多行(请参见here

如果您想做一些更复杂的事情,则可以始终使用Shell脚本来完成所有操作。

TARGETS := $(shell somescript a b c)