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

时间:2010-02-09 05:54:55

标签: makefile

我正在尝试使用linux实用程序make

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

    我当前的make文件看起来像这样但是存在很大缺陷:

    movie: data *.png 
        ffmpeg data_%d.png output.mp4
    
    %.png: %.txt
        python plot.py $< $@
    
    data:
        python make_data.py
    

1 个答案:

答案 0 :(得分:3)

你有几个问题,所以让我们把它们按顺序排好。 (注意事项:我使用GNUMake,所以我不能保证我的解决方案可以与其他版本一起使用,而且我对ffmpeg不熟悉。)

  1. 数据规则看起来是正确的,但您可能需要警告请确保此规则实际上不会生成名为“data”的文件:
    .PHONY: data
    
    您可以单独测试此规则:“make data”。
  2. %.png规则看起来正确。你可以测试它:“make data26.png”(在确保data26.txt存在之后)。
  3. 电影规则。这是一个问题,因为你使用“* .png”来表示所有png文件,但是在你运行规则时没有这样的文件,所以这个评估为空。因此,我们必须查看存在的所有数据文件,并将该列表转换为要制作的图像列表:
    dfiles = $(wildcard *.txt)
    images = $(dfiles:txt=png)
    
    如果数据文件已经存在(并且您可以在“生成数据”之后对其进行测试),这将起作用,但是当我们第一次运行make时,数据文件不存在。有几种方法可以解决这个问题;最简单的方法是在数据文件生成后,在规则内第二次运行:
        $(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

(请注意,有些人喜欢将所有PHONY声明放在一起:“。PHONY:电影数据”。我更喜欢这样做。)