Ich weiß, dass ich einen make
Prozess jederzeit unterbrechen kann, ohne den gesamten Quellbaum erneut kompilieren zu müssen. Wie ich weiß, make
kompiliert ein Ziel nur, wenn es noch nicht kompiliert wurde oder der Quellcode nach der letzten Kompilierung geändert wurde.
Aber wenn ich unterbreche make
, wird es sicherlich eine oder mehrere (je nach Parallelitätsstufe) halbfertige Binärdateien geben. Was macht es mit ihnen, wenn ich das nächste Mal renne make
? Oder beendet es das aktuelle Ziel, wenn ich Ctrl+ drücke C, um teilweise kompilierte Binärdateien zu vermeiden?
11
Antworten:
In einfachen Worten, Sie können sich
make
eine (möglicherweise große) Anzahl von Schritten vorstellen, wobei jeder Schritt eine Anzahl von Dateien als Eingabe verwendet und eine Datei als Ausgabe erstellt.Ein Schritt könnte "Kompilieren
file.c
nachfile.o
" oder "Verwendenld
zum Verknüpfenmain.o
undfile.o
Inprogram
" sein. Wenn Sie unterbrechenmake
mit CtrlC, dann wird die aktuell ausgeführten Schritt beendet , die (oder sollte) , um die Ausgabedatei entfernen sie arbeitete. Es bleiben normalerweise keine "halbfertigen Binärdateien" zurück.Beim Neustart
make
werden die Zeitstempel aller Eingabe- und Ausgabedateien angezeigt und die folgenden Schritte erneut ausgeführt:Dies bedeutet im Allgemeinen, dass das Stoppen und Neustarten dieses Schritts von vorne beginnt,
ld
wennmake
die Ausführung eines Schritts lange dauert (dies ist auf modernen Computern selten, aber der Schritt für große Programme kann beim Entwurf leicht viele Minuten dauern )make
.Die Realität Ihres Durchschnitts
Makefile
ist erheblich komplizierter als die obige Beschreibung, aber die Grundlagen sind dieselben.quelle
Ctrl+ Cbewirkt
SIGINT
, dass a an den laufenden Prozess gesendet wird. Dieses Signal kann vom Prozess abgefangen werden. Im Quellcode von make finden Sie eine Falle für dieses Signal incommands.c
:remove_intermediates()
ist die Bereinigungsfunktion vonmake
, siehe Definition hier:Und später in der Funktion, die Sie sehen, werden sie effektiv gelöscht:
Fazit: Im Allgemeinen keine Angst davor haben, eine Kompilierung mit zu unterbrechen
make
. Wenn es sich nicht um ein nicht abfangbares Signal (SIGKILL, SIGSEGV, SIGSTOP
) handelt, werden Zwischendateien bereinigt.quelle
SIGSEGV
ist auf vielen Unices fangbar.Wenn etwas stoppt
make
(sei es Strg-C, Herunterfahren oder sogar ein fehlgeschlagener Befehl), bleibt die bereits geleistete Arbeit bestehen. Wenn angepasst,make
funktioniert dies wie immer: Es wird herausgefunden, was noch zu tun ist (weil eine Datei geändert wurde odermake
nie verarbeitet werden muss, spielt keine Rolle) und fährt mit dem Job fort.Die obige Beschreibung setzt eindeutig voraus, dass die relevanten
Makefile
s die Abhängigkeiten und Befehle beschreiben, die korrekt ausgeführt werden sollen. Alles, was (neu) gemacht werden muss, ist.quelle