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.

  1. Qualsiasi errore rilevato in una sotto-marca viene ignorato da questa regola, quindi continuerà a costruire il resto delle directory anche quando una fallisce.
  2. 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 $@


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow