Как сделать кросс-компиляцию omniORB 4 (на x86_64 для ARM с omniORB 4.1.6) - PullRequest
0 голосов
/ 11 июня 2019

omniORB 4 использует скрипт конфигурации Autoconf для поддержки конфигурации системы сборки.Многие скрипты configure поддерживают кросс-компиляцию с использованием флагов --host и --build.К сожалению, omniORB явно указывает в своем файле README.unix, что кросс-компиляция не поддерживается.

Сборка Autoconf в настоящее время не работает для кросс-компиляции.

Вот что происходиткогда вы пытаетесь использовать флаги --host и --build Autoconf:

Environment:

  • PATH, включенный для включения инструментов кросс-компиляции
  • CPPFLAGS для включения папки ARM sysroot / include -I.../sysroot/include
  • LDFLAGS для включения папки ARM sysroot / lib -L.../sysroot/lib

Примечание: Я использую три точки (...), чтобы пропустить части путей к файлам или неважных выходных данных.

$ pwd
.../omniORB-4.1.6
$ mkdir build
$ cd build
$ ../configure --build=x86_64-linux-gnu --host=arm-linux-gnueabihf
...
$ make
...
omniidl: ERROR!

omniidl: Could not open IDL compiler module _omniidlmodule.so
omniidl: Please make sure it is in directory .../omniORB-4.1.6/build/lib
omniidl: (or set the PYTHONPATH environment variable)

omniidl: (The error was '.../omniORB-4.1.6/build/lib/_omniidlmodule.so: wrong ELF class: ELFCLASS32')
...

Я считаю, что важным сообщением является wrong ELF class: ELFCLASS32.Я проверил эту библиотеку общих объектов с помощью file.

$ file lib/_omniidlmodule.so.4.1
lib/_omniidlmodule.so.4.1: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, ...

Так что, похоже, система сборки собирает этот модуль общего объекта для использования omniidl во время сборки omniORB.Проблема в том, что он построен для ARM и не может использоваться в хост-системе.

Как я могу кросс-компилировать omniORB, учитывая отсутствие поддержки со стороны их системы сборки?

1 Ответ

0 голосов
/ 12 июня 2019

Я пришел к своему решению с помощью учебного поста на веб-сайте компании под названием Tango Controls.Хотя их инструкций может быть достаточно для некоторых, они не подходят для меня.Первая проблема заключалась в том, что он не учитывал необходимость включать / ссылаться на библиотеки (например, Python), созданные для системы host .Вторая проблема заключается в том, что он не решает проблему установки надлежащим образом - когда вы будете следовать их инструкциям, вы в конечном итоге установите некоторые исполняемые файлы и библиотеки, созданные для системы build .

Системная терминология (как определено Autoconf):

  • build - машина, на которой вы компилируете код (x86_64)
  • host - машина, на которой вы хотите выполнить двоичные файлы (ARM)

Вот шаги, которые я предпринял для кросс-компиляции omniORB:

  1. Создайте и введите каталог сборки
$ pwd
.../omniORB-4.1.6
$ mkdir build
$ cd build

Настройка среды

  • PATH с включением инструментов кросс-компиляции
  • CPPFLAGS с включением папки ARM sysroot / include -I... / sysroot / include
  • LDFLAGS для включения в папку ARM sysroot / lib -L ... / sysroot / lib

Настроить

Задайте свой собственный --prefix при необходимости и измените CC и CXX для вашей настройки.Вам также может понадобиться изменить настройки --build и --host.

$ ../configure --build=x86_64-linux-gnu --host=arm-linux-gnueabihf --prefix=.../sysroot \
    CC=.../bin/arm-linux-gnueabihf-gcc \
    CXX=.../bin/arm-linux-gnueabihf-g++
...

Примечание: я использую три точки (...), чтобы пропустить части пути к файлам или неважновыход.

Удалите пути включения и библиотеки из beforeauto.mk для сборки инструмента x86_64
$ sed -i 's#CPPFLAGS = -I.*include \$(DIR_CPPFLAGS) \$(IMPORT_CPPFLAGS)#CPPFLAGS = $(DIR_CPPFLAGS) $(IMPORT_CPPFLAGS)#' mk/beforeauto.mk
$ sed -i 's#CLINKOPTIONS    = -L.*lib \$(CDEBUGFLAGS) \$(COPTIONS)#CLINKOPTIONS    = $(CDEBUGFLAGS) $(COPTIONS)#' mk/beforeauto.mk
$ sed -i 's#CXXLINKOPTIONS  = -L.*lib \$(CXXDEBUGFLAGS) \$(CXXOPTIONS)#CXXLINKOPTIONS  = $(CXXDEBUGFLAGS) $(CXXOPTIONS)#' mk/beforeauto.mk

