Ich bin ein Anfänger mit make
und ich frage mich, wann ich verwenden soll make clean
.
Ein Kollege sagte mir, dass inkrementelle Builds mit make
auf den Zeitstempeln der Dateien basieren. Wenn Sie also eine alte Version einer Datei in Ihrem VCS auschecken, hat sie einen "alten" Zeitstempel und wird als "keine Notwendigkeit zum erneuten Kompilieren dieser Datei" markiert. Dann würde diese Datei nicht in den nächsten Build aufgenommen.
Laut demselben Kollegen wäre dies ein Grund zur Verwendung make clean
.
Wie auch immer, ich habe die Antwort auf die Frage "Wann verwenden make clean
?" Grob von anderen StackExchange-Fragen erhalten, aber meine andere Frage lautet dann:
Warum
make
stützen sich inkrementelle Builds mithilfe von Dateizeitstempeln und nicht beispielsweise auf SHA-1? Git zeigt zum Beispiel, dass wir erfolgreich feststellen können, ob eine Datei mit dem SHA-1 geändert wurde.
Ist es für Geschwindigkeitsprobleme?
make
wurde in den 70er Jahren erstellt. SHA-1 wurde in den 90er Jahren erstellt. Git wurde in 00er erstellt. Das Letzte, was Sie wollen, ist, dass einige obskure Builds, die 30 Jahre lang funktionierten, plötzlich versagten, weil sich jemand entschied, mit einem bewährten System ganz modern zu werden.make
wird Ihre Software nicht kaputt gehen,make
bemüht sich jedoch eher um Abwärtskompatibilität in neuen Versionen. Das Ändern des Kernverhaltens ohne guten Grund ist so ziemlich das Gegenteil davon. Und die Daten zeigen, warum es ursprünglich nicht für die Verwendung von SHA-1 hergestellt wurde oder warum es nicht einfach war, es nachzurüsten, als es verfügbar wurde (war zu diesemmake
Zeitpunkt bereits Jahrzehnte alt).Antworten:
Ein offensichtliches (und wohl oberflächliches) Problem wäre, dass das Build-System die Hashes der Dateien aufzeichnen müsste, die für den letzten Build verwendet wurden. Während dieses Problem sicherlich gelöst werden könnte, würde es einen Seitenspeicher erfordern, wenn die Zeitstempelinformationen bereits im Dateisystem vorhanden sind.
Im Ernst, der Hash würde jedoch nicht die gleiche Semantik vermitteln. Wenn Sie wissen, dass die Datei T aus der Abhängigkeit D mit dem Hash H 1 erstellt wurde, und dann herausfinden, dass D jetzt mit H 2 hasht , sollten Sie T neu erstellen ? Wahrscheinlich ja, aber es könnte auch sein, dass H 2 tatsächlich auf eine ältere Version der Datei verweist . Zeitstempel definieren eine Reihenfolge, während Hashes nur für die Gleichheit vergleichbar sind.
Eine Funktion, die Zeitstempel unterstützen, besteht darin, dass Sie den Zeitstempel einfach aktualisieren können (z. B. mithilfe des POSIX-Befehlszeilenprogramms
touch
), um zu glaubenmake
, dass sich eine Abhängigkeit geändert hat oder - was interessanter ist - ein Ziel neuer ist als es tatsächlich ist. Während das Spielen damit eine großartige Gelegenheit ist, sich in den Fuß zu schießen, ist es von Zeit zu Zeit nützlich. In einem Hash-basierten System benötigen Sie Unterstützung vom Build-System selbst, um die interne Datenbank der für den letzten Build verwendeten Hashes zu aktualisieren, ohne tatsächlich etwas zu erstellen.Während sicherlich ein Argument für die Verwendung von Hashes über Zeitstempel vorgebracht werden könnte, ist mein Punkt, dass sie keine bessere Lösung sind, um dasselbe Ziel zu erreichen, sondern eine andere Lösung, um ein anderes Ziel zu erreichen. Welches dieser Ziele wünschenswerter ist, könnte zur Debatte stehen.
quelle
D
jetzt Hashes ausgeführtH2
werden und keine Ausgabe erstelltT2
wurdeD@H2
, müssen Sie diese erstellen und speichern. Danach können Sie unabhängig davon, in welcher ReihenfolgeD
zwischen den ZuständenH1
und umgeschaltetH2
wird, die zwischengespeicherte Ausgabe verwenden.Das Hashing eines gesamten Projekts ist sehr langsam. Sie müssen jedes einzelne Byte jeder einzelnen Datei lesen. Git hasht nicht jede Datei jedes Mal, wenn Sie eine ausführen
git status
. Bei VCS-Kassen wird die Änderungszeit einer Datei normalerweise nicht auf die ursprünglich erstellte Zeit festgelegt. Eine Sicherungswiederherstellung würde erfolgen, wenn Sie dies tun. Der ganze Grund, warum Dateisysteme Zeitstempel haben, liegt in solchen Anwendungsfällen.Ein Entwickler wird normalerweise ausgeführt,
make clean
wenn sich eine Abhängigkeit, die nicht direkt vom Makefile verfolgt wird, ändert. Ironischerweise schließt dies normalerweise das Makefile selbst ein. Es enthält normalerweise auch Compilerversionen. Abhängig davon, wie gut Ihr Makefile geschrieben ist, kann es externe Bibliotheksversionen enthalten.Dies sind die Dinge, die normalerweise aktualisiert werden, wenn Sie ein Versionskontroll-Update durchführen. Daher haben die meisten Entwickler die Gewohnheit, gleichzeitig ein Update durchzuführen
make clean
, sodass Sie wissen, dass Sie von einem sauberen Plan ausgehen. Sie können davonkommen, ohne es oft zu tun, aber es ist wirklich schwierig, die Zeiten vorherzusagen, die Sie nicht können.quelle
Einige Punkte zu Hashes und Zeitstempeln in Build-Systemen:
quelle