Wir haben eine Reihe von plattformübergreifenden CMake-Build-Skripten und unterstützen das Erstellen mit Visual C ++ und GCC .
Wir probieren Clang aus , aber ich kann nicht herausfinden, wie ich mit unserem CMake-Skript testen kann, ob der Compiler Clang ist oder nicht.
Was soll ich testen, um festzustellen, ob der Compiler Clang ist oder nicht? Wir verwenden MSVC
und CMAKE_COMPILER_IS_GNU<LANG>
testen derzeit Visual C ++ bzw. GCC.
__GNUC__
und_MSC_VER
, aber es kann die gleichen Programme wie jeder Compiler nicht verbrauchen. Das Erkennen von LLVM Clang und Apple Clang ist entscheidend, um sicherzustellen, dass der Code wie erwartet kompiliert und ausgeführt wird. Ich bin es so leid, mich mit Clangs BS zu beschäftigen, dass wir die Kompilierung unter Windows einfach unterbrechen . Wir haben die Richtlinie übernommen, Benutzer bei LLVM beschweren zu lassen, damit die Clang-Entwickler ihr Verhalten ändern. Siehe auch Wie man Clang sagt, er soll aufhören, sich als andere Compiler auszugeben?Antworten:
Eine zuverlässige Überprüfung besteht darin, die
CMAKE_<LANG>_COMPILER_ID
Variablen zu verwenden. So überprüfen Sie den C ++ - Compiler:Diese funktionieren auch ordnungsgemäß, wenn ein Compiler-Wrapper wie ccache verwendet wird.
Ab CMake 3.0.0 ist der
CMAKE_<LANG>_COMPILER_ID
Wert für von Apple bereitgestelltes Clang jetztAppleClang
. Verwenden Sie die folgenden if-Bedingungen, um sowohl den von Apple bereitgestellten als auch den regulären Clang zu testen:Siehe auch die Beschreibung der AppleClang-Richtlinie .
CMake 3.15 bietet Unterstützung für das Clang-Cl- und das reguläre Clang-Frontend. Sie können die Front-End-Variante ermitteln, indem Sie die Variable überprüfen
CMAKE_CXX_COMPILER_FRONTEND_VARIANT
:quelle
CMAKE_CXX_COMPILER_ID
Variable erst nach dem Befehl verfügbar istproject(Foo CXX)
.if (CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") ... endif()
AppleClang
spezifisch erkennen können, zeigt @sakra an, dasscmake 3.0.0
freigegebenAppleClang
. Nur weilcmake --version
Berichte gleich oder höher nicht ausreichen, müssen Sie dies tun,cmake_minimum_required(VERSION 3.0.0)
damit die3.0.0
Standards verwendet werden können!Der Quellcode der OGRE 3D-Engine verwendet die folgende Prüfung :
quelle
export CXX="ccache clang++"
) verwendenif ("${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}" MATCHES ".*clang")
den Ccache-Fall behandelt.${CMAKE_CXX_COMPILER} == /Library/Developer/CommandLineTools/usr/bin/c++
. Die akzeptierte Antwort funktioniert.Um Rechtschreibfehler zu vermeiden, verwende ich den Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung, wie z.
Um die Regex von
MATCHES
Groß- und Kleinschreibung zu unterscheiden, habe ich hier alles ohne Erfolg versucht (scheint in CMake nicht unterstützt zu werden).quelle
Dies ist eine etwas detailliertere Antwort für cmake-Neulinge, die von Sakras Antwort geändert wurde. Fügen Sie einfach die folgenden Zeilen an
CMakeLists.txt
:Führen Sie dann
cmake .
den Ordner aus, in dem sich CMakeLists.txt befindet. Dann sehen Sie eine Reihe von Ausgaben zusammen mit Ihrer Antwort.quelle