Автор Тема: Кросс-компиляция  (Прочитано 115 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Александр

  • Модератор
  • *****
  • Сообщений: 141
  • Репутация: 1
  • Мощность альтернативной энергоустановки: 800
Кросс-компиляция
« : 19 Февраль 2019, 12:54:40 »
Для компиляции проектов под различные архитектуры требуются различные тулчейны.
Много хороших отзывов о crosstool-NG именно его я использовал при сборке тулчейна для компиляции проектов под ESP8266, в котором используется Xtensa – Tensilica’s L106.

Для работы, да и вообще для всего я использую дистрибутив GNU Linux Calculate Linux, основанный на Gentoo Linux.
crosstool-NG в портежах нет, зато из коробки есть другой инструмент - crossdev.
Устанавливается он просто
# emerge crossdev
https://wiki.gentoo.org/wiki/Crossdev
Далее с его помощью собирается тулчейн под ту или иную архитектуру
# crossdev -t архитектура

Подсказки можно найти
# crossdev --helpПодсказки по архитектурам
crossdev --target help
Для удаления использовать
#emerge --ask --depclean sys-devel/crossdev
Для STM32 требуется тулчейн arm-none-eabi
Его и соберем
calculate /home/strange # crossdev -t arm-none-eabi
-                                                                               
 * crossdev version:      20181202
 * Host Portage ARCH:     amd64
 * Target Portage ARCH:   arm
 * Target System:         arm-none-eabi
 * Stage:                 3 (C compiler & libc)
 * USE=multilib:          yes
 * ABIs:                  default

 * binutils:              binutils-[latest]
 * gcc:                   gcc-[latest]
 * libc:                  newlib-[latest]

 * CROSSDEV_OVERLAY:      /usr/local/portage-crossdev
 * PORT_LOGDIR:           /var/log/portage
 * PORTAGE_CONFIGROOT:    /
 * Portage flags:         
                                                                               
 * leaving metadata/layout.conf alone in /usr/local/portage-crossdev
                                                                               
!!! WARNING - Cannot auto-configure CHOST arm-none-eabi;
!!! You should edit
!!! by hand to complete your configuration.
!!!  No LIBC is known for this target.
!!!  No KERNEL is known for this target.
 * Log: /var/log/portage/cross-arm-none-eabi-binutils.log
 * Emerging cross-binutils ...                                            [ ok ]
 * Log: /var/log/portage/cross-arm-none-eabi-gcc-stage1.log
 * Emerging cross-gcc-stage1 ...                                          [ ok ]
 * Log: /var/log/portage/cross-arm-none-eabi-newlib.log
 * Emerging cross-newlib ...                                              [ ok ]
calculate /home/strange #
Ура, все собралось!  :)

То же и с AVR
calculate /home/strange # crossdev -t avr
-                                                                               
 * crossdev version:      20181202
 * Host Portage ARCH:     amd64
 * Target Portage ARCH:   *
 * Target System:         avr
 * Stage:                 3 (C compiler & libc)
 * USE=multilib:          yes
 * ABIs:                  default

 * binutils:              binutils-[latest]
 * gcc:                   gcc-[latest]
 * libc:                  avr-libc-[latest]

 * CROSSDEV_OVERLAY:      /usr/local/portage-crossdev
 * PORT_LOGDIR:           /var/log/portage
 * PORTAGE_CONFIGROOT:    /
 * Portage flags:         
                                                                               
 * leaving sys-devel/binutils in /usr/local/portage-crossdev
 * leaving sys-devel/gcc in /usr/local/portage-crossdev
 * leaving dev-embedded/avr-libc in /usr/local/portage-crossdev
 * leaving sys-devel/gdb in /usr/local/portage-crossdev
 * leaving metadata/layout.conf alone in /usr/local/portage-crossdev
                                                                               
 * Log: /var/log/portage/cross-avr-binutils.log
 * Emerging cross-binutils ...                                            [ ok ]
 * Log: /var/log/portage/cross-avr-gcc-stage1.log
 * Emerging cross-gcc-stage1 ...                                          [ ok ]
 * Log: /var/log/portage/cross-avr-avr-libc.log
 * Emerging cross-avr-libc ...                                            [ ok ]