Эти sed команды обобщены, но вам все равно может потребоваться изменить их дляваши собственные настройки.

Создание инструментов для системы build

Эти инструменты используются во время компиляции omniORB, поэтому их необходимо скомпилировать для системы build ,Мы заставляем make использовать системные компиляторы build с переменными CC и CXX. Они могут нуждаться в модификации в зависимости от имени ваших компиляторов системы сборки.Убедитесь, что эти компиляторы на вашем PATH.

$ make CC=gcc -C src/tool/omniidl/cxx/cccp
...
$ make CXX=g++ -C src/tool/omniidl/cxx
...
$ make CC=gcc -C src/tool/omkdepend
...
Система сборки патчей - может не потребоваться

В инструкциях из поста Tango говорится о добавлении библиотеки stdc++ в некоторые команды make с помощью -l флаг.Приведенные ниже команды sed могут использоваться для этого патча.

$ sed -i 's/@(libs="$(CORBA_LIB_NODYN)"; $(CXXExecutable))/@(libs="$(CORBA_LIB_NODYN) -lstdc++"; $(CXXExecutable))/' ../src/appl/omniMapper/dir.mk
$ sed -i 's/@(libs="$(CORBA_LIB_NODYN)"; $(CXXExecutable))/@(libs="$(CORBA_LIB_NODYN) -lstdc++"; $(CXXExecutable))/' ../src/appl/omniNames/dir.mk
$ sed -i 's/@(libs="$(CORBA_LIB_NODYN)"; $(CXXExecutable))/@(libs="$(CORBA_LIB_NODYN) -lstdc++"; $(CXXExecutable))/' ../src/appl/utils/catior/dir.mk
$ sed -i 's/@(libs="$(CORBA_LIB_NODYN)"; $(CXXExecutable))/@(libs="$(CORBA_LIB_NODYN) -lstdc++"; $(CXXExecutable))/' ../src/appl/utils/convertior/dir.mk
$ sed -i 's/@(libs="$(CORBA_LIB_NODYN)"; $(CXXExecutable))/@(libs="$(CORBA_LIB_NODYN) -lstdc++"; $(CXXExecutable))/' ../src/appl/utils/genior/dir.mk
$ sed -i 's/@(libs="$(CORBA_LIB_NODYN)"; $(CXXExecutable))/@(libs="$(CORBA_LIB_NODYN) -lstdc++"; $(CXXExecutable))/' ../src/appl/utils/nameclt/dir.mk

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

Поместите пути включения и библиотеки обратно в beforeauto.mk для сборки ARM omniORB

Вам нужно будет указать собственные пути вместо ....

$ sed -i 's#CPPFLAGS = \$(DIR_CPPFLAGS) \$(IMPORT_CPPFLAGS)#CPPFLAGS = -I.../sysroot/include $(DIR_CPPFLAGS) $(IMPORT_CPPFLAGS)#' mk/beforeauto.mk
$ sed -i 's#CLINKOPTIONS    = \$(CDEBUGFLAGS) \$(COPTIONS)#CLINKOPTIONS    = -L.../sysroot/lib $(CDEBUGFLAGS) $(COPTIONS)#' mk/beforeauto.mk
$ sed -i 's#CXXLINKOPTIONS  = \$(CXXDEBUGFLAGS) \$(CXXOPTIONS)#CXXLINKOPTIONS  = -L.../sysroot/lib $(CXXDEBUGFLAGS) $(CXXOPTIONS)#' mk/beforeauto.mk
Кросс-компиляция omniORB
$ make
...
Кросс-компиляция инструментов, которые мы изначально создали для build system
$ make -C src/tool/omniidl/cxx/cccp clean
...
$ make -C src/tool/omniidl/cxx clean
...
$ make -C src/tool/omkdepend clean
...
$ make -C src/tool/omniidl/cxx/cccp
...
$ make -C src/tool/omniidl/cxx
...
$ make -C src/tool/omkdepend
...
Установите все
$ make install
...

Мы закончили! Теперь вы сможете проверить установленные файлы с помощью команды file и увидеть, что они собраныдля АРМ.

...