Обеспечивает ли Cmake поддержку компилятора IAR C icc8051.exe? - PullRequest
0 голосов
/ 10 апреля 2019

Я хочу преобразовать проект микроконтроллера C51, созданный IAR, в проект кросс-компиляции Cmake. Моя среда разработки - Windows10. Я написал простую программу на C51 (main.c) и файл набора инструментов (icc8051.cmake) для тестирования.

Произошла ошибка:

CMAKE_C_COMPILER_ARCHITECTURE_ID не обнаружен как "AVR" или "ARM". это должно быть автоматическим.

Ниже приведено содержимое моего окна cmd:

C:\works\emakefun\test>cmake -G"NMake Makefiles" -DCMAKE_TOOLCHAIN_FILE=c:\application\cmake\share\cmake-3.14\Toolchains\icc8051.cmake
CMake Warning:
  No source or binary directory provided.  Both will be assumed to be the
  same as the current working directory, but note that this warning will
  become a fatal error in future CMake releases.


-- The C compiler identification is IAR
CMake Error at C:/application/cmake/share/cmake-3.14/Modules/Compiler/IAR-C.cmake:61 (message):
  CMAKE_C_COMPILER_ARCHITECTURE_ID not detected as "AVR" or "ARM".  This
  should be automatic.
Call Stack (most recent call first):
  C:/application/cmake/share/cmake-3.14/Modules/CMakeCInformation.cmake:25 (include)
  CMakeLists.txt:1 (project)


-- Configuring incomplete, errors occurred!
See also "C:/works/emakefun/test/CMakeFiles/CMakeOutput.log".

C:\works\emakefun\test>

Следующий файл моего набора инструментов icc8051.cmake:

set (CMAKE_SYSTEM_NAME Generic)
set (CMAKE_C_COMPILER "C:/application/IAR Systems/Embedded Workbench 8.0/8051/bin/icc8051.exe")

Я также отсканировал файл IAR-C.cmake. Кажется, что он поддерживает только AVR и ARM, но не C51. Вы можете просмотреть содержимое этого файла по следующей ссылке: https://github.com/Kitware/CMake/blob/master/Modules/Compiler/IAR-C.cmake

Есть намеки? Спасибо!

1 Ответ

0 голосов
/ 18 июля 2019

Встроенная поддержка:

CMake не поддерживает IAR для чего-либо, кроме архитектур, перечисленных в IAR-C.cmake, если вы хотите использовать CMake для чего-то другого, вам нужно будет отправить сообщение о проблеме на страницу gitlab CMake. Я не уверен, захочет ли кто-либо из разработчиков CMake основной линии добавить время для поддержки C51, так что это может не произойти, если вы не захотите сделать это самостоятельно.

Судя по вашему сообщению об ошибке, вы, вероятно, используете "старую" версию cmake. Последняя версия, над которой я работал, была 3.14, и в то время она поддерживала только AVR и ARM с IAR. Похоже, что последняя версия IAR-C.cmake поддерживает несколько других архитектур. Сообщение об ошибке (если вы посмотрите внизу файла, на который вы ссылаетесь) должно быть CMAKE_C_COMPILER_ARCHITECTURE_ID not detected. This should be automatic. Более новый код модуля IAR находится в CMake 3.15.0, поэтому вы должны получить последнюю версию с веб-сайта CMake.

Добавление поддержки:

Я внес некоторые изменения в модуль IAR-CXX.cmake для лучшей поддержки AVR, но, на мой взгляд, он все еще экспериментален. Проблема заключается в том, что двоичные файлы, создаваемые IAR-AVR, имеют трудный для анализа собственный формат , компилятор не поддерживает определенный стандарт C ++ (он использует внедренный c ++ ), а параметры командной строки не легко отображаются на значения по умолчанию для cmake.

У меня нет компилятора IAR 8051, но я перечислю то, что я считаю основными изменениями, которые необходимо внести. поскольку все это находится в *.cmake файлах в папке модуля, вам не нужно будет перекомпилировать cmake , он просто изменит вашу существующую установку. Конечно, если вы работаете, вы должны отправить запрос на включение и отправить его в mainline cmake!

вам потребуется: руководство по компилятору IAR 8051 и редактирование следующих файлов в вашей установке CMake относительно C:\Program Files\CMake\share:

  • CMake-3.15.0 \ Modules \ Compiler \ IAR-DetermineCompiler.cmake
  • CMake-3.15.0 \ Modules \ CMakePlatformId.h.in
  • CMake-3.15.0 \ Modules \ Compiler \ IAR-C.cmake

CMake-3.15.0 \ Modules \ Compiler \ IAR-DetermineCompiler.cmake

этот файл определяет некоторые шаблоны макросов, которые скомпилированы в простой файл C. Затем CMake выгружает строки из созданного объектного файла, чтобы прочитать эти макросы и найти информацию о компиляторе.

На странице 391 руководства по компилятору вы можете увидеть, как компилятор IAR 8051 определяет __IAR_SYSTEMS_ICC__, __VER__ и __ICC8051__. отличный! первые два уже обработаны, вам просто нужно добавить || defined(__ICC8051__) в конец цепочки #elif в строке 34.

CMake-3.15.0 \ Modules \ CMakePlatformId.h.in

этот файл является шаблоном, который является частью файла, который компилируется для теста конфигурации. начиная со строки 155 вы можете видеть все макросы компилятора IAR, которые были определены. Как раз перед # else /* unknown architecture */ в строке 173 вы должны добавить

# elif defined(__ICC8051__)
#  define ARCHITECTURE_ID "8051"

CMake-3.15.0 \ Modules \ Compiler \ IAR-C.cmake

компилятору C51 потребуется еще один elseif в IAR-C.cmake, например:

# CMAKE_C_COMPILER_ARCHITECTURE_ID should be 8051 because of our edit in the template file
elseif("${CMAKE_C_COMPILER_ARCHITECTURE_ID}" STREQUAL "8051")
  # pretty sure 8051 IAR uses xlink? (compiler guide page 42)
  __compiler_iar_xlink(C)
  # after `C` the format is compiler version followed by default C standard
  # the compiler manual i found says the default version is C99, but I have no idea
  # what the compiler version is. 10.2 is the latest...
  __compiler_check_default_language_standard(C 10.2 99)
  # set to output extension you need, or remove if you want an .elf
  set(CMAKE_C_OUTPUT_EXTENSION ".r90")

Попробуйте снова настроить

На данный момент вы можете попробовать очистить кеш и перенастроить проект. Cmake будет использовать модули, которые мы только что изменили, и если вам повезет, это сработает. Я написал все это без доступа к компилятору, так что, надеюсь, вы отредактируете мой ответ с любыми дополнительными шагами, которые вам необходимо предпринять.

Дополнительные предложения

Добавьте строку set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) в файл набора инструментов. Это не позволяет компилятору теста cmake пытаться связать. Часто для работы встроенных компоновщиков нужны специальные скрипты, флаги и т. Д. Это приводит к сбою шага настройки с сообщением The C compiler ... is not able to compile a simple test program.

Также, если вам нужно установить некоторые флаги в наборе инструментов, чтобы компилятор работал на базовом уровне, обратитесь к этому ответу .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...