目标数量可变的 Makefile

Makefile with variable number of targets

我正在尝试用 Makefile 做一个数据管道。我有一个大文件,我想将其分成较小的部分以并行处理。事先不知道子集的数量和每个子集的大小。例如,这是我的文件

$ for i in {1..100}; do echo $i >> a.txt; done

Makefile 中的第一步应该计算范围,...让它们暂时固定

ranges.txt: a.txt
   or i in 0 25 50 75; do echo  $$(($$i+1))'\t'$$(($$i+25)) >> $@; done

下一步应该从 ranges.txt 读取,并为 ranges.txt、a_1.txt、a_2.txt、a_3.txt、a_4.txt。其中 a_1.txt 包含第 1 行到第 25 行,a_2.txt 包含第 26-50 行,依此类推...可以做到吗?

您没有说明您使用的是哪个版本的 make,但我假设是 GNU make。有几种方法可以做这样的事情;我写了一组关于 metaprogramming in GNU make 的博客文章(我的意思是让 make 自动生成自己的规则)。

如果是我,我可能会为此使用 constructed include files 方法。所以,我会用你上面的 ranges.txt 规则代替创建一个 makefile,也许 ranges.mk。 makefile 将包含一组目标,例如 a_1.txta_2.txt 等,并将定义特定于目标的变量,定义起始值和终止值。然后你可以 -include 生成的 ranges.mk 并且 make 将重建它。你没有描述的一件事是当你想重新计算范围时:这真的取决于 a.txt 的内容吗?

无论如何,像这样:

.PHONY: all
all:

ranges.mk: a.txt   # really? why?
        for i in 0 25 50 75; do \
            echo 'a_$$i.txt : RANGE_START := $$(($$i+1))'; \
            echo 'a_$$i.txt : RANGE_END   := $$(($$i+25))'; \
            echo 'TARGETS += a_$$i.txt'; \
        done > $@

-include ranges.mk

all: $(TARGETS)
$(TARGETS) : a.txt   # seems more likely
        process --out $@ --in $< --start $(RANGE_START) --end $(RANGE_END)

(或任何命令;您不提供任何示例)。