Nous avons un ensemble de scripts de construction CMake multiplateformes et nous prenons en charge la construction avec Visual C ++ et GCC .
Nous essayons Clang , mais je ne peux pas comprendre comment tester si le compilateur est ou non 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 respectivement Visual C ++ et GCC.
__GNUC__
et_MSC_VER
, mais il ne peut pas consommer les mêmes programmes que l'un ou l'autre des compilateurs. La détection de LLVM Clang et Apple Clang est cruciale pour garantir que le code se compile et s'exécute comme prévu. Je suis tellement fatigué de traiter avec BS de Clang que nous cassons la compilation sous Windows . Nous avons adopté la politique de laisser les utilisateurs se plaindre à LLVM afin que les développeurs de Clang changent de comportement. Voir aussi Comment dire à Clang d'arrêter de se faire passer pour d'autres compilateurs?Réponses:
Une vérification fiable consiste à utiliser les
CMAKE_<LANG>_COMPILER_ID
variables. Par exemple, pour vérifier le compilateur C ++:Celles-ci fonctionnent également correctement si un wrapper de compilateur tel que ccache est utilisé.
À partir de CMake 3.0.0, la
CMAKE_<LANG>_COMPILER_ID
valeur de Clang fournie par Apple est désormaisAppleClang
. Pour tester à la fois le Clang fourni par Apple et le Clang normal, utilisez la condition if suivante:Consultez également la description de la politique AppleClang .
CMake 3.15 a ajouté le support pour le clang-cl et le front-end clang régulier. Vous pouvez déterminer la variante frontale en inspectant la variable
CMAKE_CXX_COMPILER_FRONTEND_VARIANT
:la source
CMAKE_CXX_COMPILER_ID
variable n'est disponible qu'après la commandeproject(Foo CXX)
.if (CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") ... endif()
AppleClang
spécifiquement, @sakra indique quecmake 3.0.0
libéréAppleClang
. Cependant, juste parce que descmake --version
rapports égaux ou supérieurs ne suffisent pas, vous devezcmake_minimum_required(VERSION 3.0.0)
pour que les3.0.0
normes soient utilisées!Le code source du moteur OGRE 3D utilise la vérification suivante :
la source
export CXX="ccache clang++"
)if ("${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}" MATCHES ".*clang")
de gérer l'affaire ccache.${CMAKE_CXX_COMPILER} == /Library/Developer/CommandLineTools/usr/bin/c++
. La réponse acceptée fonctionne.Juste pour éviter tout problème de faute d'orthographe, j'utilise la comparaison insensible à la casse, comme:
Pour rendre l'expression rationnelle
MATCHES
insensible à la casse, j'ai tout essayé ici sans succès (ne semble pas être pris en charge dans CMake).la source
Ceci est une réponse un peu plus détaillée pour les débutants cmake, modifiée à partir de la réponse de sakra, ajoutez simplement les lignes suivantes à
CMakeLists.txt
:Ensuite, exécutez
cmake .
dans le dossier où se trouve CMakeLists.txt. Ensuite, vous verrez un tas de sorties avec votre réponse.la source