目标数量可变的 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.txt
、a_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)
(或任何命令;您不提供任何示例)。
我正在尝试用 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.txt
、a_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)
(或任何命令;您不提供任何示例)。