makefile
.PHONY target
Поиск…
Использование .PHONY для целей без файлов
Используйте .PHONY
чтобы указать цели, которые не являются файлами, например, clean
или mrproper
.
Хороший пример
.PHONY: clean
clean:
rm *.o temp
Плохой пример
clean:
rm *.o temp
В хорошем примере make
знает, что clean
не является файлом, поэтому он не будет искать, если он есть или не обновляется и будет выполнять рецепт.
В плохом примере make
будет искать файл с именем clean
. Если он не существует или не обновляется, он будет выполнять рецепт, но если он существует и обновлен, рецепт не будет выполнен.
Использование .PHONY для рекурсивных вызовов команды make
Рекурсивное использование make означает использование make в качестве команды в make-файле. Этот метод полезен, когда большой проект содержит подкаталоги, каждый из которых имеет свои файлы make-файлов. Следующий пример поможет понять преимущество использования .PHONY с рекурсивным make.
/main
|_ Makefile
|_ /foo
|_ Makefile
|_ ... // other files
|_ /bar
|_ Makefile
|_ ... // other files
|_ /koo
|_ Makefile
|_ ... // other files
Чтобы запустить make-файл подкаталога из make-файла main, make-файл main будет иметь петлю, как показано ниже (есть другие способы, которыми это может быть достигнуто, но это выходит за рамки текущего раздела)
SUBDIRS = foo bar koo
subdirs:
for dir in $(SUBDIRS); do \
$(MAKE) -C $$dir; \
done
Однако с этим методом существуют подводные камни.
- Любая ошибка, обнаруженная в под-маке, игнорируется этим правилом, поэтому она будет продолжать строить остальные каталоги, даже если один из них не выполняется.
- Способность Make выполнять параллельное выполнение нескольких целей сборки не используется, поскольку используется только одно правило.
Объявляя подкаталоги как .PHONY-мишени (вы должны сделать это, так как подкаталог, очевидно, всегда существует, иначе он не будет построен), эти проблемы могут быть преодолены.
SUBDIRS = foo bar koo
.PHONY: subdirs $(SUBDIRS)
subdirs: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@