make - создавать промежуточные файлы только при необходимости - PullRequest
0 голосов
/ 11 сентября 2018

Я пишу Makefile для построения латексного документа в зависимости от графиков, данные которых генерируются из некоторых других данных с помощью некоторого сценария Python.

Это выглядит так

% pdf plot needed by final document
build/tikz-standalone/%.pdf: build/tikz-standalone/%.tex xy_data
    cd $$(dirname $@) && ../../latexrun $$(basename $<)

xy_data: $(PLOT_DATA) tools/plots/crunch.py | build
    % crunch.py will create data for plots needed by build/tikz-standalone/%.tex
    PYTHONPATH=. tools/plots/crunch.py

build:
    mkdir -p build build/other_stuff ...

crunch.py генерирует несколько файлов данных в build/data, которые необходимы для build/tikz-standalone/%.tex.Для создания этих файлов используются другие файлы, хранящиеся в переменной PLOT_DATA.Я мог бы поместить список промежуточных файлов данных в build/data в Makefile в позиции xy_data.Мне это не нравится, так как для этого потребуется обновлять список всякий раз, когда добавляется новый файл.Я хочу, чтобы все файлы данных создавались заново при каждом изменении crunch.py или $(PLOT_DATA).

Есть ли способ выразить это в Make?

1 Ответ

0 голосов
/ 11 сентября 2018

Если вы не хотите предоставлять и поддерживать список сгенерированных файлов, вы можете превратить вашу (неявно) ложную цель xy_data в пустой файл, используемый в качестве маркера.Просто прикоснитесь к нему в конце рецепта:

BUILDDIRS := build build/other_stuff ...

build/tikz-standalone/%.pdf: build/tikz-standalone/%.tex xy_data
    cd $(dir $@) && ../../latexrun $(notdir $<)

xy_data: $(PLOT_DATA) tools/plots/crunch.py | $(BUILDDIRS)
    PYTHONPATH=. tools/plots/crunch.py
    touch $@

$(BUILDDIRS):
    mkdir -p $@

Примечание: я также немного улучшил некоторые другие аспекты:

  1. Использование функций make dir и notdirвместо эквивалентов оболочки.
  2. Объявление переменной для каталогов сборки, чтобы избежать записи одного и того же списка несколько раз, что утомительно и подвержено ошибкам.
  3. Явный список всех каталогов сборки только по порядкупредварительные условия вместо одного, что может привести к неожиданным результатам, если этот единственный существует, но не некоторые другие.
  4. Общее правило для всех каталогов сборки благодаря автоматической переменной $@.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...