628 Stimmen

Suche nach einem 'cmake clean'-Befehl zum Aufräumen der CMake-Ausgabe

Genauso wie make clean alle Dateien löscht, die ein Makefile erzeugt hat, würde ich gerne dasselbe mit CMake tun. Allzu oft ertappe ich mich dabei, wie ich manuell durch Verzeichnisse gehe und Dateien wie cmake_install.cmake y CMakeCache.txt und die CMakeFiles Mappen.

Gibt es einen Befehl wie cmake clean um all diese Dateien automatisch zu entfernen? Idealerweise sollte dies der rekursiven Struktur folgen, die im aktuellen Verzeichnis in der CMakeLists.txt Datei.

703voto

zsxwing Punkte 19405

CMake 3.X

CMake 3.X bietet ein "sauberes" Ziel.

cmake --build C:/foo/build/ --target clean

Aus den CMake-Dokumenten für 3.0.2:

--clean-first  = Build target 'clean' first, then build.
                 (To clean only, use --target 'clean'.)

CMake 2.X

Es gibt keine cmake clean in CMake Version 2.X

Normalerweise baue ich das Projekt in einem einzigen Ordner wie "build". Wenn ich also make clean kann ich einfach rm -rf build .

Der "build"-Ordner im gleichen Verzeichnis wie die Wurzel "CMakeLists.txt" ist normalerweise eine gute Wahl. Um Ihr Projekt zu bauen, geben Sie cmake einfach den Ort der CMakeLists.txt als Argument an. Zum Beispiel: cd <location-of-cmakelists>/build && cmake .. . (Von @ComicSansMS)

118voto

Jean Davy Punkte 1766

In diesen Tagen von Git überall, können Sie CMake vergessen und verwenden git clean -d -f -x die alle Dateien entfernt, die nicht unter Quellcodekontrolle stehen.

94voto

Peter Punkte 8987

CMake offizielle FAQ Staaten:

Einige mit GNU autotools erstellte Build-Bäume haben ein "make distclean"-Ziel Ziel, das den Build bereinigt und auch Makefiles und andere Teile des generierten Build-Systems entfernt. CMake erzeugt kein "make distclean"-Ziel, weil CMakeLists.txt-Dateien Skripte ausführen können und und beliebige Befehle ausführen können; CMake hat keine Möglichkeit, genau zu als Teil der Ausführung von CMake erzeugt werden. Die Bereitstellung eines distclean-Ziels würde bei den Benutzern den falschen Eindruck erwecken, es würde wie erwartet funktionieren. (CMake erzeugt ein "make clean"-Target, um Dateien zu entfernen, die die vom Compiler und Linker erzeugt wurden.)

Ein "make distclean"-Ziel ist nur notwendig, wenn der Benutzer einen In-Source-Build durchführt. CMake unterstützt In-Source-Builds, aber wir ermutigen die Benutzer dringend, das Konzept eines Out-of-Source-Builds zu übernehmen. Die Verwendung eines Build-Trees, der getrennt ist vom vom Quellcode-Baum getrennt ist, verhindert, dass CMake irgendwelche Dateien im Quellcode-Baum. Da CMake den Source-Tree nicht verändert, besteht kein distclean-Ziel benötigt. Man kann einen neuen Build starten, indem man den Build-Tree löschen oder einen separaten Build-Tree erstellen.

60voto

Ich habe eine halbe Stunde lang gegoogelt, und das einzig Nützliche, was ich gefunden habe, war der Aufruf der find Nutzen:

# Find and then delete all files under current directory (.) that:
#  1. contains "cmake" (case-&insensitive) in its path (wholename)
#  2. name is not CMakeLists.txt
find . -iwholename '*cmake*' -not -name CMakeLists.txt -delete
Stellen Sie außerdem sicher, dass Sie die make clean (oder welcher CMake-Generator auch immer verwendet wird) avant das.

)

41voto

Peregring-lk Punkte 9669

Sie können etwas verwenden wie:

add_custom_target(clean-cmake-files
   COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
)

// clean-all.cmake
set(cmake_generated ${CMAKE_BINARY_DIR}/CMakeCache.txt
                    ${CMAKE_BINARY_DIR}/cmake_install.cmake
                    ${CMAKE_BINARY_DIR}/Makefile
                    ${CMAKE_BINARY_DIR}/CMakeFiles
)

foreach(file ${cmake_generated})

  if (EXISTS ${file})
     file(REMOVE_RECURSE ${file})
  endif()

endforeach(file)

Normalerweise erstelle ich einen "make clean-all"-Befehl und füge einen Aufruf von "make clean" zu dem vorherigen Beispiel hinzu:

add_custom_target(clean-all
   COMMAND ${CMAKE_BUILD_TOOL} clean
   COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
)

Versuchen Sie nicht, das "saubere" Ziel als Abhängigkeit hinzuzufügen:

add_custom_target(clean-all
   COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
   DEPENDS clean
)

Denn "clean" ist kein echtes Ziel in CMake und das funktioniert nicht.

Außerdem sollten Sie diese "clean-cmake-files" nicht als Abhängigkeit von irgendetwas verwenden:

add_custom_target(clean-all
   COMMAND ${CMAKE_BUILD_TOOL} clean
   DEPENDS clean-cmake-files
)

Denn wenn Sie das tun, werden alle CMake-Dateien gelöscht, bevor clean-all fertig ist, und make gibt einen Fehler aus, indem es "CMakeFiles/clean-all.dir/build.make" sucht. Infolgedessen können Sie den Befehl clean-all nicht vor "anything" in irgendeinem Kontext verwenden:

add_custom_target(clean-all
   COMMAND ${CMAKE_BUILD_TOOL} clean
   COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
)

Auch das funktioniert nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X