Могу ли я позволить сделать удалить промежуточные файлы? - PullRequest
0 голосов
/ 10 марта 2020

Я почему-то изо всех сил пытаюсь понять концепцию промежуточных файлов make.

Рассмотрим пример процесса make:

Входные файлы:

  • myProgram.code
  • myGraphic.picture

Этапы построения:

  1. Обрезать границы myGraphic.picture
  2. Конвертируйте вырезанные графы c в специальный формат
  3. Скомпилируйте код, включая преобразованные графические c.

Это концепция: Concept drawing

В Makefile это будет выглядеть так:

all: myProgram.exe

myProgram.exe: myProgram.code myGraphic.picture.cut.converted
    compiler -code myProgram.code -graphic myGraphic.picture.cut.converted

myGraphic.picture.cut.converted: myGraphic.picture.cut
    converter -in myGraphic.picture.cut -out myGraphic.picture.cut.converted

myGraphic.picture.cut: myGraphic.picture
    cutter -in myGraphic.picture -out myGraphic.picture.cut

Насколько я понимаю, после запуска make у меня будет скомпилированная программа, а также промежуточные файлы .cut.converted и .cut.

Есть ли способ автоматического удаления этих файлов? И если да, то достаточно ли интеллектуален make, чтобы не воспроизводить их все, когда исходная картинка не изменилась?

Ответы [ 3 ]

3 голосов
/ 10 марта 2020

Нет ничего проще. Просто добавьте эту цель :

.INTERMEDIATE: myGraphic.picture.cut myGraphic.picture.cut.converted
1 голос
/ 10 марта 2020

Да. Вы можете удалять файлы, если они вам не нужны. Например:

results.txt : testzipf.py isles.dat abyss.dat last.dat
    python $^ *.dat > $@
    rm -f *.dat


.PONY : dats
dats : isles.dat abyss.dat last.dat

%.dat : books/%.txt countwords.py
    python countwords.py $< $@

Этот файл создает файл results.txt из данных и, наконец, удаляет файлы данных rm -f *.dat

При повторном запуске команды make будут созданы промежуточные файлы. снова и удалите их после использования для создания цели.

Ваш скрипт make будет выглядеть как

all: myProgram.exe
   rm -f *.cut
myProgram.exe: myProgram.code myGraphic.picture.cut.converted
   compiler -code myProgram.code -graphic        myGraphic.picture.cut.converted

myGraphic.picture.cut.converted: myGraphic.picture.cut
   converter -in myGraphic.picture.cut -out myGraphic.picture.cut.converted

myGraphic.picture.cut: myGraphic.picture
   cutter -in myGraphic.picture -out myGraphic.picture.cut
1 голос
/ 10 марта 2020

Если цель специально названа в Makefile, а не в зависимости от волхвов c target .INTERMEDIATE, то она будет сохранена.

Так что добавьте строку .INTERMEDIATE:, и / или перефразируйте ваши конверсии, чтобы они соответствовали шаблонным правилам:

%.cut.converted: %.cut
    converter -in $< -out $@

%.picture.cut: %.picture
    cutter -in $< -out $@

Это также дает преимущество в том, что их легче читать.

Возможно, вам удастся устранить хотя бы некоторые из временные файлы, если инструменты могут использоваться в качестве фильтров в конвейере, конечно.

...