2014-12-02 38 views
6

Parlando con GNU make, qual è la differenza tra gli obiettivi PHONY all: e default:.Makefile: tutti contro i target predefiniti

CC=g++ 
default: hello 

hello: hello.cpp 
    $(CC) -o hello hello.cpp 

e

CC=g++ 
all: hello 

hello: hello.cpp 
    $(CC) -o hello hello.cpp 

Entrambi di loro lo fanno lo stesso lavoro.

risposta

13

Potete chiamarli shirley se ti piace; nessuna delle etichette che menzioni ha una semantica speciale. Il comportamento predefinito di make consiste nell'eseguire la prima destinazione nello Makefile se non si specifica una destinazione come argomento della riga di comando. Se desideri ignorare questo comportamento, c'è il target speciale .DEFAULT:.

C'è una convenzione per avere un target denominato all che crea tutto, ma questa è solo una convenzione umana, non un caso speciale o un requisito per quanto riguarda Make.

Analogamente, esiste una (debole) convenzione per chiamare il target predefinito default, ma allo stesso modo, questa è solo un'etichetta umana (e in qualche modo si sovrappone ed è eventualmente in conflitto con la convenzione all).

Così il seguente Makefile fa esattamente la stessa cosa:

.PHONY: shirley all default 
default: hello 
all: hello 
shirley: hello 

hello: hello.cpp 
# (Make already knows how to build an executable out of a .cpp file) 

È possibile omettere alcuni o tutti gli obiettivi falsi di cui sopra, e l'unica differenza sarà che gli esseri umani non saranno in grado di dire quando make shirley loro (efficacemente) significano make hello.

Linea di fondo: Costruisci il tuo Makefile in modo che make fa quello che una ragionevole per l'utente finale si aspetta senza leggere troppo README file o ispezione dello Makefile. Spesso questo sarà make all (e probabilmente dovresti avere un target con questo nome, solo per soddisfare le convenzioni umane, anche se non è l'impostazione predefinita), ma questo ovviamente dipende dal tuo progetto e dalle aspettative dei tuoi utenti.

Non chiamarmi Shirley.

+4

Specificare il target speciale '.DEFAULT' è ** non ** il modo per sovrascrivere l'obiettivo predefinito.L'obiettivo predefinito è la prima regola nel makefile che non inizia con '.' - a meno che non venga sovrascritto specificando la variabile speciale '.DEFAULT_GOAL'. Per informare il lettore di un lunghissimo makefile, è meglio specificare .DEFAULT_GOAL o scrivere una regola (in genere una regola fittizia come 'default: all' senza ricetta) molto presto nel makefile. –

+0

@DavidHammen Sono d'accordo con la tua conclusione finale. Tuttavia, considererei l'hacking di ".DEFAULT_GOAL" come una sorta di back door esoterico che dovrebbe forse essere evitato, e [il manuale] (https://www.gnu.org/software/make/manual/html_node/Special-Variables. html) esempio di come si usa sicuramente rafforza questa impressione. – tripleee

1

Uno è scritto "tutto" e l'altro è scritto "predefinito". Non c'è altra differenza tra loro. Forse se hai spiegato perché stai chiedendo, saremmo in grado di aiutare di più.

Nota che nel tuo esempio sopra nessuno degli obiettivi è effettivamente falso. Dovreste dichiarare come tali:

.PHONY: all 

ecc

+0

Ya, non li ho specificati come "PHONY", ma erano quelle 2 parole chiave che indicavano la stessa cosa? non sarebbe strano, perché qualcuno avrebbe bisogno di un altro se già esistesse? – sinister

+0

@qwerty vedere la risposta del triplo: le regole 'all' e' default' non hanno significato speciale, sono regole regolari con nomi regolari. – Dettorer

0

L'unica differenza, è che all è raccomandato nel manuale di GNU Make, per essere il primo obiettivo (di default), e default non ha tale raccomandazione speciale.