Почему этот make файл удаляет мою цель?
Минимальный пример:
%.txt: foo.log
# pass
%.log:
# pass
Run:
$ make a.txt --dry-run
# pass
# pass
rm foo.log
Почему последнее действие - rm foo.log?
Как избавиться от него?
Ответы
Ответ 1
По умолчанию GNU make удаляет промежуточные файлы. Поскольку%.txt зависит от%.log, make хочет удалить файл .log. Чтобы предотвратить такое поведение, вы отмечаете их как драгоценные. PRECIOUS или .SECONDARY.
.PRECIOUS: foo.log
Кроме того, вы можете сделать так, чтобы промежуточные файлы не удалялись при использовании .SECONDARY без зависимостей.
.SECONDARY:
См. этот раздел руководства GNU.
Ответ 2
Вы создаете a.txt
с помощью цепочки неявных правил (в данном случае неявных правил, которые вы определили сами). Итак, Make считает foo.log
промежуточный файл и удаляет его, когда он выполняет свою задачу. Вы можете переопределить это поведение, объявив foo.log
цель SECONDARY:
.SECONDARY: foo.log