CMake cross-comstack avec un éditeur de liens spécifique ne passe pas les arguments à armlink

J’essaie de comstackr de manière croisée un projet pour les générations ARM Cortex intégrées, mais je ne parviens pas à faire fonctionner l’éditeur de liens. Je veux utiliser armlink, mais aucun fichier n’est transmis à armlink et par conséquent, aucun fichier .elf n’est généré.

Mon CMakeLists.txt est assez simple et donné ci-dessous. L’échec est montré après celui qui montre qu’armlink a été invoqué par le makefile sans aucun argument.

Tous les indicateurs seront utiles – j’ai cherché et lu de nombreux articles, mais ils semblent tous avoir des exigences plus complexes.

cmake_minimum_required(VERSION 2.8) project(test_arm) enable_language(C ASM) # Cross-compilation for ARM SET(CMAKE_C_COMPILER armcc) SET(CMAKE_LINKER armlink) SET(CMAKE_C_LINK_EXECUTABLE armlink) SET(CMAKE_C_FLAGS "--cpu=Cortex-M3") SET(LINK_FLAGS "--map --ro-base=0x0 --rw-base=0x0008000 --first='boot.o(RESET)' --datacompressor=off") SET(CMAKE_EXE_LINKER_FLAGS "--map --ro-base=0x0 --rw-base=0x0008000 --first='boot.o(RESET)' --datacompressor=off") include_directories(../include) add_executable(blinky blinky.c) set_target_properties(blinky PROPERTIES LINKER_LANGUAGE C) 

L’échec est le suivant, mais je suppose que ce serait évident pour quelqu’un étant donné que j’ai un problème stupide dans mes CMakeLists:

 $ make VERBOSE=1 [100%] Building C object CMakeFiles/blinky.dir/blinky.co /usr/bin/cmake -E cmake_link_script CMakeFiles/blinky.dir/link.txt --verbose=1 armlink Linking C executable blinky Product: DS-5 Professional 5.21.0 [5210017] Component: ARM Comstackr 5.05 update 1 (build 106) Tool: armlink [4d0efa] For support see http://www.arm.com/support/ Software supplied by: ARM Limited Usage: armlink option-list input-file-list where .... 

Je m’attendais à ce que le Makefile généré par CMake appelle armlink avec quelque chose comme:

 armlink --map --ro-base=0x0 --rw-base=0x0008000 \ --first='boot.o(RESET)' --datacompressor=off \ CMakeFiles/blinky.dir/blinky.co -o blinky.elf 

Depuis CMake v3.5, vous n’avez plus besoin d’une chaîne d’outils pour les outils de compilation Keil ARM C / C ++:

Un support a été ajouté pour le compilateur ARM (arm.com) avec l’identifiant de compilateur ARMCC.

Il suffit de définir vos variables de compilateur C / CXX en conséquence

 cmake -DCMAKE_C_COMPILER:PATH="C:\Program Files (x86)\DS-5\bin\armcc.exe" -DCMAKE_CXX_COMPILER:PATH="C:\Program Files (x86)\DS-5\bin\armcc.exe" ... 

Références

  • Soutien à la chaîne d’outils de la Commission
  • Ajouter un support pour le compilateur ARM (arm.com)
  • Erreur CMake dans CMakeLists.txt: 30 (projet): Aucun fichier CMAKE_C_COMPILER n’a été trouvé.

D’après mon expérience, vous ne pouvez pas définir CMAKE_EXE_LINKER_FLAGS dans un fichier CMakeLists.txt. Il doit être transmis via un fichier CMAKE_TOOLCHAIN_FILE lorsque CMake est appelé pour la première fois dans un répertoire de construction.

Je ne trouve aucune documentation concernant ce problème, mais il existe une page de compilation croisée avec CMake que vous devriez utiliser si vous faites une compilation croisée.

Pour commencer, il suffit de mettre votre set -calls dans un fichier toolchain et d’exécuter

 cmake -DCMAKE_TOOLCHAIN_FILE= 

dans un répertoire de construction propre.

