Gibt es eine allgemeine Regel, wann Sie "sauber machen" anstelle von "machen" verwenden sollten?

11

Ich schreibe gerade ein Programm mit mehreren Dateien, und anscheinend führt das Ausführen von "make" (wie man intuitiv denken würde, dass es in den meisten Situationen durchgeführt werden muss) aus irgendeinem Grund dazu, dass mein Programm fehlschlägt. Ich denke, ich kann das Problem detaillierter beschreiben, aber das Wichtigste ist, dass es ausgeführt wird, wenn 'make clean' verwendet wird. Ich habe mich also gefragt, ob jemand die allgemeine Faustregel für das Ausführen von "make clean" anstelle von "make" kennt.

Dunkler Templer
quelle

Antworten:

17

Sie führen make clean in zwei Situationen aus - wenn Sie den Quellcode packen möchten (und daher die erstellten Objekte nicht benötigen / wollen) ODER wenn Sie Grund zu der Annahme haben, dass die erstellten Objekte schlecht sind.

In Ihrem Fall verwenden Sie 'make clean', um ein Problem zu beheben, das wahrscheinlich auf ein fehlerhaftes Makefile zurückzuführen ist. Etwas darin wird nicht neu kompiliert, wenn es sollte, und das führt dazu, dass die Ausgabe-Binärdatei schlecht ist.

Abhängig von der Komplexität Ihres Projekts und der Art und Weise, wie Sie make verwendet haben, können viele Gründe auftreten. Das Wesentliche dabei ist jedoch, dass Sie einige Zeit mit dem Debuggen Ihres Makefiles verbringen müssen.

Michael Kohne
quelle
6
Sie vergessen "einige Änderungen in der Build-Umgebung" wie einen aktualisierten Compiler, neue Versionen von Bibliotheken usw. In diesen Fällen ist es immer eine gute Idee, "sauber zu machen", nur um sicherzustellen, dass alle Module vom selben Song Sheet singen!
James Anderson
2
@ JamesAnderson Man könnte argumentieren, dass dies einfach Instanzen von fehlerhaften Makefiles sind.
Kristof Provost
4
@KristofProvost: Ich bin nicht sicher, ob ich "New ABI" (möglicherweise durch Einführung einer neuen Compiler-Version) als "fehlerhaftes Makefile" klassifizieren würde. Es liegt ausreichend außerhalb des Bereichs, den ich von 'make' erwarten würde.
Vatine
1
Stimmt, aber es ist möglich (und nicht einmal so schwierig), den Compiler als Voraussetzung zu den Makefiles hinzuzufügen. Das reicht aus, um das Problem zu lösen. Alles in allem ist es kein großes Problem und es ist sowieso sehr selten. Ich habe darauf hingewiesen, weil ich Makefiles verwendet (und geschrieben) habe, die Compiler-Flags und dergleichen berücksichtigen. Das ist auch in Makefiles ziemlich ungewöhnlich, aber sehr nützlich (mehr als das Überprüfen des Compilers;)). Meine Erwartungen an gute, gut geschriebene Makefiles sind ziemlich hoch. Meine Erwartungen an das durchschnittliche Makefile sind eher niedriger ...
Kristof Provost
8

Ich stimme der Antwort von Michael Kohne im Allgemeinen zu. Ich würde hinzufügen, dass Sie die Installationsdokumente lesen müssen, um zu wissen, was "sauber machen" tatsächlich tut. Es kann verschiedene Clean-Ebenen geben, die Sie möglicherweise verwenden müssen, z. B. "make realclean" und "make distclean". Es gibt informelle Konventionen für diese, aber nichts in Stein gemeißelt.

Bill Ruppert
quelle
2
+1: "Sie müssen die Installationsdokumente lesen, um zu wissen, was" sauber machen "tatsächlich tut". Es gibt keine "allgemeine Regel". Sie müssen die Dokumente tatsächlich lesen.
S.Lott
5

Ich verstehe, dass dies Ihr Projekt ist, also ist es Ihr makefile. Mein Ziel ist es, make immer einen korrekten Build zu produzieren, wenn es möglich ist, einen zu produzieren. Wenn make cleanes notwendig ist, sich von einem Zustand zu erholen, dann ist das meiner Meinung makefilenach falsch und sollte korrigiert werden. Wenn Ihre Abhängigkeiten korrekt berechnet wurden, sollte ein Simple makealles neu kompilieren, was neu kompiliert werden muss.

Kevin Cline
quelle
2
Genau. In diesen Tagen mit nahezu unbegrenztem Speicherplatz ist dies kein Problem mehr, aber ich bin alt genug, um mich daran zu erinnern, wann make clean und make realclean hauptsächlich verwendet wurden, um Speicherplatz zu sparen, nachdem die verknüpfte ausführbare Datei erstellt wurde. Bei der Herstellung von GCC, Apache, Perl usw. lag eine Menge Zeug herum.
Bill Ruppert
1

Ich würde vor einem nächtlichen Build "make clean" ausführen. In diesem Fall spielt die zusätzliche Zeit, die für einen vollständigen Build benötigt wird, wahrscheinlich keine große Rolle, aber die zusätzliche Sicherheit, die Sie erhalten, wenn Sie sicherstellen, dass alles in der richtigen Version ist, ist es wahrscheinlich wert.

Zachary K.
quelle
Das hängt von der Größe Ihres Projekts ab. Wo ich früher arbeite, würde ein inkrementeller Build 2-4 Stunden dauern, wenn die Änderungen von anderen Sites über Nacht vorgenommen werden. Ein sauberer Build kann 7 bis 9 Stunden dauern. Darüber hinaus hatten wir manchmal zwei oder drei Zweige, die wir bauen wollten. Selbst auf schnellen Maschinen müssen sehr große Codebasen ganz anders behandelt werden als kleinere.
TafT