Come fa l'app a far conoscere il target predefinito da costruire se non viene specificato alcun target?


188

La maggior parte delle app per Linux sono compilate con:

make
make install clean

Come ho capito, make prende i nomi degli obiettivi di build come argomenti. Quindi installè una destinazione che copia alcuni file e successivamente cleanuna destinazione che rimuove i file temporanei.

Ma quale obiettivo makecostruire se non viene specificato alcun argomento (ad es. Primo comando nel mio esempio)?

Risposte:


232

Per impostazione predefinita, inizia elaborando il primo obiettivo che non inizia con un .aka obiettivo predefinito ; per farlo, potrebbe essere necessario elaborare altri obiettivi, in particolare quelli da cui dipende il primo obiettivo.

Il manuale di GNU Make copre tutte queste cose ed è una lettura sorprendentemente facile e istruttiva.


61
Chiamare il primo obiettivo allè solo una convenzione.
Tobu,

1
È utile eseguirli separatamente se si sta eseguendo l'installazione per altri utenti, poiché è quindi necessario eseguire make installin in sudo, anziché l'intera build.
Scott Wales,

2
Cordiali saluti, la voce man predefinita per make non fa menzione di ciò che accade quando non si specifica un obiettivo.
Sekm

2
Se il manuale di GNU make copre queste cose, perché è stata posta questa domanda? Il manuale è ottimo nel documentare come scrivere le regole, ma non fa menzione di come scrivere un Makefile.
Nick,

1
Sto guardando un file make che includeè un altro makefile, il cui primo obiettivo è %.o : %.cpp. Quindi l'obiettivo predefinito è ... creare tutti i file .cpp?
Qwertie

178

Per salvare altri pochi secondi e salvarli dalla necessità di leggere il manuale, ecco la risposta breve. Aggiungi questo nella parte superiore del tuo file make:

.DEFAULT_GOAL := mytarget

mytarget sarà ora la destinazione che viene eseguita se viene eseguito "make" e non viene specificata alcuna destinazione.

Se hai una versione precedente di make (<= 3.80), non funzionerà. Se questo è il caso, allora puoi fare ciò che accenna anon, semplicemente aggiungilo all'inizio del tuo file make:

.PHONY: default
default: mytarget ;

Riferimenti: https://www.gnu.org/software/make/manual/html_node/How-Make-Works.html


1
@nathan Rende mytarget la destinazione predefinita se qualcuno esegue "make" senza parametri.
Samuel,

1
Si noti che .DEFAULT_GOAL non sembra essere supportato in GNU make v3.80, e presumo anche le versioni precedenti (v3.81 non lo supporta però). Se stai eseguendo una versione precedente di make dovrai assicurarti che la tua destinazione predefinita sia la prima / prima destinazione nel tuo file make.
Samuel,

4
"... per salvarli dal dover leggere il manuale" è uno dei punti di SO: risposte rapide a domande che altrimenti richiederebbero un po 'di tempo per scavare nella documentazione antica.
WattsInABox,

1
"Aggiungi questo all'inizio del tuo file make": L'aggiunta all'inizio non sembra essere un requisito.
Aman Deep Gautam

2
Questa dovrebbe essere la risposta corretta. Vittorie esplicite su implicite in questo caso.
Sion,

34

GNU Make ti permette anche di specificare il target di make predefinito usando una variabile speciale chiamata .DEFAULT_GOAL. È anche possibile annullare l'impostazione di questa variabile nel mezzo del Makefile, facendo diventare la destinazione successiva nel file la destinazione predefinita.

Rif: Il manuale di Gnu Make - Variabili speciali

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.