web-dev-qa-db-fra.com

Comment spécifier un compilateur dans CMake?

Je voudrais utiliser le compilateur IAR. J'ai remarqué que CMake a déjà beaucoup de fichiers sur ce compilateur:

https://github.com/jevinskie/cmake/blob/master/Modules/Compiler/IAR.cmake

D'après ce que j'ai lu, la solution commune consiste à spécifier manuellement TOUT la chaîne d'outils dans mon CMakeLists.txt:

set(CMAKE_C_COMPILER iccarm)
set(CMAKE_CPP_COMPILER iccarm)

Comment CMake peut-il relier ces définitions avec `Modules/Compiler/IAR.cmake"?

Je pensais que je devrais juste faire

include("Modules/Compiler/IAR.cmake")

Quelle est la bonne façon de spécifier mon compilateur IAR?

Quand je fais

cmake .

Il essaie toujours d'utiliser gcc au lieu de mon compilateur IAR. Pourquoi?

5
nowox

Pour sélectionner un compilateur spécifique, vous avez plusieurs solutions, comme expliqué dans CMake wiki :

Méthode 1: utiliser des variables d'environnement

Pour C et C++, définissez les variables d'environnement CC et CXX. Cette méthode n’est pas garantie pour tous les générateurs. (Spécifiquement, si vous essayez de définir le GCC_VERSION de Xcode, cette méthode confond Xcode.) Par exemple:

CC=gcc-4.2 CXX=/usr/bin/g++-4.2 cmake -G "Your Generator" path/to/your/source

Méthode 2: utilisez cmake -D

Définissez les variables CMAKE_FOO_COMPILER appropriées sur un nom de compilateur valide ou un chemin d'accès complet sur la ligne de commande, à l'aide de cmake -D. . Par exemple:

cmake -G "Your Generator" -D CMAKE_C_COMPILER=gcc-4.2 -D CMAKE_CXX_COMPILER=g++-4.2 path/to/your/source

Méthode 3 (éviter): utilisez set ()

Définissez les variables CMAKE_FOO_COMPILER appropriées sur un nom de compilateur valide ou un chemin d'accès complet dans un fichier de liste à l'aide de set(). Cela doit être fait avant de définir une langue (c'est-à-dire avant toute commande project() ou enable_language()). Par exemple:

set(CMAKE_C_COMPILER "gcc-4.2")
set(CMAKE_CXX_COMPILER "/usr/bin/g++-4.2")

project("YourProjectName")

Le wiki ne fournit pas la raison pour laquelle la 3ème méthode devrait être évitée ...

7
Antwane

Si vous ne souhaitez pas utiliser le compilateur standard de votre PC, vous devez indiquer à CMake le chemin d'accès au compilateur. Vous le faites via des variables d'environnement, un fichier de chaîne d'outils ou des définitions directes dans la ligne de commande CMake (voir, par exemple, Erreur CMake dans CMakeLists.txt: 30 (projet): Aucun CMAKE_C_COMPILER n'a été trouvé ). 

Mettre le nom/chemin du compilateur dans votre CMakeLists.txt empêcherait votre projet d'être multi-plateforme.

CMake vérifie les identifiants du compilateur en compilant fichiers spéciaux C/C++ . Donc, pas besoin d'inclure manuellement à partir de Module/Compiler ou Module/Platform.

Ceci sera automatiquement effectué par CMake sur la base des vérifications de son compilateur et de sa plate-forme.

Références

1
Florian

Vous pouvez appeler cmake comme ceci:

cmake -DCMAKE_C_COMPILER=iccarm ...

ou

cmake -DCMAKE_CXX_COMPILER=...
1
robert

Vous devez créer un fichier de chaîne d'outils et utiliser le module CmakeForceCompiler.

Voici un exemple de fichier de chaîne d’outils pour le développement de nu-métal ARM avec IAR:

include(CMakeForceCompiler)

set(CMAKE_SYSTEM_NAME Generic) # Or name of your OS if you have one
set(CMAKE_SYSTEM_PROCESSOR arm) # Or whatever
set(CMAKE_CROSSCOMPILING 1)

set(CMAKE_C_COMPILER iccarm) # Change the arm suffix if appropriate
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) # Required to make the previous line work for a target that requires a custom linker file

La dernière ligne est nécessaire car CMake essaiera de compiler un programme de test avec le compilateur pour s’assurer qu’il fonctionne et pour obtenir des informations sur la version des définitions du préprocesseur. Sans cette ligne, CMake utilisera add_executable () pour le programme de test et vous obtiendrez l’erreur "Le compilateur C" XXX "ne peut pas compiler un programme de test simple." Cela est dû au fait que le programme de test ne parvient pas à créer un lien, car il ne possède pas votre fichier de l'éditeur de liens personnalisé (je suppose un développement en métal nu, car c'est la raison pour laquelle IAR est habituellement utilisé). Cette ligne indique à CMake d'utiliser add_library () à la place, ce qui permet au test de réussir sans le fichier de l'éditeur de liens. Source de cette solution de contournement: cet article de la liste de diffusion de CMake .

Ensuite, en supposant que votre fichier de chaîne d'outils s'appelle iar-toolchain.cmake, appelez CMake comme suit:

cmake -DCMAKE_TOOLCHAIN_FILE=iar-toolchain.cmake .
0
Samuel Peter