我正在使用make
自动化的项目来生成大量数据,然后对其进行处理,其配方大致如下:
processed-data: data
data-processing-program $^ > $@
data:
output-data > $@
它data
有自己的配方,因为其他各种目标也处理它。
该output-data
程序运行一段时间。一旦完成,就data-processing-program
开始并最终产生processed-data
:
通过并行运行,在文件完成之前流式传输data
到文件,这显然会更快:data-processing-program
我如何在 a 中表达这样的关系Makefile
?
我考虑过的选项:
我试过使用
--jobs
/-j
并行执行多个食谱,但make
在执行其依赖项之前仍然等待任何配方完成。我观察到,如果我手动执行此操作,我只需编写一个管道:
output-data | data-processing-program > processed-data
一旦有数据可用,它将立即处理数据。
我玩弄了一个菜谱来模仿它,通过让
data
菜谱创建一个命名管道而不是文件,并生成一个后台进程来将数据写入其中。然而,管道中的数据只能读取一次,因此无法使用多个配方处理相同的数据。
答案1
您可以通过使用tee
将输出的一个副本保存到磁盘,同时将另一个副本提供给data-processing-program
:
output-data | tee data | data-processing-program > processed-data
data
这将为你的 makefile 中的其他目标 留下一个带有正确时间戳的副本。
有多种方法可以将此管道与依赖项关联起来,因此我将让您选择对您有意义的任何方法。 (除非你仍然陷入困境,在这种情况下请跟进。)例如,由于规则生成两者data
,processed-data
我可能会写:
data processed-data:
output-data | tee data | data-processing-program > processed-data