在 Makefile 中,如何在完成构建之前开始处理文件?

在 Makefile 中,如何在完成构建之前开始处理文件?

我正在使用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 中的其他目标 留下一个带有正确时间戳的副本。

有多种方法可以将此管道与依赖项关联起来,因此我将让您选择对您有意义的任何方法。 (除非你仍然陷入困境,在这种情况下请跟进。)例如,由于规则生成两者dataprocessed-data我可能会写:

data processed-data:
    output-data | tee data | data-processing-program > processed-data

相关内容