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 MSVC
y 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_ID
variables. 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_ID
valor 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_ID
variable solo está disponible después del comandoproject(Foo CXX)
.if (CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") ... endif()
AppleClang
específicamente, @sakra indica que secmake 3.0.0
liberóAppleClang
. Sin embargo, solo porque loscmake --version
informes iguales o superiores no son suficientes, ¡debe hacerlo para poder utilizarcmake_minimum_required(VERSION 3.0.0)
los3.0.0
está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
MATCHES
mayú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