Подтвердить что ты не робот

Почему этот make файл удаляет мою цель?

Минимальный пример:

%.txt: foo.log
    # pass

%.log:
    # pass

Run:

$ make a.txt --dry-run
# pass
# pass
rm foo.log

Почему последнее действие - rm foo.log? Как избавиться от него?

4b9b3361

Ответ 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