calculate /home/strange #
На самом деле с AVR не всегда все так просто - иногда не собирается последняя версия binutils или gcc.
Это неприятно, но не катастрофично - достаточно прямо указать какие версии собирать (по умолчанию собирается последняя).
Как вариант, можно попробовать указать сборку стабильной версии - параметр -S
# crossdev -S -t avr


« Последнее редактирование: 19 Февраль 2019, 14:12:16 от Александр »

Оффлайн Александр

  • Модератор
  • *****
  • Сообщений: 141
  • Репутация: 1
  • Мощность альтернативной энергоустановки: 800
Re: Кросс-компиляция
« Ответ #1 : 19 Февраль 2019, 13:28:01 »
Как насчет Raspberry Pi?
https://wiki.gentoo.org/wiki/Raspberry_Pi/Cross_building
В разных источниках рекомендуют
# crossdev -S -v -t armv6j-hardfloat-linux-gnueabi
и
# crossdev -S -v -t armv6j-unknown-linux-gnueabihfОднако в моем случае crossdev версии 20181202 выругался на параметр -v
* UNKNOWN OPTION: '-v'
Usage: crossdev [options] --target TARGET

Options:
    --b, --binutils ver      Specify version of binutils to use
    --g, --gcc ver           Specify version of gcc to use
    --k, --kernel ver        Specify version of kernel headers to use
    --l, --libc ver          Specify version of libc to use
                                Note: versions support depend atom syntaxes:
                                 e.g. ">=2.20" "~4.6.1" "=2.13.1-r3"
    -A, --abis abis          Specify ABIs to build, first one is the default
    --host-abi abi           Specify the ABI of the compiler itself
    --env env                Specify env settings for all packages (see below)
    --[bdgkl]env env         Specify env settings for binutils/gdb/gcc/kernel/libc
                                Note: make sure to quote: 'VAR="some value"\nFOO="cow"'
    -f, --force              I don't need a seat belt!
    -S, --stable             Use latest stable versions as default
    -C, --clean target       Uninstall specified target
    -P, --portage opts       Options to pass to emerge (see emerge(1))
    --with[out]-headers      Build C library headers before C compiler?
    --show-fail-log          If the build fails, dump the failing log

Overlay Options:
    -oS, --overlays list     Space delimited list of overlays to search
                                [default: `portageq repositories_configuration`]
    -oO, --ov-output path    Parent directory of overlay to write crossdev package links
                                [default: uses repo with name 'crossdev', or
                                 'cross-${CTARGET}', or falls back to first
                                 from --overlays list]
    -ob, --ov-binutils path  Overlay for binutils ebuilds [default: search]
    -od, --ov-gdb path       Overlay for gdb ebuilds [default: search]
    -og, --ov-gcc path       Overlay for gcc ebuilds [default: search]
    -ok, --ov-kernel path    Overlay for kernel ebuilds [default: search]
    -ol, --ov-libc path      Overlay for C library ebuilds [default: search]
    -ox, --ov-extra path     Overlay for extra packages [default: search]

Stage Options:
    -s0, --stage0            Build just binutils
    -s1, --stage1            Also build a bare C compiler (no C library/
                                C++/shared GCC libs/C++ exceptions/etc...)
    -s2, --stage2            Also build kernel headers
    -s3, --stage3            Also build the C library
    -s4, --stage4            Also build a full compiler [default]
                                (shared libs GCC/various lang frontends/etc...)

External Tooling Options:
    --show-target-cfg        Display target settings that crossdev will use
    --init-target            Setup config/overlay/etc... files only

Extra Fun (must be run after above stages):
    --ex-only                Skip the stage steps above
    --ex-gcc                 Build extra gcc targets (gcj/ada/etc...)
    --ex-gdb                 Build a cross gdb
    --ex-pkg pkg             Build extra packages (may be used multiple times)

Target (-t) takes a tuple ARCH-VENDOR-OS-LIBC; see 'crossdev -t help'

