web-dev-qa-db-fra.com

Dans CMake, comment puis-je tester si le compilateur est Clang?

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.

127
leedm777

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 .

202
sakra

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

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

1
Antonio