Собрать современный ARM тулчейн в Linux

Тут многие говорят, что тулчейн собрать сложно, и надо пользоваться готовыми.
Но мне тут понадобился C++11 (потестить с МК компил-тайм оптимизацию и виртуальные функции), и я решил собрать тулчейн.

binutils — 2.24, GCC — 4.8.2, Newlib — 2.1.0, gdb — 7.6.2

Download:

качаем с GNU и распаковываем GCC 4.8.2, binutils 2.24, gdb 7.6.2
качаем redhat и распаковываем newlib 2.1.0
Все версии последние на момент написания статьи
В результате в директории должно оказаться
binutils-2.24/
gcc-4.8.2/
gdb-7.6.2/
newlib-2.1.0/

GNU toolchain:

Важный момент! Сборка должна вестись не в папке с исходниками.
Перед сборкой сделаем парочку общих определений, для того, чтобы если кому зажочется что-то поправить — он мог бы

export MY_DIRS="--prefix='/usr' --libdir='/usr/lib64'"
export MY_DESTDIR="/tmp/pkg"

Если в MY_DESTDIR записать "/", то тулчейн будет установлен в систему, иначе он будет ставится в отдельную папку, откуда стоит собирать пакет и ставить через пакетный менеджер. У меня Slackware, мои шаги по созданию пакетов вам не нужны.
Собираем binutils

mkdir binutils-2.24-build
cd binutils-2.24-build
../binutils-2.24/configure $MY_DIRS --target=arm-none-eabi --disable-nls
make
make install DESTDIR=$MY_DESTDIR

Ставим его, как это принято у вас в дистрибутиве, или идём дальще, если MY_DESTDIR == "/"

Собираем gcc только для C.


mkdir gcc-4.8.2-prebuild
cd gcc-4.8.2-prebuild
BUILD_CC=gcc AR=ar RANLIB=ranlib AS=as LD=ld ../gcc-4.8.2/configure \
         --with-newlib\
         $MY_DIRS \
         --target='arm-none-eabi' \
         --enable-languages=c \
         --disable-shared --disable-nls --disable-libssp \
make
make install DESTDIR=$MY_DESTDIR

Не забываем собрать пакет и поставить собранный пакет в систему.

Собираем newlib.

С newlib красношапачники накосячили в системе сборки, и без патча, исправляющего пути, он не соберётся. У всех бывают ошибки! Я бы мог приложить патч к топику и записать команду, но вместо этого я словами всё объясню
В файле newlib-2.1.0/libgloss/arm/cpu-init/Makefile.in
надо в

tooldir = $(exec_prefix)/$(target_alias)
 
objtype = @objtype@
 
INSTALL = @INSTALL@

добавить после «objtype = @objtype@» «host_makefile_frag = $(srcdir)/../../config/default.mh» чтобы получилось

tooldir = $(exec_prefix)/$(target_alias)
 
objtype = @objtype@
host_makefile_frag = $(srcdir)/../../config/default.mh
 
INSTALL = @INSTALL@

и в

install-info:
clean-info:

Makefile: Makefile.in ../config.status @host_makefile_frag_path@
    $(SHELL) ../config.status --file cpu-init/Makefile

заменить "@host_makefile_frag_path@" на "${host_makefile_frag_path}":

install-info:
clean-info:

Makefile: Makefile.in ../config.status ${host_makefile_frag_path}
    $(SHELL) ../config.status --file cpu-init/Makefile

после чего всё собирётся

mkdir newlib-2.1.0-build
cd newlib-2.1.0-build
CFLAGS_FOR_TARGET="-mthumb -mcpu=cortex-m3" \
         ../newlib-2.1.0/configure 
         $MY_DIRS \
         --target='arm-none-eabi' \
         --with-mode=thumb \
         --enable-multilib \
         --disable-nls \
         --with-gnu-as --with-gnu-ld\
         --enable-interwork \
         --disable-newlib-supplied-syscalls \
         --enable-static-nss 
make
make install DESTDIR=$MY_DESTDIR

Не забываем собрать пакет и поставить собранный пакет в систему.
Собираем финальный gcc.


mkdir gcc-4.8.2-build
cd gcc-4.8.2-build
BUILD_CC=gcc AR=ar RANLIB=ranlib AS=as LD=ld ../gcc-4.8.2/configure \
         --with-newlib\
         $MY_DIRS \
         --target='arm-none-eabi' \
         --enable-languages=c,c++ --disable-multilib \
         --with-newlib \
         --without-headers --disable-shared --disable-libssp --disable-nls \
         --disable-hardfloat --enable-threads=single --with-gnu-as --with-gnu-ld
make
make install DESTDIR=$MY_DESTDIR

Не забываем собрать пакет и поставить собранный пакет в систему.
Собираем gdb.


mkdir gdb-7.6.2-build
cd gdb-7.6.2-build
../gdb-7.6.2/configure \
         $MY_DIRS \
         --target='arm-none-eabi' \
         --enable-interwork --disable-multilib
make
make install DESTDIR=$MY_DESTDIR

Не забываем собрать пакет и поставить собранный пакет в систему.

Для Slackware я написал сложный bash скрипт, делающий всё вышеперечисленное, он доступен у меня на github'е:
github.com/dekar/mkArmToolchain
  • +1
  • 09 января 2014, 17:07
  • dekar

Комментарии (3)

RSS свернуть / развернуть
Для разных версий могут потребоватся разные патчи и подпорки, когда-то это надоест.
0
Конечно да. И авторам вашего тулкита тоже. Но если сам можешь собирать тулчейн — то
1. Застрахован от проблем с д. Васей, что собирает пакеты для ppa
2. Можешь потестить новшества раньше, чем обычно.
3. Лучше понимаешь, что происходит у тебя в проекте.

Хотя тут как кому. Я с этим патчем ебался 3 дня. Если нет 3-х дней — не судьба.
0
Доброе дело! Спасибо!
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.