Makefile 如何使用GNU Make从索引数据文件制作电影?

Makefile 如何使用GNU Make从索引数据文件制作电影?,makefile,Makefile,我试图使用linux实用程序make来 运行脚本以生成数据 获取所有输出文件(data1.txt到data79.txt)并运行脚本来分别绘制它们 拍下所有这些照片,然后用它们制作一部电影 是的,我意识到在shell/python脚本中执行此操作非常简单,但我正在尝试学习如何在此上下文中使用make来更智能地执行此工作 我当前的make文件看起来像这样,但有明显的缺陷: movie: data *.png ffmpeg data_%d.png output.mp4 %.png: %.t

我试图使用linux实用程序make来

  • 运行脚本以生成数据
  • 获取所有输出文件(data1.txt到data79.txt)并运行脚本来分别绘制它们
  • 拍下所有这些照片,然后用它们制作一部电影
  • 是的,我意识到在shell/python脚本中执行此操作非常简单,但我正在尝试学习如何在此上下文中使用make来更智能地执行此工作

    我当前的make文件看起来像这样,但有明显的缺陷:

    movie: data *.png 
        ffmpeg data_%d.png output.mp4
    
    %.png: %.txt
        python plot.py $< $@
    
    data:
        python make_data.py
    
    movie:data*.png
    ffmpeg数据_u%d.png输出.mp4
    %.png:%.txt
    python plot.py$<$@
    数据:
    python make_data.py
    
    您有几个问题,让我们来整理一下。(注意事项:我使用GNUMake,因此我不能保证我的解决方案能与其他口味的产品一起使用,而且我对ffmpeg也不熟悉。)

  • 数据规则看起来是正确的,但您可能希望警告Make此规则实际上不会生成名为“data”的文件: .虚假:数据 您可以自行测试此规则:“生成数据”。
  • %.png规则看起来是正确的。您可以测试它:“makedata26.png”(在确保data26.txt存在之后)。
  • 电影规则。这是一个问题,因为您使用“*.png”表示所有png文件,但在运行规则时没有此类文件,因此计算结果为零。因此,我们必须查看现有的所有数据文件,并将该列表转换为要制作的图像列表: dfiles = $(wildcard *.txt) images = $(dfiles:txt=png) D文件=$(通配符*.txt) 图像=$(数据文件:txt=png) 如果数据文件已经存在(您可以在“生成数据”之后对其进行测试),这将起作用,但是当我们第一次运行make时,数据文件不存在。有几种方法可以解决这个问题;最简单的方法是在生成数据文件后,在规则中再次运行Make: $(MAKE) output.mp4 $(MAKE)output.mp4 综合起来,我们得到如下结果:

    .PHONY: movie movie: data @$(MAKE) -s output.mp4 # I added the "@" and "-s" to make it quieter. dfiles = $(wildcard *.txt) images = $(dfiles:txt=png) output.mp4: $(images) ffmpeg data_%d.png $@ %.png: %.txt python plot.py $< $@ .PHONY: data data: python make_data.py .冒牌货:电影 电影:数据 @$(MAKE)-s output.mp4#我添加了“@”和“-s”使它更安静。 D文件=$(通配符*.txt) 图像=$(数据文件:txt=png) output.mp4:$(图像) ffmpeg数据\uu%d.png$@ %.png:%.txt python plot.py$<$@ .虚假:数据 数据: python make_data.py (注意,有些人喜欢把所有虚假的声明放在一起:“.PHONY:moviedata”。我更喜欢像上面那样做。)

    .PHONY: movie movie: data @$(MAKE) -s output.mp4 # I added the "@" and "-s" to make it quieter. dfiles = $(wildcard *.txt) images = $(dfiles:txt=png) output.mp4: $(images) ffmpeg data_%d.png $@ %.png: %.txt python plot.py $< $@ .PHONY: data data: python make_data.py