Es hört sich so an, als ob Sie einen Out-of-Source-Build wünschen . Es gibt verschiedene Möglichkeiten, einen Out-of-Source-Build zu erstellen.
Mach was du getan hast, lauf
cd /path/to/my/build/folder
cmake /path/to/my/source/folder
was bewirkt , dass ein Cmake erzeugen build Baum in /path/to/my/build/folder
dem Quellbaum in /path/to/my/source/folder
.
Sobald Sie es erstellt haben, merkt sich cmake, wo sich der Quellordner befindet, sodass Sie cmake im Build-Baum mit erneut ausführen können
cmake /path/to/my/build/folder
oder auch
cmake .
Wenn Ihr aktuelles Verzeichnis bereits der Build-Ordner ist.
Verwenden Sie für CMake 3.13 oder höher diese Optionen, um die Quelle festzulegen und Ordner zu erstellen
cmake -B/path/to/my/build/folder -S/path/to/my/source/folder
Verwenden Sie für ältere CMake einige undokumentierte Optionen, um die Quelle festzulegen und Ordner zu erstellen :
cmake -B/path/to/my/build/folder -H/path/to/my/source/folder
Dies wird genau das Gleiche tun wie (1), jedoch ohne das Vertrauen in das aktuelle Arbeitsverzeichnis.
CMake setzt alle seine Ausgänge in dem Build - Baum standardmäßig so , wenn Sie großzügig verwenden ${CMAKE_SOURCE_DIR}
oder ${CMAKE_CURRENT_SOURCE_DIR}
in Ihrer cmake Datei, sollte es nicht Ihren berührt Quellbaum .
Das Größte, was schief gehen kann, ist, wenn Sie zuvor einen Build-Baum in Ihrem Quellbaum generiert haben (dh Sie haben einen In-Source- Build). Sobald Sie dies getan haben, wird der zweite Teil von (1) oben aktiviert, und cmake nimmt keine Änderungen an der Quelle oder den Build-Speicherorten vor. Daher können Sie keinen Out-of-Source-Build für ein Quellverzeichnis mit einem In-Source-Build erstellen . Sie können dies ziemlich einfach beheben, indem Sie (mindestens) CMakeCache.txt
aus dem Quellverzeichnis entfernen . Es gibt einige andere Dateien (meistens im CMakeFiles
Verzeichnis), die CMake generiert und die Sie ebenfalls entfernen sollten. Diese führen jedoch nicht dazu, dass cmake den Quellbaum als Build-Baum behandelt.
Da Out-of-Source-Builds häufig wünschenswerter sind als In-Source-Builds, möchten Sie Ihr cmake möglicherweise so ändern, dass Out-of-Source-Builds erforderlich sind:
# Ensures that we do an out of source build
MACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD MSG)
STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
"${CMAKE_BINARY_DIR}" insource)
GET_FILENAME_COMPONENT(PARENTDIR ${CMAKE_SOURCE_DIR} PATH)
STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
"${PARENTDIR}" insourcesubdir)
IF(insource OR insourcesubdir)
MESSAGE(FATAL_ERROR "${MSG}")
ENDIF(insource OR insourcesubdir)
ENDMACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD)
MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
"${CMAKE_PROJECT_NAME} requires an out of source build."
)
Das obige Makro stammt von einem häufig verwendeten Modul namens MacroOutOfSourceBuild
. Es gibt zahlreiche Quellen für MacroOutOfSourceBuild.cmake
Google, aber ich kann das Original anscheinend nicht finden und es ist kurz genug, um es hier vollständig aufzunehmen.
Leider hat cmake in der Regel ein paar Dateien , die von der Zeit geschrieben das Makro aufgerufen wird, so dass , obwohl es Sie tatsächlich die Durchführung der Build stoppen werden Sie noch brauchen, zu löschen CMakeCache.txt
und CMakeFiles
.
Es kann hilfreich sein, die Pfade festzulegen, in die Binärdateien, gemeinsam genutzte und statische Bibliotheken geschrieben werden. In diesem Fall wird angezeigt, wie die cmake-Ausgabe in ein 'bin'-Verzeichnis umgewandelt wird. (Haftungsausschluss, ich habe die beste Antwort auf diese Frage ... aber so weiß ich davon).
CMAKE_BINARY_DIR
oderCMAKE_CACHEFILE_DIR
. Was passiert, wenn Sie alle dieseset()
Anrufe entfernen und dies einfach tuncd Compile; rm -rf *; cmake ../src
?