2012-04-06 21 views
95

Tenemos un conjunto de cross platform CMake build scripts, y admitimos la construcción con MSVC y .En cmake, ¿cómo puedo probar si el compilador es Clang?

Estamos probando Clang, pero no puedo averiguar 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 MSVC y GCC, respectivamente.

+0

Puede establecer el compilador configurando CMAKE_C_COMPILER y CMAKE_CXX_COMPILER en la ruta a clang o clang ++. +1 por clang – Zaffy

+0

¿Por qué debería importarme? Clang es muy parecido a GCC, en términos de opciones de compilador aceptadas ... –

+0

@BasileStarynkevitch Como admitíamos MSVC, necesitábamos detectar Clang, por lo que sabíamos si activar las opciones similares a GCC o las opciones similares a MSVC. Ha sido demasiado tiempo para que lo recuerde, pero también es posible que estuviéramos usando opciones que no son compatibles con Clang. – leedm777

Respuesta

158

Una verificación fiable es utilizar los 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 utiliza una envoltura compilador como ccache.

A partir de CMake 3.0.0, el valor de CMAKE_<LANG>_COMPILER_ID para Clang proporcionado por Apple es ahora AppleClang. Para poner a prueba tanto para el proporcionado por Apple Clang y el estruendo habitual utilizar los siguientes si la condición:

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

Véase también la AppleClang policy description.

+0

La [documentación de cmake] (http://www.cmake.org/cmake/help/cmake-2-8-docs.html#variable:CMAKE_LANG_COMPILER_ID) indica "Esto se usa para determinar el compilador y está sujeto a cambios" . De lo contrario, sería perfecto :-( – leedm777

+0

Probablemente no sea una buena idea utilizar la solución basada en 'CMAKE_CXX_COMPILER_ARG1' tampoco. Esta parece no estar documentada. – sakra

+15

A partir de CMake 2.8.10, esta variable está (¡finalmente!) Documentada. Ver: http://www.cmake.org/cmake/help/v2.8.10/cmake.html#variable:CMAKE_LANG_COMPILER_ID –

0

el ogro 3D código fuente del motor utiliza la siguiente check:

if (CMAKE_CXX_COMPILER MATCHES ".*clang") 
    set(CMAKE_COMPILER_IS_CLANGXX 1) 
endif() 
+3

Eso está cerca, pero no funciona cuando usa [ccache] (http: // ccache .samba.org /) (es decir, 'export CXX =" ccache clang ++ "') – leedm777

+4

Lo suficientemente cerca, te lo daré. Usé 'if (" $ {CMAKE_CXX_COMPILER} $ {CMAKE_CXX_COMPILER_ARG1} "MATCHES". * Clang ")' para manejar el caso ccache. – leedm777

+0

Esto no funciona para mí como '$ {CMAKE_CXX_COMPILER} ==/Library/Developer/CommandLineTools/usr/bin/C++'. La respuesta aceptada funciona. –

0

sólo para evitar cualquier problema mispelling, estoy usando esto:

if (CMAKE_CXX_COMPILER_ID MATCHES "[cC][lL][aA][nN][gG]") #Case insensitive match 
    set(IS_CLANG_BUILD true) 
else() 
    set(IS_CLANG_BUILD false) 
endif() 

Para hacer el caso de expresiones regulares insensibles, he intentado todo here sin éxito (no parece ser apoyado en CMake).

+0

de hecho, como hoy, la coincidencia de mayúsculas y minúsculas no es posible https://cmake.org/pipermail/cmake/2017-May/065432.html – fferri

Cuestiones relacionadas