2017-08-29 7 views
1

Je voudrais utiliser le compilateur IAR. J'ai remarqué CMake a déjà un tas de fichiers sur ce compilateur:Comment spécifier un compilateur dans CMake?

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

D'après ce que je lis la solution commune est de spécifier manuellement tous les toolchain dans mon CMakeLists.txt:

set(CMAKE_C_COMPILER iccarm) 
set(CMAKE_CPP_COMPILER iccarm) 

Comment CMake peut relier ces définitions avec `Modules/compilateur/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

cmake . 

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

+0

Est-ce que cette entrée de la FAQ CMake aide? https://cmake.org/Wiki/CMake_FAQ#How_do_I_use_a_different_compiler.3F – vre

Répondre

2

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

Méthode 1: environnement d'utilisation variables

Pour C et C++, définissez les variables d'environnement CC et CXX. Cette méthode n'est pas garantie de fonctionner pour tous les générateurs. (Plus précisément, si vous essayez de définir GCC_VERSION de Xcode, cette méthode embrouille Xcode.) Par exemple:

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

Méthode 2: utilisation CMake -D

Définissez la CMAKE_FOO_COMPILER appropriée variable (s) à un nom de compilateur valide ou un chemin d'accès complet sur la ligne de commande en utilisant 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): set utilisation()

Définissez la CMAKE_FOO_COMPILER variable (s) à un nom de compilateur valide ou chemin complet approprié dans un fichier de liste à l'aide set(). Cela doit être fait avant que toute langue soit définie (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 de raison pour éviter 3ème méthode ...

+0

Je ne comprends pas pourquoi la troisième méthode devrait être évitée. Avec la première méthode, l'utilisateur doit connaître le compilateur qu'il veut utiliser, ce qui ne devrait pas être le cas car ce projet ne construit qu'avec le compilateur spécifié. Avec la deuxième cible, l'utilisateur doit écrire une très longue ligne pour configurer le projet. Je préfère plutôt mettre la commande de la méthode 2 dans un fichier bash. C'est très déroutant pour moi. – nowox

+0

La méthode 3D a l'inconvénient que c'est ** hardcodes ** non seulement un compilateur, mais aussi un ** chemin ** à lui. Ou requis d'un utilisateur pour avoir un compilateur sous 'PATH'. Dans tous les cas, l'utilisateur doit savoir quel compilateur est utilisé. – Tsyvarev

+0

vous pouvez passer le nom du compilateur, sans définir le chemin d'accès complet à celui-ci. Dans ce cas, il est recherché dans la variable d'environnement PATH – Antwane

1

Si vous ne souhaitez pas utiliser le compilateur standard de votre PC, vous devez attribuer à 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 CMake Error at CMakeLists.txt:30 (project): No CMAKE_C_COMPILER could be found). Mettre le nom/chemin du compilateur dans votre fichier CMakeLists.txt empêcherait votre projet d'être multiplate-forme.

CMake vérifie les identifiants du compilateur en compilant special C/C++ files. Donc, pas besoin d'inclure manuellement de Module/Compiler ou Module/Platform.

Ceci sera fait automatiquement par CMake en fonction de ses vérifications du compilateur et de la plateforme.

Références

+0

Dois-je encore définir 'CMAKE_C_COMPILER' ou y a-t-il un autre moyen? Si je fais 'cmake. 'Il essaie toujours d'utiliser' gcc' – nowox

+1

@nowox Vous devez donner à CMake le chemin du compilateur. Vous le faites via des variables d'environnement, un fichier toolchain ou des définitions directes dans la ligne de commande CMake (voir par exemple [ici] (https://stackoverflow.com/questions/32801638/cmake-error-at-cmakelists-txt30-project-no -cmake-c-compilateur-pourrait-être-trouvé)). Mettre ceci dans votre 'CMakeLists.txt' empêcherait votre projet d'être multiplate-forme. – Florian

0

Vous pouvez appeler cmake comme ceci:

cmake -DCMAKE_C_COMPILER=iccarm ... 

ou

cmake -DCMAKE_CXX_COMPILER=... 
0

Vous devez créer un fichier toolchain et utiliser le CmakeForceCompiler m odule.

Voici un exemple de fichier toolchain pour le développement ARM métal nu 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 parce que CMake va essayer de compiler un programme de test avec le compilateur pour vous assurer qu'il fonctionne et obtenir des informations de version de préprocesseur définit. Sans cette ligne, CMake utilisera add_executable() pour le programme de test, et vous obtiendrez l'erreur "Le compilateur C" XXX "n'est pas capable de compiler un programme de test simple." C'est parce que le programme de test ne parvient pas à lier, car il n'a pas votre fichier de lien personnalisé (je suppose que le développement de bare-metal car c'est pour cela que IAR est habituellement utilisé). Cette ligne indique à CMake d'utiliser à la place add_library(), ce qui fait que le test réussit sans le fichier de liaison. Source de cette solution de contournement: this CMake mailing list post.

Ensuite, en supposant que votre fichier toolchain est nommé IAR-toolchain.cmake, invoquer CMake comme ceci:

cmake -DCMAKE_TOOLCHAIN_FILE=iar-toolchain.cmake . 
+0

Comment le développeur sait-il qu'il doit écrire 'cmake -DCMAKE_TOOLCHAIN_FILE = iar-toolchain.cmake .'.De façon traditionnelle avec GNU Make, le développeur voit un 'Makefile' qu'il tape' make', c'est simple. Avec CMake cela semble un peu plus compliqué :( – nowox

+1

Vous pouvez créer un script wrapper pour appeler cmake J'ai un script nommé build.sh à la racine de tous mes projets –

+1

Je reçois 'La macro CMAKE_FORCE_C_COMPILER est dépréciée' – nowox