- makefile/
- Makefile 如何使用GNU Make从索引数据文件制作电影?
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