Без опции -v собрался
calculate /home/strange # crossdev -S -t armv6j-hardfloat-linux-gnueabi
-                                                                               
 * crossdev version:      20181202
 * Host Portage ARCH:     amd64
 * Target Portage ARCH:   arm
 * Target System:         armv6j-hardfloat-linux-gnueabi
 * Stage:                 4 (C/C++ compiler)
 * USE=multilib:          no
 * ABIs:                  default

 * binutils:              binutils-[stable]
 * gcc:                   gcc-[stable]
 * headers:               linux-headers-[stable]
 * libc:                  glibc-[stable]

 * CROSSDEV_OVERLAY:      /usr/local/portage-crossdev
 * PORT_LOGDIR:           /var/log/portage
 * PORTAGE_CONFIGROOT:    /
 * Portage flags:         
                                                                               
 * leaving metadata/layout.conf alone in /usr/local/portage-crossdev
                                                                               
 * Log: /var/log/portage/cross-armv6j-hardfloat-linux-gnueabi-binutils.log
 * Emerging cross-binutils ...                                            [ ok ]
 * Log: /var/log/portage/cross-armv6j-hardfloat-linux-gnueabi-linux-headers-quick.log
 * Emerging cross-linux-headers-quick ...                                 [ ok ]
 * Log: /var/log/portage/cross-armv6j-hardfloat-linux-gnueabi-glibc-headers.log
 * Emerging cross-glibc-headers ...                                       [ ok ]
 * Log: /var/log/portage/cross-armv6j-hardfloat-linux-gnueabi-gcc-stage1.log
 * Emerging cross-gcc-stage1 ...                                          [ ok ]
 * Log: /var/log/portage/cross-armv6j-hardfloat-linux-gnueabi-linux-headers.log
 * Emerging cross-linux-headers ...                                       [ ok ]
 * Log: /var/log/portage/cross-armv6j-hardfloat-linux-gnueabi-glibc.log
 * Emerging cross-glibc ...                                               [ ok ]
 * Log: /var/log/portage/cross-armv6j-hardfloat-linux-gnueabi-gcc-stage2.log
 * Emerging cross-gcc-stage2 ...                                          [ ok ]
calculate /home/strange #

« Последнее редактирование: 19 Февраль 2019, 14:10:18 от Александр »

Оффлайн Александр

  • Модератор
  • *****
  • Сообщений: 141
  • Репутация: 1
  • Мощность альтернативной энергоустановки: 800
Re: Кросс-компиляция
« Ответ #2 : 20 Февраль 2019, 22:28:40 »
Посмотреть, чего же мы понаставили  :)
strange@calculate ~ $ gcc-config -l
 [1] arm-none-eabi-8.2.0 *

 [2] armv6j-hardfloat-linux-gnueabi-7.3.0 *

 [3] avr-8.2.0 *

 [4] x86_64-pc-linux-gnu-7.3.0 *

Хочется работать с комфортом - не вопрос.
Не хочется для простых проектов разбираться с монструозной средой разработки - тоже не проблема.
Легкий, компактный и удобный джин всегда выручит.
# emerge geany
Осталось настроить команды компиляции, сборки и запуска/прошивки.

Для Малины
Компиляция
armv6j-hardfloat-linux-gnueabi-gcc -Wall -c "%f"Сборка для малины
armv6j-hardfloat-linux-gnueabi-gcc -Wall -o "%e" "%f"Ни запустить ни прошить полученный бинарник мы не сможем. Можно на кнопку запуска повесить копирование на целевое устройство, но это как-нибудь в другой раз.

Для AVR В качестве примера возьмем ATmega 328
Компиляция, а заодно и проверка размера занимаемого во flash и RAM
rm -rf *.elf *.hex *.eep *.lss *.map *.o *.d; avr-gcc -mmcu=atmega328 -Wall -gdwarf-2 -std=gnu99 -O1 -funsigned-char -funsigned-bitfields -fshort-enums -fwhole-program -MD -MP -o "%e.o" "%f"; avr-size "%e.o"Уфф, сколько параметров! На самом деле далеко не всем и далеко не все нужны, но тут уж каждый изучает GCC и под свои задачи ваяет. Мне понадобилось вот так. :)
Сборка гораздо проще.
avr-objcopy -O ihex "%e.o" "%e.hex"Ну и прошивка, чтобы не держать лишних консолей и вообще линуксоиды любят комфорт  ;)
avrdude -p m328p -c usbasp -U flash:w:"%e.hex"
« Последнее редактирование: 20 Февраль 2019, 22:56:58 от Александр »

 

Яндекс.Метрика