【发布时间】:2020-12-04 12:38:19
【问题描述】:
考虑以下设置:
$ touch 1.src 2.src 3.src
$ cat Makefile
%.dst: %.src
@convert -o "$@" "$<"
我们可以通过运行make 1.dst 2.dst 3.dst 将.src 文件编译成.dst 文件,这会调用convert(只是一个占位符)工具三次。
如果调用convert 的开销很小,则此设置很好。但是,在我的情况下,每次调用都会有几秒钟的启动惩罚。幸运的是,该工具可以在一次调用中转换多个文件,同时只需支付一次启动费用,即convert -o '{}.dst' 1.src 2.src 3.src。
在 GNU make 中是否有办法指定多个 src 文件应批处理到对 convert 的一次调用中?
编辑:更准确地说,我在寻找什么功能for:假设1.dst 已经比1.src 更新,所以不需要重新编译。如果我运行make 1.dst 2.dst 3.dst,我希望GNU make 执行convert -o '{}.dst' 2.src 3.src。
一种快速而肮脏的方法是创建一个 .PHONY 规则,它只是将所有 src 文件转换为 dst 文件,但这样我每次都会转换每个 src 文件。此外,在其他规则中将 dst 文件指定为先决条件也不再可能。
提前致谢!
【问题讨论】:
-
我不会这样做。当单个文件从另一个单个文件中出来时,使用
make -j可以有效地并行运行。一步从多个文件中创建多个目标很笨重(正如您从建议的答案中看到的那样),Makefile变得更加复杂且难以维护,并且您可能会遇到不同的极端情况,它会以不同的方式成为瓶颈。我会考虑减少启动开销是否值得未来维护。也许一个简单的并行make就足够了? -
我实际上在尽可能使用
make -j。convert工具的问题是启动需要大约 3 秒,编译源代码不到一秒。即使我并行运行它,它也会一遍又一遍地在同一个启动过程上花费大量时间。我不确定是否可以减少启动开销。该工具是用 python 编写的,可能会在解释器中花费启动时间。