Nous avons un ensemble de scripts de compilation multi-plateforme CMake , et nous supportons la construction avec Visual C++ et GCC .
Nous essayons Clang , mais je ne vois pas comment tester si le compilateur est Clang avec notre script CMake.
Que dois-je tester pour voir si le compilateur est Clang ou non? Nous utilisons actuellement MSVC
et CMAKE_COMPILER_IS_GNU<LANG>
pour tester Visual C++ et GCC, respectivement.
Une vérification fiable consiste à utiliser le CMAKE_<LANG>_COMPILER_ID
variables. Par exemple, pour vérifier le compilateur 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()
Celles-ci fonctionnent également correctement si un wrapper de compilateur tel que ccache est utilisé.
À partir de CMake 3.0.0, le CMAKE_<LANG>_COMPILER_ID
La valeur pour Clang fournie par Apple est maintenant AppleClang
. Pour tester le Clang fourni par Apple et le Clang standard, utilisez la condition suivante si:
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
# using regular Clang or AppleClang
endif()
Voir également le Description de la politique AppleClang .
Le code source du moteur OGRE 3D utilise ce qui suit check :
if (CMAKE_CXX_COMPILER MATCHES ".*clang")
set(CMAKE_COMPILER_IS_CLANGXX 1)
endif ()
Juste pour éviter tout problème d'orthographe, j'utilise ceci:
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 ()
Pour rendre la regex insensible à la casse, j'ai tout essayé ici sans succès (ne semble pas être pris en charge par CMake).