Ich habe eine Reihe von Projekten mit CMake erstellt und möchte in der Lage sein, einfach zwischen GCC oder Clang / LLVM zu wechseln, um sie zu kompilieren. Ich glaube (bitte korrigieren Sie mich, wenn ich mich irre!), Dass ich für die Verwendung von Clang Folgendes einstellen muss:
SET (CMAKE_C_COMPILER "/usr/bin/clang")
SET (CMAKE_C_FLAGS "-Wall -std=c99")
SET (CMAKE_C_FLAGS_DEBUG "-g")
SET (CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG")
SET (CMAKE_C_FLAGS_RELEASE "-O4 -DNDEBUG")
SET (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")
SET (CMAKE_CXX_COMPILER "/usr/bin/clang++")
SET (CMAKE_CXX_FLAGS "-Wall")
SET (CMAKE_CXX_FLAGS_DEBUG "-g")
SET (CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELEASE "-O4 -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
SET (CMAKE_AR "/usr/bin/llvm-ar")
SET (CMAKE_LINKER "/usr/bin/llvm-ld")
SET (CMAKE_NM "/usr/bin/llvm-nm")
SET (CMAKE_OBJDUMP "/usr/bin/llvm-objdump")
SET (CMAKE_RANLIB "/usr/bin/llvm-ranlib")
Gibt es eine einfache Möglichkeit, zwischen diesen und den Standard-GCC-Variablen zu wechseln, vorzugsweise als systemweite Änderung und nicht als projektspezifisch (dh nicht nur zum Hinzufügen in die CMakeLists.txt eines Projekts)?
Ist es auch erforderlich, die llvm-*
Programme anstelle der Systemstandards zu verwenden, wenn mit clang anstelle von gcc kompiliert wird? Was ist der Unterschied?
CMAKE_USER_MAKE_RULES_OVERRIDE
Arbeiten befolgt . Es scheint, dass die Datei ignoriert wird (dh obwohlCMAKE_C_FLAGS_RELEASE
sie-O4
in der Überschreibungsdatei festgelegt ist, wird der Standardwert-O3 -DNDEBUG
in cmake angezeigt).src/build-clang
Verzeichnis tun, werden die Überschreibungen ignoriert.CC
undCXX
Variablen, kann es sein , weil Sie zuerst alle Dateien aus dem Build - Verzeichnis löschen müssen.rm CMakeCache.txt
ist möglicherweise nicht ausreichend.Systemweite C ++ - Änderung unter Ubuntu:
Wird so etwas drucken:
Dann wählen Sie einfach clang ++.
quelle
There is only one alternative in link group cc (providing /usr/bin/cc): /usr/bin/gcc
Sie können den Optionsbefehl verwenden:
und verpacken Sie dann die Clang-Compiler-Einstellungen in if () s:
Auf diese Weise wird es in den GUI-Konfigurationstools als cmake-Option angezeigt.
Um es systemweit zu machen, können Sie natürlich eine Umgebungsvariable als Standardwert verwenden oder bei Ferruccios Antwort bleiben.
quelle
cmake -DCMAKE_COMPILER_DEFINITIONS=MyLlvmDefinitions.cmake
.Systemweite C-Änderung unter Ubuntu:
sudo update-alternatives --config cc
Systemweite C ++ - Änderung unter Ubuntu:
sudo update-alternatives --config c++
Drücken Sie für jede der oben genannten Optionen die Auswahlnummer (1) und die Eingabetaste, um Clang auszuwählen:
quelle
/opt/clang-llvm-3.5/
installieren Sie zuerst eine neue Alternative:sudo update-alternatives --install /usr/bin/c++ c++ /opt/clang-llvm-3.5/bin/clang++ 30
Zu diesem Zweck können Sie den Toolchain-Dateimechanismus von cmake verwenden, siehe z . B. hier . Sie schreiben für jeden Compiler eine Toolchain-Datei mit den entsprechenden Definitionen. Zur Konfigurationszeit führen Sie z
Alle Compilerinformationen werden während des Aufrufs von project () aus der Toolchain-Datei festgelegt. Obwohl in der Dokumentation nur im Zusammenhang mit dem Cross-Compilieren erwähnt wird, funktioniert es auch für verschiedene Compiler auf demselben System.
quelle
Sie müssen definitiv nicht die verschiedenen llvm-ar etc Programme verwenden:
Diese funktionieren im internen llvm-Format und sind daher für die Erstellung Ihrer Anwendung nicht hilfreich.
Als Hinweis ruft -O4 LTO in Ihrem Programm auf, was Sie möglicherweise nicht möchten (dies erhöht die Kompilierungszeit erheblich) und klingelt standardmäßig auf den c99-Modus, sodass das Flag auch nicht unbedingt benötigt wird.
quelle
Wenn der von ausgewählte Standard-Compiler
cmake
istgcc
und Sie installiert habenclang
, können Sie Ihr Projekt auf einfache Weise kompilieren mitclang
:quelle
Mit Hilfe von
cmake
:Sie können Dateien wie
gcc_compiler.txt
und erstellen, umclang_compiler.txt
alle relativen Konfigurationen in die CMake-Syntax aufzunehmen.Clang-Beispiel (clang_compiler.txt):
Dann führen Sie es als
GCC:
Clang:
quelle
Sie können die Syntax verwenden:
$ENV{environment-variable}
in Ihrem,CMakeLists.txt
um auf Umgebungsvariablen zuzugreifen. Sie können Skripte erstellen, die eine Reihe von Umgebungsvariablen entsprechend initialisieren und nur Verweise auf diese Variablen in IhrenCMakeLists.txt
Dateien enthalten.quelle
-DCMAKE_C_COMPILER ...
etc aufruft ?CMakeLists.txt
jedes Projekt durchgehen und die neuen Variablen abfragen müssen. Ich hatte gehofft, dass es eine bequeme Möglichkeit geben würde, dies systemweit zu tun, ohne Projektdateien ändern zu müssen. Ähnlich wie beim Bestehen einesCMAKE_TOOLCHAIN_FILE
.