Woher weiß die App, dass das Standardziel erstellt werden soll, wenn kein Ziel angegeben ist?

185

Die meisten Linux-Apps sind kompiliert mit:

make
make install clean

Nach meinem Verständnis nimmt make Namen von Build-Zielen als Argumente. Dies installgilt auch für ein Ziel, das einige Dateien kopiert, und danach cleanfür ein Ziel, das temporäre Dateien entfernt.

Aber welches Ziel wird erstellt make, wenn keine Argumente angegeben werden (z. B. erster Befehl in meinem Beispiel)?

grigoryvp
quelle

Antworten:

230

Standardmäßig beginnt es durch das erste Ziel der Verarbeitung , die mit einem nicht beginnt , .auch bekannt als das Standard - Ziel ; Dazu müssen möglicherweise andere Ziele verarbeitet werden - insbesondere diejenigen, von denen das erste Ziel abhängt.

Das GNU Make Manual behandelt all diese Dinge und ist überraschend einfach und informativ zu lesen.

Marcel Gosselin
quelle
61
Das erste Ziel aufzurufen allist nur eine Konvention.
Tobu
1
Es ist nützlich, sie separat auszuführen, wenn Sie sie für andere Benutzer installieren, da Sie dann nur das make installin sudo und nicht den gesamten Build ausführen müssen .
Scott Wales
2
Zu Ihrer Information, der Standard-Man-Eintrag für make erwähnt nicht, was passiert, wenn Sie kein Ziel angeben.
Ihrer Information,
2
Wenn das GNU-Handbuch dieses Thema behandelt, warum wurde diese Frage gestellt? Das Handbuch kann hervorragend dokumentieren, wie Regeln geschrieben werden, erwähnt jedoch nicht, wie ein Makefile geschrieben wird.
Nick
1
Ich schaue mir eine Make-Datei an, die ein includeweiteres Makefile ist, dessen erstes Ziel es ist %.o : %.cpp. Das Standardziel ist also ... alle CPP-Dateien zu erstellen?
Qwertie
174

Hier ist die kurze Antwort, um anderen ein paar Sekunden zu ersparen und ihnen das Lesen des Handbuchs zu ersparen. Fügen Sie dies oben in Ihre make-Datei ein:

.DEFAULT_GOAL := mytarget

mytarget ist jetzt das Ziel, das ausgeführt wird, wenn "make" ausgeführt wird und kein Ziel angegeben ist.

Wenn Sie eine ältere Version von make (<= 3.80) haben, funktioniert dies nicht. Wenn dies der Fall ist, können Sie das tun, was anon erwähnt. Fügen Sie dies einfach oben in Ihre make-Datei ein:

.PHONY: default
default: mytarget ;

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

Samuel
quelle
1
@nathan Es macht mytarget zum Standardziel, wenn jemand "make" ohne Parameter ausführt.
Samuel
1
Beachten Sie, dass .DEFAULT_GOAL in GNU make v3.80 anscheinend nicht unterstützt wird, und ich würde auch frühere Versionen annehmen (v3.81 unterstützt dies jedoch). Wenn Sie eine ältere Version von make ausführen, müssen Sie sicherstellen, dass Ihr Standardziel das erste / oberste Ziel in Ihrer make-Datei ist.
Samuel
4
"... um sie vor dem Lesen des Handbuchs zu bewahren" ist einer der Punkte von SO: schnelle Antworten auf Fragen, deren Suche in der alten Dokumentation sonst eine Weile dauern würde.
WattsInABox
1
"Fügen Sie dies oben in Ihre Make-Datei ein": Das Hinzufügen oben scheint keine Voraussetzung zu sein.
Aman Deep Gautam
2
Dies sollte die richtige Antwort sein. Explizite über implizite Gewinne in diesem Fall.
Sion
34

Mit GNU Make können Sie auch das Standard-Make-Ziel mithilfe einer speziellen Variablen namens angeben .DEFAULT_GOAL . Sie können diese Variable sogar in der Mitte des Makefiles deaktivieren, wodurch das nächste Ziel in der Datei zum Standardziel wird.

Ref: Das Gnu Make Handbuch - Spezielle Variablen

Sandip Bhattacharya
quelle