makefile
Obiettivo .PHONY
Ricerca…
Usando .PHONY per obiettivi non file
Utilizzare .PHONY
per specificare gli obiettivi che non sono file, ad esempio, clean
o mrproper
.
Buon esempio
.PHONY: clean
clean:
rm *.o temp
Cattivo esempio
clean:
rm *.o temp
Nel buon esempio make
sa che clean
non è un file, quindi non cercherà se è o non è aggiornato ed eseguirà la ricetta.
Nel cattivo esempio, make
cercherà un file chiamato clean
. Se non esiste o non è aggiornato, eseguirà la ricetta, ma se esiste ed è aggiornata la ricetta non verrà eseguita.
Usando .PHONY per invocazioni ricorsive del comando 'make'
L'uso ricorsivo di make significa usare make come comando all'interno di un makefile. Questa tecnica è utile quando un progetto di grandi dimensioni contiene sottodirectory, ognuna con i rispettivi makefile. Il seguente esempio aiuterà a comprendere il vantaggio dell'uso di .PHONY con la marca ricorsiva.
/main
|_ Makefile
|_ /foo
|_ Makefile
|_ ... // other files
|_ /bar
|_ Makefile
|_ ... // other files
|_ /koo
|_ Makefile
|_ ... // other files
Per eseguire il makefile della sottodirectory dall'interno del makefile di main, il makefile del main dovrebbe avere il loop come mostrato di seguito (ci sono altri modi in cui questo può essere ottenuto, ma non rientra nell'ambito dell'argomento corrente)
SUBDIRS = foo bar koo
subdirs:
for dir in $(SUBDIRS); do \
$(MAKE) -C $$dir; \
done
Tuttavia, ci sono delle insidie con questo metodo.
- Qualsiasi errore rilevato in una sotto-marca viene ignorato da questa regola, quindi continuerà a costruire il resto delle directory anche quando una fallisce.
- La capacità di Make di eseguire l'esecuzione parallela di più build target non viene utilizzata poiché viene utilizzata una sola regola.
Dichiarando le sottodirectory come target .PHONY (devi farlo perché ovviamente la sottodirectory esiste sempre, altrimenti non sarà costruita) questi problemi possono essere superati.
SUBDIRS = foo bar koo
.PHONY: subdirs $(SUBDIRS)
subdirs: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@