Как использовать GNU Make для создания фильма из проиндексированных файлов данных? - PullRequest
1 голос
/ 09 февраля 2010

Я пытаюсь использовать утилиту 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

1 Ответ

3 голосов
/ 09 февраля 2010

У вас есть несколько проблем, поэтому давайте рассмотрим их по порядку. (Предостережения: я использую GNUMake, поэтому не могу обещать, что мое решение будет работать с другими вариантами, и я не знаком с ffmpeg.)

  1. Правило данных выглядит правильно, но вы можете предупредить, что на самом деле это правило не создает файл с именем «data»:
    .PHONY: data
    
    Вы можете проверить это правило самостоятельно: «сделать данные».
  2. Правило% .png выглядит правильно. Вы можете проверить это: «make data26.png» (убедившись, что data26.txt существует).
  3. Правило кино. Это проблема, потому что вы используете «* .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 $&lt $@ 

.PHONY: data
data: 
    python make_data.py

(Обратите внимание, что некоторые люди любят объединять все объявления PHONY: «.PHONY: данные фильма». Я предпочитаю делать это, как указано выше.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...