У вас есть несколько проблем, поэтому давайте рассмотрим их по порядку. (Предостережения: я использую GNUMake, поэтому не могу обещать, что мое решение будет работать с другими вариантами, и я не знаком с ffmpeg.)
- Правило данных выглядит правильно, но вы можете предупредить, что на самом деле это правило не создает файл с именем «data»:
.PHONY: data
Вы можете проверить это правило самостоятельно: «сделать данные».
- Правило% .png выглядит правильно. Вы можете проверить это: «make data26.png» (убедившись, что data26.txt существует).
- Правило кино. Это проблема, потому что вы используете «* .png» для обозначения всех файлов png, но в то время, когда вы запускаете правило, таких файлов нет, поэтому это ничего не значит. Поэтому мы должны посмотреть на все файлы данных, которые существуют, и перевести этот список в список изображений, которые будут сделаны:
dfiles = $(wildcard *.txt)
images = $(dfiles:txt=png)
Это будет работать, если файлы данных уже существуют (и вы можете проверить это после «make data»), но когда мы впервые запустим make, файлы данных не будут существовать. Есть несколько способов решить эту проблему; самое простое - запустить 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: данные фильма». Я предпочитаю делать это, как указано выше.)