Tenemos un conjunto de scripts de compilación CMake multiplataforma y admitimos la compilación con Visual C ++ y GCC .
Estamos probando Clang , pero no puedo entender cómo probar si el compilador es Clang con nuestro script CMake.
¿Qué debo probar para ver si el compilador es Clang o no? Actualmente estamos usando MSVCy CMAKE_COMPILER_IS_GNU<LANG>para probar Visual C ++ y GCC, respectivamente.

__GNUC__y_MSC_VER, pero no puede consumir los mismos programas que cualquiera de los compiladores. Detectar LLVM Clang y Apple Clang es crucial para garantizar que el código se compile y se ejecute como se espera. Estoy tan cansado de lidiar con BS de Clang que simplemente rompemos la compilación en Windows . Hemos adoptado la política de permitir que los usuarios se quejen ante LLVM para que los desarrolladores de Clang cambien su comportamiento. También vea ¿Cómo decirle a Clang que deje de fingir ser otros compiladores?Respuestas:
Una verificación confiable es usar las
CMAKE_<LANG>_COMPILER_IDvariables. Por ejemplo, para verificar el compilador de C ++:Estos también funcionan correctamente si se utiliza un contenedor de compilación como ccache .
A partir de CMake 3.0.0, el
CMAKE_<LANG>_COMPILER_IDvalor para Clang proporcionado por Apple es ahoraAppleClang. Para probar tanto el Clang proporcionado por Apple como el Clang regular, use la siguiente condición if:Consulte también la descripción de la política AppleClang .
CMake 3.15 ha agregado soporte para el clang-cl y el front-end clang regular. Puede determinar la variante de front-end inspeccionando la variable
CMAKE_CXX_COMPILER_FRONTEND_VARIANT:fuente
CMAKE_CXX_COMPILER_IDvariable solo está disponible después del comandoproject(Foo CXX).if (CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") ... endif()AppleClangespecíficamente, @sakra indica que secmake 3.0.0liberóAppleClang. Sin embargo, solo porque loscmake --versioninformes iguales o superiores no son suficientes, ¡debe hacerlo para poder utilizarcmake_minimum_required(VERSION 3.0.0)los3.0.0estándares!El código fuente del motor OGRE 3D utiliza lo siguiente verificación :
fuente
export CXX="ccache clang++")if ("${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}" MATCHES ".*clang")manejar el caso de ccache.${CMAKE_CXX_COMPILER} == /Library/Developer/CommandLineTools/usr/bin/c++. La respuesta aceptada funciona.Solo para evitar cualquier problema de ortografía, estoy usando una comparación que no distingue entre mayúsculas y minúsculas, como:
Para hacer que la expresión regular no distinga entre
MATCHESmayúsculas y minúsculas, probé todo aquí sin éxito (no parece ser compatible con CMake).fuente
Esta es una respuesta un poco más detallada para los novatos de cmake, modificada de la respuesta de sakra, solo agregue las siguientes líneas a
CMakeLists.txt:Luego, ejecute
cmake .en la carpeta donde se encuentra CMakeLists.txt. Luego verá un montón de resultados junto con su respuesta.fuente