makefile
Cel PHONY
Szukaj…
Używanie .PHONY dla celów niebędących plikami
Użyj .PHONY
aby określić cele, które nie są plikami, np. clean
lub mrproper
.
Dobry przykład
.PHONY: clean
clean:
rm *.o temp
Zły przykład
clean:
rm *.o temp
W dobrym przykładzie make
wie, że clean
nie jest plikiem, dlatego nie będzie wyszukiwał, czy jest aktualny, i wykona przepis.
W złym przykładzie make
będzie szukał pliku o nazwie clean
. Jeśli nie istnieje lub jest nieaktualny, wykona przepis, ale jeśli istnieje i jest aktualny, przepis nie zostanie wykonany.
Używanie .PHONY do rekurencyjnych wywołań polecenia „make”
Rekurencyjne użycie make oznacza użycie make jako polecenia w pliku makefile. Ta technika jest przydatna, gdy duży projekt zawiera podkatalogi, z których każdy ma swoje odpowiednie pliki makefile. Poniższy przykład pomoże zrozumieć zaletę używania .PHONY z marką rekurencyjną.
/main
|_ Makefile
|_ /foo
|_ Makefile
|_ ... // other files
|_ /bar
|_ Makefile
|_ ... // other files
|_ /koo
|_ Makefile
|_ ... // other files
Aby uruchomić plik makefile podkatalogu z pliku makefile main, plik makefile main miałby pętlę, jak pokazano poniżej (istnieją inne sposoby, w jakie można to osiągnąć, ale to nie wchodzi w zakres bieżącego tematu)
SUBDIRS = foo bar koo
subdirs:
for dir in $(SUBDIRS); do \
$(MAKE) -C $$dir; \
done
Jednak przy tej metodzie występują pułapki.
- Każdy błąd wykryty w podwykonawcy jest ignorowany przez tę regułę, więc będzie kontynuował budowanie reszty katalogów, nawet jeśli jeden zawiedzie.
- Marka nie może wykonywać równoległego wykonywania wielu celów kompilacji, ponieważ używana jest tylko jedna reguła.
Deklarując podkatalogi jako obiekty docelowe .PHONY (musisz to zrobić, ponieważ podkatalog oczywiście zawsze istnieje; w przeciwnym razie nie zostanie zbudowany) problemy te można rozwiązać.
SUBDIRS = foo bar koo
.PHONY: subdirs $(SUBDIRS)
subdirs: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@