J'ai un certain nombre de projets construits en utilisant CMake et j'aimerais pouvoir basculer facilement entre l'utilisation de GCC ou Clang / LLVM pour les compiler. Je crois (veuillez me corriger si je me trompe!) Que pour utiliser Clang, je dois définir ce qui suit:
SET (CMAKE_C_COMPILER "/usr/bin/clang")
SET (CMAKE_C_FLAGS "-Wall -std=c99")
SET (CMAKE_C_FLAGS_DEBUG "-g")
SET (CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG")
SET (CMAKE_C_FLAGS_RELEASE "-O4 -DNDEBUG")
SET (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")
SET (CMAKE_CXX_COMPILER "/usr/bin/clang++")
SET (CMAKE_CXX_FLAGS "-Wall")
SET (CMAKE_CXX_FLAGS_DEBUG "-g")
SET (CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELEASE "-O4 -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
SET (CMAKE_AR "/usr/bin/llvm-ar")
SET (CMAKE_LINKER "/usr/bin/llvm-ld")
SET (CMAKE_NM "/usr/bin/llvm-nm")
SET (CMAKE_OBJDUMP "/usr/bin/llvm-objdump")
SET (CMAKE_RANLIB "/usr/bin/llvm-ranlib")
Existe-t-il un moyen facile de basculer entre ces variables et les variables GCC par défaut, de préférence en tant que modification à l'échelle du système plutôt que spécifique au projet (c'est-à-dire pas simplement en les ajoutant dans CMakeLists.txt d'un projet)?
De plus, est-il nécessaire d'utiliser les llvm-*
programmes plutôt que les valeurs par défaut du système lors de la compilation en utilisant clang au lieu de gcc? Quelle est la différence?
CMAKE_USER_MAKE_RULES_OVERRIDE
travaux. Il semble que le fichier soit ignoré (c'est-à-dire bien qu'ilCMAKE_C_FLAGS_RELEASE
soit défini-O4
dans le fichier de remplacement, il affiche la valeur par défaut de-O3 -DNDEBUG
in cmake).src/build-clang
répertoire, les remplacements sont ignorés.CC
etCXX
, c'est peut-être parce que vous devez d'abord supprimer tous les fichiers du répertoire de génération.rm CMakeCache.txt
peut ne pas être indifférent.Changement C ++ à l'échelle du système sur Ubuntu:
Imprime quelque chose comme ceci:
Sélectionnez ensuite clang ++.
la source
There is only one alternative in link group cc (providing /usr/bin/cc): /usr/bin/gcc
Vous pouvez utiliser la commande d'option:
puis envelopper les paramètres du compilateur clang dans if () s:
De cette façon, il est affiché comme une option cmake dans les outils de configuration de l'interface graphique.
Pour le faire à l'échelle du système, vous pouvez bien sûr utiliser une variable d'environnement comme valeur par défaut ou rester avec la réponse de Ferruccio.
la source
cmake -DCMAKE_COMPILER_DEFINITIONS=MyLlvmDefinitions.cmake
.Changement C à l'échelle du système sur Ubuntu:
sudo update-alternatives --config cc
Changement C ++ à l'échelle du système sur Ubuntu:
sudo update-alternatives --config c++
Pour chacun des éléments ci-dessus, appuyez sur Numéro de sélection (1) et Entrée pour sélectionner Clang:
la source
/opt/clang-llvm-3.5/
installez d'abord une nouvelle alternative:sudo update-alternatives --install /usr/bin/c++ c++ /opt/clang-llvm-3.5/bin/clang++ 30
Vous pouvez utiliser le mécanisme de fichier de la chaîne d'outils de cmake à cet effet, voir par exemple ici . Vous écrivez un fichier de chaîne d'outils pour chaque compilateur contenant les définitions correspondantes. Au moment de la configuration, vous exécutez par exemple
et toutes les informations du compilateur seront définies lors de l'appel à project () à partir du fichier de la chaîne d'outils. Bien que la documentation ne soit mentionnée que dans le contexte de la compilation croisée, elle fonctionne également pour différents compilateurs sur le même système.
la source
Vous n'avez certainement pas besoin d'utiliser les différents programmes llvm-ar etc:
Celles-ci sont conçues pour fonctionner sur le format interne llvm et en tant que telles ne sont pas utiles à la construction de votre application.
Remarque: -O4 invoquera LTO sur votre programme, ce que vous ne voudrez peut-être pas (cela augmentera considérablement le temps de compilation) et basculera par défaut en mode c99 afin que l'indicateur ne soit pas nécessairement nécessaire non plus.
la source
Si le compilateur par défaut choisi par
cmake
estgcc
et que vous avez installéclang
, vous pouvez utiliser la méthode simple pour compiler votre projet avecclang
:la source
Selon l'aide de
cmake
:Vous pouvez créer des fichiers comme
gcc_compiler.txt
etclang_compiler.txt
inclure toute la configuration relative dans la syntaxe CMake.Exemple de Clang (clang_compiler.txt):
Ensuite, exécutez-le en tant que
GCC:
Bruit:
la source
Vous pouvez utiliser la syntaxe:
$ENV{environment-variable}
dans votreCMakeLists.txt
pour accéder aux variables d'environnement. Vous pouvez créer des scripts qui initialisent un ensemble de variables d'environnement de manière appropriée et ont juste des références à ces variables dans vosCMakeLists.txt
fichiers.la source
-DCMAKE_C_COMPILER ...
etc?CMakeLists.txt
chaque projet et de lui demander les nouvelles variables. J'espérais qu'il y aurait un moyen pratique de le faire à l'échelle du système, sans avoir à modifier les fichiers de projet. Semblable à passer aCMAKE_TOOLCHAIN_FILE
.