Почему этот makefile удаляет мою цель? - PullRequest
20 голосов
/ 25 марта 2011

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

%.txt: foo.log
    # pass

%.log:
    # pass

Выполнение:

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

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

Ответы [ 2 ]

24 голосов
/ 25 марта 2011

По умолчанию GNU make удаляет промежуточные файлы. Поскольку% .txt зависит от% .log, make хочет удалить файл .log. Чтобы предотвратить такое поведение, вы помечаете их как драгоценные с помощью .PRECIOUS или .SECONDARY.

.PRECIOUS: foo.log

Также вы можете сделать так, чтобы никакие промежуточные файлы никогда не удалялись, используя .SECONDARY без зависимостей.

.SECONDARY:

См. этот раздел руководства по сборке GNU.

6 голосов
/ 25 марта 2011

Вы делаете a.txt с помощью цепочки неявных правил (в данном случае неявных правил, которые вы определили сами). Поэтому Make считает foo.log промежуточный файл и удаляет его, когда он выполняет свою задачу. Вы можете переопределить это поведение, объявив foo.log ВТОРИЧНОЙ целью:

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