Как получить тулчейны

Опубликовано Sergey Worm - вт, 06/05/2018 - 15:12

Проекты на основе WrmOS могут быть собраны любым тулчейном, основанном на GCC. Используемый тулчейн определяется в конфигурационном файле проекта. Поскольку WrmOS спроектирована для встраимых проектов, эта статье описывает как получить кроссплатформенные тулчейны.

Существует 2 способа получить тулчейн:

  • загрузить собранный тулчейн;
  • собрать тулчейн из исходников.
Содержание
1. Загрузка тулчейнов
2. Сборка тулчейнов из исходников
2. Сборка libm из исходников

1. Загрузка тулчейнов [наверх]


  1. Загрузить архив с собранным тулчейном:
  2. Извлечь содержимое архива и переместить его в директорию для установки (например ~/toolchain/).
  3. Добавить путь к тулчейну в своё окружение (см. шаг 2.7 ниже в пошаговом руководстве).

2. Сборка тулчейнов из исходников [up]


Наиболее простой способ получить кроссплатформенный тулчейн - это использовать проект Buildroot. Ниже приведено пошаговое руководство как загрузить и собрать тулчейн. Это руководство общее для всех архитектур процессора. Различия отмечены дополнительно. При этом слово $ARCH должно быть изменено на целевую архитектуру.

Пошаговая инструкция

2.1. Клонировать git-репозиторий Buildroot:

git clone git://git.buildroot.net/buildroot
cd buildroot

2.2. Переключить состояние репозитория на последний релиз (используйте "git tag" чтобы увидеть список тагов):

git checkout 2018.02.2

2.3. Выбрать базовую конфигурацию (этот шаг архитектуро-зависимый):

SPARCv8:  make qemu_sparc_ss10_defconfig
ARM:      make qemu_arm_vexpress_defconfig
x86:      make qemu_x86_defconfig
x86_64:   make qemu_x86_64_defconfig

2.4. Настроить конфигурацию:

make menuconfig
    Build options --> libraries --> both static and shared
    Toolchain --> Enable WCHAR support
    Toolchain --> GCC compiler Version --> gcc 7.x
    Toolchain --> Enable C++ support --> on
    Toolchain --> Enable compiler link-time-optimization support --> on
    Toolchain --> Build cross gdb for the host --> on
    Target packages --> Libraries --> Other --> boost --> on
    Target packages --> Libraries --> Other --> boost-filesystem --> on
    Target packages --> Libraries --> Other --> boost-system --> on

2.5. Запустить сборку (это может занять несколько минут):

make toolchain host-gdb boost

2.6. Скопировать рузультат сборки в директорию для установки (например ~/toolchains/):

# ARCH = sparc | arm | i686 | x86_64
cp -r output/host/ ~/toolchains/$ARCH-buildroot-linux-uclibc_br2018.02.2_gcc7.3.0

2.7. Добавить путь к тулчейну в своё окружение:

# ARCH = sparc | arm | i686 | x86_64
vi ~/.bashrc
    a) add line "PATH=$PATH:~/toolchains/$ARCH-buildroot-linux-uclibc_br2018.02.2_gcc7.3.0/usr/bin"
    b) exit from vi
source ~/.bashrc

2.8. Проверить установку:

# ARCH = sparc | arm | i686 | x86_64
$ARCH-linux-gcc --version
$ARCH-linux-gcc.br_real (Buildroot 2018.02.2) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Всё готово. Сейчас вы можете использовать "gccprefix = $ARCH-linux-" в своеём конфигурационном файле проекта.

Чтобы пересобрать тулчейн для другой процессорной архитектуре необходимо выполнить:

  1. make clean
  2. go to step 2.3.

Краткая инструкция

1.  git clone git://git.buildroot.net/buildroot
2.  cd buildroot
3.  git checkout 2018.02.2
4.  sparcv8:  make qemu_sparc_ss10_defconfig
        arm:  make qemu_arm_vexpress_defconfig
        x86:  make qemu_x86_defconfig
     x86_64:  make qemu_x86_64_defconfig
5.  make menuconfig
    Build options --> libraries --> both static and shared
    Toolchain --> Enable WCHAR support
    Toolchain --> GCC compiler Version --> gcc 7.x
    Toolchain --> Enable C++ support --> on
    Toolchain --> Enable compiler link-time-optimization support --> on
    Toolchain --> Build cross gdb for the host --> on
    Target packages --> Libraries --> Other --> boost --> on
    Target packages --> Libraries --> Other --> boost-filesystem --> on
    Target packages --> Libraries --> Other --> boost-system --> on
6.  make toolchain host-gdb boost
7.  # install
    sparcv8:  cp -r output/host/ ~/toolchains/sparc-buildroot-linux-uclibc_br2018.02.2_gcc7.3.0
    arm:      cp -r output/host/ ~/toolchains/arm-buildroot-linux-uclibc_br2018.02.2_gcc7.3.0
    x86:      cp -r output/host/ ~/toolchains/i686-buildroot-linux-uclibc_br2018.02.2_gcc7.3.0
    x86_64:   cp -r output/host/ ~/toolchains/x86_64-buildroot-linux-uclibc_br2018.02.2_gcc7.3.0
