如何在并行运行时为子制作提供参数?

时间:2013-10-24 20:06:43

标签: parallel-processing makefile gnu-make

我正在尝试使用make来处理一些数据处理。

在makefile makefile-month

中考虑以下简单规则
output_$(YEAR)_$(MONTH): input_$(YEAR)_$(MONTH)
    foo input_$(YEAR)_$(MONTH) output_$(YEAR)_$(MONTH) 

此规则可用于处理任何所需的月份,例如

make -f makefile-month YEAR=2006 MONTH=2

这很好用。

我现在真正感兴趣的是使用make来并行处理几个月。 但是,我找不到实现这一目标的简单方法。

请注意,使用shell for循环不适用于并行make。 定义全局makefile,

all:
    for year in 2006; do \
        for month in 1 2 3 4 5 6 7 8 9 10 11 12; do \
            $(MAKE) -f makefile-month YEAR=$$year MONTH=$$month; \
        done; \
    done

并且正在运行,

make -j 12

并不是每个月并行执行。 对sub-make的每次调用都是串行执行的。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

有许多不同的方法来处理细节,但整体解决方案是在单个配方中远离for循环并切换到单个目标。例如:

YEARS := 2006 2007
MONTHS := 1 2 3 4 5 6 7 8 9 10 11 12

TARGETS := $(foreach Y,$(YEARS),$(foreach M,$(MONTHS),month.$Y.$M))

.PHONY: all $(TARGETS)
all: $(TARGETS)

$(TARGETS):
        $(MAKE) -f makefile-month YEAR=$(word 2,$(subst ., ,$@)) MONTH=$(word 3,$(subst ., ,$@))

(注意我没有对此进行测试,但希望你能得到这个想法)。