Это своего рода продолжение вопроса от здесь .Проблема состоит в том, что существует правило, генерирующее несколько выходов из одного входа, и команда отнимает много времени, поэтому мы бы предпочли избежать повторного вычисления.Теперь есть еще одна особенность: мы хотим, чтобы файлы не удалялись как промежуточные файлы, а в правилах используются подстановочные знаки для учета параметров.
Было предложено следующее правило:
file-a.out: program file.in
./program file.in file-a.out file-b.out file-c.out
file-b.out: file-a.out
@
file-c.out: file-b.out
@
Затем вызов make file-c.out
создает оба, и мы избегаем проблем с запуском make
параллельно с переключателем -j
.Пока все хорошо.
Проблема в следующем.Поскольку приведенное выше решение устанавливает цепочку в DAG, make
считает это по-другому;файлы file-a.out
и file-b.out
обрабатываются как промежуточные файлы, и они по умолчанию удаляются как ненужные, как только file-c.out
готов.
Способ избежать, который был упомянут где-то здесь, и состоитдобавление file-a.out
и file-b.out
в качестве зависимостей от цели .SECONDARY
, что предотвращает их удаление.К сожалению, это не решает мой случай, потому что мои правила используют шаблоны шаблонов;в частности, мои правила выглядят так:
file-a-%.out: program file.in
./program $* file.in file-a-$*.out file-b-$*.out file-c-$*.out
file-b-%.out: file-a-%.out
@
file-c-%.out: file-b-%.out
@
, так что можно передать параметр, который включается в имя файла, например, с помощью
make file-c-12.out
Решение, которое *Документация 1030 * предлагает добавить их в список неявных правил в список зависимостей .PRECIOUS
, тем самым не допуская удаления этих файлов.
Решение с .PRECIOUS
работает, но также предотвращаетэти файлы не удаляются, если правило не выполняется и файлы неполные.Есть ли другой способ заставить эту работу?
Хак, чтобы решить эту проблему, это определить цель .SECONDARY
без предварительных условий, то есть
.SECONDARY:
, которая сообщает make
, чтовсе файлы должны рассматриваться как вторичные и, следовательно, не удаляться, кроме случаев, когда make
прерывается или не выполняется правило.К сожалению, это не позволяет выбрать подмножество правил с подстановочными знаками для работы таким образом, поэтому я считаю это всего лишь взломом (хотя это и полезно).