8.  # add to ~/.bashrc
    sparcv8:  PATH=~/toolchains/sparc-buildroot-linux-uclibc_br2018.02.2_gcc7.3.0/usr/bin:$PATH
    arm:      PATH=~/toolchains/arm-buildroot-linux-uclibc_br2018.02.2_gcc7.3.0/usr/bin:$PATH
    x86:      PATH=~/toolchains/i686-buildroot-linux-uclibc_br2018.02.2_gcc7.3.0/usr/bin:$PATH
    x86_64:   PATH=~/toolchains/x86_64-buildroot-linux-uclibc_br2018.02.2_gcc7.3.0/usr/bin:$PATH
9.  source ~/.bashrc

# NOTE:  to re-build toolchain for other processor architecture do:
#        a) make clean
#        b) go to step 4

3. Сборка libm из исходников [наверх]


Ядро WrmOS и системное ПО (sigma0, alpha) не нуждаются в библиотеке libm. Однако, если вым необходимо линковаться с  libm, пожалуйста, прочтите заметки ниже.

К сожалению, последнии версии uClibc переместили содержимое libm в libc. Это не подходит для кросс-компиляции для WrmOS. Чтобы получить отдельную libm, необходимо собрать предыдущую версию uClibc (buildroot 16.08.1 has uClibc version 1.0.17). Ниже приведено пошаговое руководство как загрузить и собрать libm. Это руководство общее для всех архитектур процессора. Различия отмечены дополнительно. При этом слово $ARCH должно быть изменено на целевую архитектуру.

Пошаговая инструкция

3.1. Клонировать git репозиторий Buildroot:

git clone git://git.buildroot.net/buildroot
cd buildroot

Если вы уже имеете клонированный репозиторий, то выполните в нём:

make clean

3.2. Переклчите состояние репозитория на тэг 2016.08.1:

git checkout 2016.08.1

3.3. Выберите конфигурацию по умолчанию, чтобы базироваться на ней (this step is architecture depended):

SPARCv8:  make qemu_sparc_ss10_defconfig
ARM:      make qemu_arm_vexpress_defconfig
x86:      make qemu_x86_defconfig
x86_64:   make qemu_x86_64_defconfig

3.4. Запустите сборку (это может занять несколько минут):

make toolchain

3.5. Сопируйте результат в установочную директорию (например ~/toolchains/):

# ARCH = sparc | arm | i686 | x86_64
cp output/build/uclibc-1.0.17/lib/libm.a ~/toolchains/$ARCH-buildroot-linux-uclibc_br2018.02.2_gcc7.3.0/$ARCH_uclibc-1.0.17_libm.a
cd ~/toolchains/$ARCH-buildroot-linux-uclibc_br2018.02.2_gcc7.3.0
ln -s $ARCH_uclibc-1.0.17_libm.a libm.a
cd -

3.6. Использование libm:

Чтобы указать libm в мэйкфайле при сборе WrmOS исползуйте следующий путь:

$(shell $(gccprefix)gcc -print-sysroot)../../libm.a

Чтобы пересобрать libm для дугой процессорной архитектуры выполните:

  1. make clean
  2. go to step 3.3.

Краткая инструкция

1.  git clone git://git.buildroot.net/buildroot
2.  cd buildroot
3.  git checkout 2016.08.1
4.  sparcv8:  make qemu_sparc_ss10_defconfig
        arm:  make qemu_arm_vexpress_defconfig
        x86:  make qemu_x86_defconfig
     x86_64:  make qemu_x86_64_defconfig
5.  make toolchain
6.  # install
    sparcv8:  cp output/build/uclibc-1.0.17/lib/libm.a ~/toolchains/sparc-buildroot-linux-uclibc_br2018.02.2_gcc7.3.0/sparc_uclibc-1.0.17_libm.a
              cd ~/toolchains/sparc-buildroot-linux-uclibc_br2018.02.2_gcc7.3.0
              ln -s sparc_uclibc-1.0.17_libm.a libm.a
              cd -
    arm:      cp output/build/uclibc-1.0.17/lib/libm.a ~/toolchains/arm-buildroot-linux-uclibc_br2018.02.2_gcc7.3.0/arm_uclibc-1.0.17_libm.a
              cd ~/toolchains/arm-buildroot-linux-uclibc_br2018.02.2_gcc7.3.0
              ln -s arm_uclibc-1.0.17_libm.a libm.a
              cd -
    x86:      cp output/build/uclibc-1.0.17/lib/libm.a ~/toolchains/i686-buildroot-linux-uclibc_br2018.02.2_gcc7.3.0/i686-uclibc-1.0.17_libm.a
              cd ~/toolchains/i686-buildroot-linux-uclibc_br2018.02.2_gcc7.3.0
              ln -s i686_uclibc-1.0.17_libm.a libm.a
              cd -
    x86_64:   cp output/build/uclibc-1.0.17/lib/libm.a ~/toolchains/x86_64-buildroot-linux-uclibc_br2018.02.2_gcc7.3.0/x86_64_uclibc-1.0.17_libm.a
              cd ~/toolchains/x86_64-buildroot-linux-uclibc_br2018.02.2_gcc7.3.0
              ln -s x86_64_uclibc-1.0.17_libm.a libm.a
              cd -
8.  # using in WrmOS Makefile's:
    $(shell $(gccprefix)gcc -print-sysroot)../../libm.a

# NOTE:  to re-build libm for other processor architecture do:
#        a) make clean
#        b) go to step 4