En CMake, ¿cómo puedo probar si el compilador es Clang?

 C Programming >> Programación C >  >> Tags >> Clang
En CMake, ¿cómo puedo probar si el compilador es Clang?


Tenemos un conjunto de secuencias de comandos de compilación CMake multiplataforma y admitimos la compilación con Visual C++ y GCC.


Estamos probando Clang, pero no sé cómo probar si el compilador es Clang o no con nuestro script CMake.


¿Qué debo probar para ver si el compilador es Clang o no? Actualmente estamos usando MSVC y CMAKE_COMPILER_IS_GNU<LANG> para probar Visual C++ y GCC, respectivamente.


Respuestas:


Una verificación confiable es usar el CMAKE_<LANG>_COMPILER_ID variables Por ejemplo, para comprobar el compilador de C++:


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()

Estos también funcionan correctamente si se usa un contenedor de compilador como ccache.


A partir de CMake 3.0.0, el CMAKE_<LANG>_COMPILER_ID el valor de Clang proporcionado por Apple ahora es AppleClang . Para comprobar tanto el Clang proporcionado por Apple como el Clang normal, utilice la siguiente condición if:


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

Consulte también la descripción de la política de AppleClang.


CMake 3.15 ha agregado soporte tanto para clang-cl como para el front-end clang regular. Puede determinar la variante de front-end inspeccionando la variable CMAKE_CXX_COMPILER_FRONTEND_VARIANT :


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()

Algunas respuestas de código


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()