Если кратко, то директива .PHONY используется для указания утилите Make "не файловых" целей, которые не являются файловой зависимостью [2]. Давайте попробуем разобраться, что это означает.
По умолчанию цели Makefile "файловые", т. е. они используются для сборки файлов из других файлов (если цель не существует, то запускается команда для её получения, или сборки). Предположим, что ваша цель это файл, и тогда написание Makefiles будет относительно простым делом (следующая команда сгенерирует файл foo):
foo: файл_зависимости
→создать_один_файл_из_другого foo файл_зависимости
Однако иногда может понадобиться, чтобы Makefile запускал команды, которые не относятся к физическим файлам в файловой системе. Хорошим примером такого случая это общие цели "clean" и "all". Скорее всего, что у вас никогда не будет файла clean в корневом каталоге проекта. В таком случае утилита Make не поймет, что делать, потому цель clean будет связана с файлом clean, а Make будет запускать эту цель только тогда, когда этот файл обновился по отношению к его зависимостям.
Эти специальные цели, которые не соответствуют файлам, называются phony, и вы можете явно указать для Make, что они не связаны с файлами, например:
.PHONY: clean
clean:
→rm -rf *.o
Теперь make clean будет работать, как ожидается, даже если существует файл с именем clean.
В терминологии Make понятие phony target это просто такая цель, которая всегда устаревшая (out-of-date), так что всякий раз, когда вы запрашиваете make phony_target, она запустится на сборку в любом случае, независимо от состояния файловой системы. Вот некоторые цели make, которые часто используются как phony: all, install, clean, distclean, TAGS, info, check.
all: "собрать все кучей". Эта цель подразумевается, когда вы запускаете просто make, без указания цели сборки.
install: как видно из имени цели, она обычно используется для установки чего-нибудь. Это может быть просто копирование бинарников исполняемого кода или библиотек в нужное место.
clean: очистка, т. е. удаление всех промежуточных файлов и конечных файлов компиляции.
distclean: делает что-то подобное цели clean.
info: вывод справочной информации, подсказки, и т. п.
check: проверка проекта, контрольной суммы пакета и т. п.
См. также руководство GNU make с описанием phony-целей [3].
[Ссылки]
1. What is the purpose of .PHONY in a Makefile? site:stackoverflow.com. 2. Магия makefile на простых примерах. 3. Phony Targets site:gnu.org. |