Wie kann ich in CMake testen, ob der Compiler Clang ist?

Wie kann ich in CMake testen, ob der Compiler Clang ist?


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 sollte ich testen, um zu sehen, ob der Compiler Clang ist oder nicht? Wir verwenden derzeit MSVC und CMAKE_COMPILER_IS_GNU<LANG> zum Testen für Visual C++ bzw. GCC.


Antworten:


Eine zuverlässige Überprüfung ist die Verwendung des CMAKE_<LANG>_COMPILER_ID Variablen. Zum Beispiel, um den C++-Compiler zu überprüfen:


if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
# using Clang
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
# using GCC
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
# using Intel C++
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
# using Visual Studio C++
endif()

Diese funktionieren auch korrekt, wenn ein Compiler-Wrapper wie ccache verwendet wird.


Ab CMake 3.0.0 die CMAKE_<LANG>_COMPILER_ID Wert für den von Apple bereitgestellten Clang ist jetzt AppleClang . Um sowohl den von Apple bereitgestellten Clang als auch den regulären Clang zu testen, verwenden Sie die folgende if-Bedingung:


if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
# using regular Clang or AppleClang
endif()

Siehe auch die AppleClang-Richtlinienbeschreibung.


CMake 3.15 hat Unterstützung sowohl für das Clang-cl als auch für das reguläre Clang-Frontend hinzugefügt. Sie können die Frontend-Variante ermitteln, indem Sie die Variable CMAKE_CXX_COMPILER_FRONTEND_VARIANT untersuchen :


if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
# using clang with clang-cl front end
elseif (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU")
# using clang with regular front end
endif()
endif()

Einige Code-Antworten


if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")   # using Clang elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")   # using GCC elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel")   # using Intel C++ elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")   # using Visual Studio C++ endif() 
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")   # using regular Clang or AppleClang endif() 
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")   if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
# using clang with clang-cl front end elseif (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU")
# using clang with regular front end endif() endif()
cmake_minimum_required(VERSION 3.1) project(MyProject CXX)  if ("${CMAKE_CXX_COMPILER_ID}"
MATCHES "Clang") MESSAGE("Clang") elseif ("${CMAKE_CXX_COMPILER_ID}"
STREQUAL "GNU") MESSAGE("GNU") elseif ("${CMAKE_CXX_COMPILER_ID}"
STREQUAL "Intel") MESSAGE("Intel") elseif ("${CMAKE_CXX_COMPILER_ID}"
STREQUAL "MSVC") MESSAGE("MSVC") endif()
if ("${CMAKE_CXX_COMPILER_ID}"
STREQUAL "MSVC") MESSAGE("MSVC") endif()
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")   MESSAGE("MSVC") endif() 
if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")   MESSAGE("MSVC") endif() 
string( TOLOWER "${CMAKE_CXX_COMPILER_ID}"
COMPILER_ID ) if (COMPILER_ID STREQUAL "clang")
set(IS_CLANG_BUILD true) else ()
set(IS_CLANG_BUILD false) endif ()
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")   if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") # clang-cl
# ... elseif (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU") # clang native
# ... endif() elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") # both
# ... endif()