0

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

在生成文件中考虑以下简单规则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 的每次调用都是串行执行的。

有任何想法吗?

4

1 回答 1

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 ., ,$@))

(请注意,我没有对此进行测试,但希望您能理解)。

于 2013-10-24T20:11:38.273 回答