Как написать make-файл, чтобы он игнорировал «несущественные» изменения? - PullRequest
1 голос
/ 06 марта 2019

Скажи, что у меня есть такой Makefile

B: A
    quick-custom-script < $< > $@

C: B
    slow-custom-script < $< > $@

Также предположим, что вполне может случиться, что изменения в A приведут к тому же B. Я хотел бы добиться, чтобы в таком случае сложное создание C не учитывалось, потому что , что , безусловно, является ненужной работой, когда он имеет неизменный ввод.

Моя идея заключалась в том, чтобы поместить выходные данные quick-custom-script во временный файл, сравнить его с текущим B и перезаписать B только при обнаружении различий. В этом случае правило C все равно будет видеть старый B и ничего не делать. К сожалению, это создает еще одну проблему, которую я вижу (и, возможно, больше?): При любом последующем запуске, даже без внесенных изменений, A будет новее, чем не перезаписанный B и, следовательно, (даже если это быстро) первый скрипт будет запущен - излишне.

Я думаю, что это может быть несколько минимизировано следующим образом

Btemp: A
    quick-custom-script < $< > $@

B: Btemp
    diff -q $< $@ || cp $< $@

C: B
    slow-custom-script < $< > $@

Тем не менее, мне интересно, есть ли более разумный способ достичь моей цели?

1 Ответ

2 голосов
/ 06 марта 2019

Это довольно близко к обычному соглашению.Это ставит сравнение в один и тот же рецепт, например:

B: A
    quick-custom-script < $< > $@T
    $(move-if-change)

С таким определением:

move-if-change = @if cmp -s $@ $@T ; then rm $@T ; else mv $@T $@; fi

Эта комбинация в одном правиле имеет то преимущество, что если quick-custom-script заканчивается ненормально иmake-файл запускается снова, рецепт запускается с нуля, а частично записанный выходной файл отбрасывается.

Использование cmp обычно быстрее, чем diff, а mv является атомарным, поэтому избегаетповторное введение той же потенциальной коррупции.

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