我正在尝试创建仅依赖于一个文件的目标列表。我要创建的列表很长,可能需要向其中添加更多元素,因此我想使用循环来创建该目标列表。目标的主要区别在于路径。
我想我只需要了解如何在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)
答案 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)