So wie make clean
alle Dateien gelöscht werden, die ein Makefile erstellt hat, möchte ich dies auch mit CMake tun. Allzu oft gehe ich manuell durch Verzeichnisse und entferne Dateien wie cmake_install.cmake
und CMakeCache.txt
und die CMakeFiles
Ordner.
Gibt es einen Befehl cmake clean
, um alle diese Dateien automatisch zu entfernen? Idealerweise sollte dies der rekursiven Struktur folgen, die in der CMakeLists.txt
Datei des aktuellen Verzeichnisses definiert ist .
cd <location-of-cmakelists>/build && cmake ..
In den offiziellen FAQ von CMake heißt es:
quelle
In diesen Tagen von Git überall können Sie CMake vergessen und verwenden
git clean -d -f -x
, wodurch alle Dateien entfernt werden, die nicht der Quellcodeverwaltung unterliegen.quelle
-x
Option jedoch. Das ist ein ausgezeichneter Trick desgit
Handels. Obwohl ich persönlich immer noch zuerst einen Trockenlauf machen würde ,git clean -d -f -x -n
. Hin und wieder behalte ich eine Convenience-Datei, die ich für ein Projekt verwende, mit dem Projektordner untergit
Kontrolle, aber ich möchte sie nicht mit anderen teilen, damit ich sie nichtgit add
für das Projekt verwende. Dies würde diese Art von Datei umhauen, wenn ich nicht darauf achten würde, eine-e <pattern>
Option hinzuzufügen . In diesem Sinne wäre es schön, wenn Siegit
eine.gitcleanignore
Datei hätten. :)chattr +i $filename
(benötigt Root-Berechtigungen, erlaubt danach nicht, die Datei zu ändern). Auf diese Weise kann git diese Datei nicht entfernen, selbst wenn es versucht, dies zu tunrm -f
.git add
?Ich habe es etwa eine halbe Stunde lang gegoogelt und das einzig Nützliche, das ich mir ausgedacht habe, war das Aufrufen des
find
Dienstprogramms:make clean
Stellen Sie außerdem sicher, dass Sie vorher (oder den von Ihnen verwendeten CMake-Generator) aufrufen .:) :)
quelle
rm -rf CMakeFiles ; rm -rf */CMakeFiles ; rm -rf */*/CMakeFiles ; rm -rf */*/*/CMakeFiles
und war immer noch nicht fertig ...Sie können etwas verwenden wie:
Normalerweise erstelle ich einen Befehl "make clean-all" und füge dem vorherigen Beispiel einen Aufruf von "make clean" hinzu:
Versuchen Sie nicht, das "saubere" Ziel als Abhängigkeit hinzuzufügen:
Weil "sauber" in CMake kein echtes Ziel ist und dies nicht funktioniert.
Darüber hinaus sollten Sie diese "clean-cmake-files" nicht als Abhängigkeit von irgendetwas verwenden:
Wenn Sie dies tun, werden alle CMake-Dateien gelöscht, bevor clean-all abgeschlossen ist, und make gibt einen Fehler bei der Suche nach "CMakeFiles / clean-all.dir / build.make" aus. Infolgedessen können Sie den Befehl clean-all in keinem Kontext vor "irgendetwas" verwenden:
Das funktioniert auch nicht.
quelle
Einfach ausgeben
rm CMakeCache.txt
funktioniert auch für mich.quelle
cmake /build-path
erneut ausführen .Vielleicht ist es etwas veraltet, aber da dies der erste Treffer bei Google ist
cmake clean
, füge ich Folgendes hinzu:Da können Sie einen Build im Build-Verzeichnis mit einem angegebenen Ziel mit starten
cmake --build . --target xyz
du kannst natürlich rennen
cmake --build . --target clean
um das
clean
Ziel in den generierten Build-Dateien auszuführen .quelle
Ich bin damit einverstanden, dass der Out-of-Source-Build die beste Antwort ist. Aber für die Zeiten , wenn Sie nur müssen ein in-Source - Build tun, ich habe einen Python - Skript zur Verfügung geschrieben hier , die:
quelle
make
wennMakefile
aufgrund einer vorherigen Bereinigung keine vorhanden ist (dh dieses Skript idempotent macht). Fügen Sie einfach die Zeile (mit dem richtigen Abstand) hinzu:if os.path.isfile(os.path.join(directory,'Makefile')):
direkt vor Zeile 24:args = [
und rücken Sie natürlich den Rest des Funktionskörpers nach der gerade hinzugefügten Zeile ein. Dies wird nur ausgeführt,make ... clean
wenn aMakefile
im aktuellen zu bereinigenden Verzeichnis vorhanden ist. Ansonsten ist das Skript perfekt!Eine Lösung, die ich kürzlich gefunden habe, besteht darin, das Out-of-Source-Build-Konzept mit einem Makefile-Wrapper zu kombinieren.
In meiner CMakeLists.txt-Datei der obersten Ebene füge ich Folgendes hinzu, um In-Source-Builds zu verhindern:
Dann erstelle ich ein Makefile der obersten Ebene und füge Folgendes hinzu:
Das Standardziel
all
wird durch Eingabe aufgerufenmake
und ruft das Ziel auf./build/Makefile
.Das erste, was das Ziel
./build/Makefile
tut, ist das Erstellen desbuild
Verzeichnisses mit$(MKDIR)
, das eine Variable für istmkdir -p
. In diesem Verzeichnis führenbuild
wir unseren Out-of-Source-Build durch. Wir liefern das Argument,-p
um sicherzustellen, dassmkdir
wir nicht angeschrien werden, wenn wir versuchen, ein Verzeichnis zu erstellen, das möglicherweise bereits vorhanden ist.Das zweite Ziel
./build/Makefile
desbuild
Verzeichnisses ist das Ändern der Verzeichnisse in das Verzeichnis und das Aufrufencmake
.Zurück zum
all
Ziel rufen wir auf$(MAKE) -C build
, wo$(MAKE)
eine Makefile-Variable automatisch für generiert wirdmake
.make -C
ändert das Verzeichnis, bevor Sie etwas tun. Daher ist die Verwendung$(MAKE) -C build
gleichbedeutend mit der Ausführungcd build; make
.Zusammenfassend lässt sich sagen, dass das Aufrufen dieses Makefile-Wrappers mit
make all
odermake
gleichbedeutend ist mit:Das Ziel
distclean
ruftcmake ..
dann aufmake -C build clean
und entfernt schließlich alle Inhalte aus dembuild
Verzeichnis. Ich glaube, genau das haben Sie in Ihrer Frage gefordert.Der letzte Teil des Makefiles bewertet, ob das vom Benutzer bereitgestellte Ziel ist oder nicht
distclean
. Wenn nicht, werden die Verzeichnissebuild
vor dem Aufrufen in geändert . Dies ist sehr leistungsfähig, da der Benutzer beispielsweisemake clean
eingeben kann und das Makefile dies in ein Äquivalent von umwandeltcd build; make clean
.Zusammenfassend lässt sich sagen, dass dieser Makefile-Wrapper in Kombination mit einer obligatorischen Out-of-Source-Build-CMake-Konfiguration dafür sorgt, dass der Benutzer nie mit dem Befehl interagieren muss
cmake
. Diese Lösung bietet auch eine elegante Methode zum Entfernen aller CMake-Ausgabedateien aus dembuild
Verzeichnis.PS Im Makefile verwenden wir das Präfix
@
, um die Ausgabe eines Shell-Befehls zu unterdrücken, und das Präfix@-
, um Fehler eines Shell-Befehls zu ignorieren. Bei Verwendungrm
als Teil desdistclean
Ziels gibt der Befehl einen Fehler zurück, wenn die Dateien nicht vorhanden sind (sie wurden möglicherweise bereits über die Befehlszeile mit gelöschtrm -rf build
oder wurden überhaupt nicht generiert). Dieser Rückgabefehler zwingt unser Makefile zum Beenden. Wir verwenden das Präfix@-
, um dies zu verhindern. Es ist akzeptabel, wenn eine Datei bereits entfernt wurde. Wir möchten, dass unser Makefile weitergeht und den Rest entfernt.Beachten Sie außerdem Folgendes: Dieses Makefile funktioniert möglicherweise nicht, wenn Sie beispielsweise eine variable Anzahl von CMake-Variablen zum Erstellen Ihres Projekts verwenden
cmake .. -DSOMEBUILDSUSETHIS:STRING="foo" -DSOMEOTHERBUILDSUSETHISTOO:STRING="bar"
. Bei diesem Makefile wird davon ausgegangen, dass Sie CMake auf konsistente Weise aufrufen, entweder durch Eingabecmake ..
oder durch Bereitstellungcmake
einer konsistenten Anzahl von Argumenten (die Sie in Ihr Makefile aufnehmen können).Schließlich Kredit, wo Kredit fällig ist. Dieser Makefile-Wrapper wurde aus dem Makefile angepasst, das von der C ++ - Anwendungsprojektvorlage bereitgestellt wird .
quelle
Out-of-Source-Builds sind natürlich die Methode für Unix-Makefiles. Wenn Sie jedoch einen anderen Generator wie Eclipse CDT verwenden, sollten Sie lieber In-Source-Builds erstellen. In diesem Fall müssen Sie die CMake-Dateien manuell löschen. Versuche dies:
Oder wenn Sie globstar mit aktiviert haben
shopt -s globstar
, versuchen Sie stattdessen diesen weniger ekelhaften Ansatz:quelle
build
. Es dauerte etwas länger als diese Befehle, aber ich musste es nur einmal tun :)Versuchen Sie Folgendes zu verwenden: cmake --clean-first path-of-CMakeLists.txt-file -B Ausgabeverzeichnis
--clean-first: Erst das Ziel sauber erstellen, dann erstellen.
(Verwenden Sie zum Reinigen nur --target clean.)
quelle
In dem Fall, wo Sie passieren
-D
beim Generieren der Build-Dateien Parameter an CMake übergeben und nicht den gesamten Build / das gesamte Verzeichnis löschen möchten:Löschen Sie einfach das Verzeichnis CMakeFiles / in Ihrem Build-Verzeichnis.
Dadurch wird CMake erneut ausgeführt und Build-Systemdateien werden neu generiert. Ihr Build wird auch von vorne beginnen.
quelle
Um die Reinigung bei Verwendung von "out of source" Build zu vereinfachen (dh Sie erstellen im
build
Verzeichnis), verwende ich das folgende Skript:Jedes Mal, wenn Sie bereinigen müssen, sollten Sie dieses Skript aus dem
build
Verzeichnis beziehen:quelle
cd .. ; rm ; mkdir ; cd
Sequenz durch zu ersetzencd .. ; rm -rf build/*
.Wenn Sie benutzerdefinierte Definitionen haben und diese vor dem Bereinigen speichern möchten, führen Sie Folgendes in Ihrem Build-Verzeichnis aus:
Erstellen Sie dann ein neues Build-Verzeichnis (oder entfernen Sie das alte Build-Verzeichnis und erstellen Sie es neu) und führen
cmake
Sie es schließlich mit den Argumenten aus, die Sie mit dem obigen Skript erhalten.quelle
Wenn du läufst
Die CMake-Dateien werden neu generiert. Dies ist erforderlich, wenn Sie einem Quellordner, der beispielsweise von * .cc ausgewählt wird, eine neue Datei hinzufügen.
Dies ist zwar an sich keine "Bereinigung", bereinigt jedoch die CMake-Dateien, indem die Caches neu generiert werden.
quelle
Ich benutze das folgende Shell-Skript für solche Zwecke:
Wenn Sie Windows verwenden, verwenden Sie Cygwin für dieses Skript.
quelle
Es ist lustig zu sehen, dass diese Frage so viele Aufmerksamkeiten und komplizierte Lösungen erhält, was in der Tat den Schmerz zeigt, keine saubere Methode mit cmake zu haben.
Nun, Sie können definitiv
cd build
Ihre Arbeit erledigen und dann eine,rm -rf *
wenn Sie reinigen müssen. Diesrm -rf *
ist jedoch ein gefährlicher Befehl, da viele Menschen oft nicht wissen, in welcher Richtung sie sich befinden.Wenn Sie
cd ..
,rm -rf build
und dannmkdir build
und danncd build
, das ist einfach zu viel Tipparbeit .Eine gute Lösung ist es also, sich aus dem Build-Ordner herauszuhalten und cmake den Pfad mitzuteilen:
zu konfigurieren:
cmake -B build
zu erstellen:
cmake --build build
zu bereinigen:
rm -rf build
Build-Ordner neu zu erstellen: Sie brauchen ihn nicht einmal
mkdir build
, konfigurieren Sie ihn einfach mitcmake -B build
und cmake erstellt ihnquelle
cmake
Meistens kocht einMakefile
, man könnterm
dem sauberen PHONY hinzufügen .Zum Beispiel,
quelle
Ich habe dies in meiner Shell RC-Datei (
.bashrc
,.zshrc
):Sie sollten es nur für Builds außerhalb der Quelle verwenden. Angenommen, Sie haben ein Verzeichnis mit
build/
diesem Namen . Dann musst du nur nocht-cmake-clean
von innen rennen .quelle
Ich habe die Antwort von zsxwing erfolgreich verwendet, um das folgende Problem zu lösen:
Ich habe eine Quelle, die ich auf mehreren Hosts aufbaue (auf einer Raspberry Pi Linux-Karte, auf einer virtuellen VMware Linux-Maschine usw.)
Ich habe ein Bash-Skript, das temporäre Verzeichnisse basierend auf dem Hostnamen des Computers wie folgt erstellt:
quelle
Erstellen Sie ein temporäres Erstellungsverzeichnis, z.
build_cmake
. Daher befinden sich alle Ihre Build-Dateien in diesem Ordner.Fügen Sie dann in Ihrer CMake-Hauptdatei den folgenden Befehl hinzu.
Daher beim Kompilieren tun
Und zu reinigen tun:
quelle