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

发布于 2024-08-20 22:16:45 字数 408 浏览 0 评论 0原文

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

  1. 运行脚本来生成数据
  2. 获取所有输出文件(data1.txt 到 data79.txt)并运行一个脚本来绘制它们每个
  3. 获取所有这些图像并制作一个是的

,我意识到在 shell/python 脚本中执行此操作非常简单,但我正在尝试学习如何在这种情况下使用 make 来更智能地完成工作。

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

movie: data *.png 
    ffmpeg data_%d.png output.mp4

%.png: %.txt
    python plot.py $< $@

data:
    python make_data.py

I'm trying to use the linux utility make in order to

  1. Run a script to generate the data
  2. Take all of the output files (data1.txt to data79.txt) and run a script to plot them each
  3. Take all those images and make a movie from them

Yes, I realize that doing this in a shell/python script would be downright simple but I'm trying to learn how to use make in this context to do the work more intelligently.

My current make file looks something like this but is significantly flawed:

movie: data *.png 
    ffmpeg data_%d.png output.mp4

%.png: %.txt
    python plot.py 
lt; $@

data:
    python make_data.py

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦开始←不甜 2024-08-27 22:16:45

您有几个问题,所以让我们按顺序解决它们。 (警告:我使用 GNUMake,所以我不能保证我的解决方案适用于其他风格,而且我不熟悉 ffmpeg。)

  1. 数据规则看起来是正确的,但您可能想警告 Make 该规则实际上不会产生一个名为“data”的文件:
    .PHONY:数据
    
    你可以自己测试这个规则:“make data”。
    
  2. %.png 规则看起来是正确的。您可以测试它:“make data26.png”(确保data26.txt存在之后)。
  3. 电影规则。这是一个问题,因为您使用“*.png”来指示所有 png 文件,但在运行规则时不存在此类文件,因此计算结果为空。因此,我们必须查看所有存在的数据文件,并将该列表转换为要制作的图像列表:
    dfiles = $(通配符 *.txt)
    图像 = $(dfiles:txt=png)
    
    如果数据文件已经存在(并且您可以在“make data”之后测试它),那么这将起作用,但是当我们第一次运行make时,数据文件不存在。有几种方法可以解决这个问题;最简单的方法是在创建数据文件后,在规则内第二次运行 Make:
    
     $(MAKE) 输出.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 
lt; $@ 

.PHONY: data
data: 
    python make_data.py

请注意,有些人喜欢将所有 PHONY 声明放在一起:“.PHONY:电影数据”。我更喜欢按照上面的方式进行操作。)

You have several problems, so let's take them in order. (Caveats: I use GNUMake, so I can't promise my solution will work with other flavors, and I am not familiar with ffmpeg.)

  1. The data rule looks correct, but you might want to warn Make that this rule does not actually produce a file called "data":
    .PHONY: data
    

    You can test this rule by itself: "make data".

  2. The %.png rule looks correct. You can test it: "make data26.png" (after making sure that data26.txt exists).
  3. The movie rule. This is a problem, because you're using "*.png" to indicate all png files, but at the time you run the rule there are no such files, so this evaluates to nothing. So we must look at all the data files that exist, and translate that list into a list of images to be made:
    dfiles = $(wildcard *.txt)
    images = $(dfiles:txt=png)
    

    This will work if the data files already exist (and you can test it after "make data"), but when we first run make, the data files don't exist. There are several ways to address this; the simplest is to run Make a second time from within a rule, after the data files have been made:

        $(MAKE) output.mp4
    

Putting it all together, we get something like this:

.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 
lt $@ 

.PHONY: data
data: 
    python make_data.py

(Note that some people like to put all the PHONY declarations together: ".PHONY: movie data". I prefer to do it as above.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文