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.