Un fichier d’outils peut être une bonne idée. Voici ce que j’ai mentionné la dernière fois que j’ai essayé CMake 2.8.10 avec la chaîne d’outils DS-5 (il pourrait encore être optimisé, mais cela devrait vous donner un sharepoint départ):

 INCLUDE(CMakeForceComstackr) # This one is important SET(CMAKE_SYSTEM_NAME Generic) SET(CMAKE_SYSTEM_PROCESSOR arm) # Specify the cross comstackr SET(CMAKE_C_COMPILER "C:/Program Files (x86)/DS-5/bin/armcc.exe") SET(CMAKE_CXX_COMPILER "C:/Program Files (x86)/DS-5/bin/armcc.exe") SET(CMAKE_AR "C:/Program Files (x86)/DS-5/bin/armar.exe" CACHE FILEPATH "Archiver") #CMAKE_FORCE_C_COMPILER("C:/Program Files (x86)/DS-5/sw/gcc/bin/arm-linux-gnueabihf-gcc.exe" GNU) #CMAKE_FORCE_CXX_COMPILER("C:/Program Files (x86)/DS-5/sw/gcc/bin/arm-linux-gnueabihf-g++.exe" GNU) UNSET(CMAKE_C_FLAGS CACHE) SET(CMAKE_C_FLAGS "--cpu=Cortex-A9 --thumb -Ospace" CACHE STRING "" FORCE) UNSET(CMAKE_CXX_FLAGS CACHE) SET(CMAKE_CXX_FLAGS ${CMAKE_C_FLAGS} CACHE STRING "" FORCE) UNSET(CMAKE_EXE_LINKER_FLAGS CACHE) SET(CMAKE_EXE_LINKER_FLAGS "" CACHE STRING "" FORCE) UNSET(CMAKE_AR_FLAGS CACHE) SET(CMAKE_AR_FLAGS "-p -armcc,-Ospace" CACHE STRING "" FORCE) # set(CMAKE_C_ARCHIVE_CREATE " cr   ") SET(CMAKE_C_ARCHIVE_CREATE " ${CMAKE_AR_FLAGS} -o  " CACHE STRING "C Archive Create") # set(CMAKE_CXX_ARCHIVE_CREATE " cr   ") SET(CMAKE_CXX_ARCHIVE_CREATE " ${CMAKE_AR_FLAGS} -o  " CACHE STRING "CXX Archive Create") include_directories("C:/Program Files (x86)/DS-5/include") #include_directories("C:/Program Files (x86)/DS-5/sw/gcc/arm-linux-gnueabihf/libc/usr/include/arm-linux-gnueabi") # Where is the target environment SET(CMAKE_FIND_ROOT_PATH "C:/Program Files (x86)/DS-5") # Search for programs in the build host directories SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # For libraries and headers in the target directories SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 

Concernant ta question

Quelques parsings d’échec

Ce que vous avez essayé devrait fonctionner (voir aussi, par exemple, Comment append un éditeur de liens ou un indicateur de compilation dans un fichier CMake? ). Mais il semble que quelque chose se passe mal lors de la configuration.

Je ne connais pas votre appel en ligne de commande pour les étapes de configuration / génération de CMake, alors voici quelques conseils généraux pour trouver la cause:

Tu pourrais essayer d’appeler

 cmake.exe --trace ... 

pour voir ce qui n’allait pas avec votre variable CMAKE_EXE_LINKER_FLAGS . Cela générera beaucoup de sortie, voici donc quelques bases sur ce que fait CMake:

  • La commande project() déclenchera l’évaluation du compilateur
  • Cela va écrire CMAKE_EXE_LINKER_FLAGS dans votre CMakeCache.txt
  • Vous écrasez-le avec une variable locale (voir le docu de scope de la variable ici )

Si vous examinez share\cmake-2.8\Modules\CMakeCommonLanguageInclude.cmake :

 set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS_INIT} $ENV{LDFLAGS}" CACHE STRING "Flags used by the linker.") 

Vous pouvez utiliser CMAKE_EXE_LINKER_FLAGS_INIT , mais vous devez le définir avant la commande project() ou dans le fichier d’outils.

Parce que vous définissez le langage de liaison sur C jetez un œil à share\cmake-2.8\Modules\CMakeCInformation.cmake :

 if(NOT CMAKE_C_LINK_EXECUTABLE) set(CMAKE_C_LINK_EXECUTABLE "     -o  ") endif() 

Vous pouvez donc utiliser CMAKE_C_LINK_EXECUTABLE pour écraser l’appel complet de l’éditeur de liens ou utiliser CMAKE_C_LINK_FLAGS pour définir d’autres indicateurs.

La voie “officielle”

La manière officielle de définir les drapeaux de l’éditeur de liens et du compilateur de la cible serait (avant CMake 2.8.12):

 set_property(TARGET blinky APPEND_STRING PROPERTY COMPILE_FLAGS "--cpu=Cortex-M3") set_property(TARGET blinky APPEND_STRING PROPERTIES LINK_FLAGS "--map --ro-base=0x0 --rw-base=0x0008000 --first='boot.o(RESET)' --datacompressor=off") 

À partir de CMake 2.8.12, ce serait quelque chose comme:

 add_comstack_options("--cpu=Cortex-M3")