главная->Тион-Про-270->Сборка toolchain-a 
    

Самостоятельная сборка toolchain-a


Toolchain - это набор программ, необходимых для создания других программ. Мы обычно говорим, что для написания программы нужен компилятор. Это правильно, но компилятор сам по себе может состоять из нескольких исполняемых файлов, например: препроцессор, собственно компилятор, линкер, удаляльщик отладочной информации и т.д..
Вот это всё и есть toolchain.

Обычно мы пишем программу на той же машине, на которой она будет работать... Но это не касается разработки ПО для встраиваемых систем. Здесь всегда используется так называемый кросс-компилятор. Т.е. работает он на одной платформе, а производимый им код будет работать на другой.

В Linux есть свой родной toolchain под названием GCC. Он всем хорош, но вы не сможете с помощью GCC для PC писать программы для АРМ-ов. Поэтому надо заполучить кросс-компилятор. Можно его скачать, а можно собрать из исходников. Это не так сложно, как может показаться на первый взгляд.

В любом случае - собирать его из исходников - очень правильно, т.к. фактически вы можете собрать toolchain для ARM-9 под любой комп, на котором есть GCC. Кроме того, это очень полезный опыт, т.к. для некоторых платформ готовый toolchain скачать может оказаться совсем трудно.

Чтоб облегчить процесс сборки группы энтузиастов собрали специальные наборы скриптов и make-файлов, которые умеют самособираться. Т.е. скачав такой набор, размером порядка сотен килобайт и запустив его на самосборку вы получаете на выходе гигабайта 2-3 исходников вместе с готовым компилятором. Естественно, он не порождает новую информацию, просто этот набор скачивает необходимые исходники из интернета. И после этого компилирует их. Здесь будет рассмотрен дистрибутив Pengutronix.

Предупреждаю сразу, что если вы не хотите, то можете скачать готовый toolchain. Но если вы будете и далее пытаться повторить то, что здесь будет написано, то необходимые действия могут слегка отличаться от здесь описанных. Кроме того, по ходу компиляции мы столкнёмся с несколькими сообщениями об ошибках, которые устранятся путем доустановки в ваш PC-шный Linux соответствующих пакетов. Соответственно при последующей компиляции мы с этими ошибками уже не столкнёмся, а вы можете, если скачаете готовый тулчейн. Так что решайте сами. Готовый toolchain находится здесь - устанавливать его рекомендуется в директорию /opt

Итак, собственно описание процесса сборки:

Идём на http://www.pengutronix.de/oselas/toolchain/index_en.html, нам в принципе нужен toolchain arm-xscale-linux-gnu, версия 1.1.1, но эта таблица очень полезна для того, чтоб понять, сколько разных видов может быть и какие признаки формируют такое многообразие toolchain-ов (отсюда, кстати, понятно становится, что выгоднее каждый раз собирать его под задачу, чем пытаться заранее скачать разные на все случаи жизни).

Идём на http://www.oselas.com/oselas/toolchain/download/ и качаем http://www.oselas.com/oselas/toolchain/download/OSELAS.Toolchain-1.1.1.tar.bz2 он маленький, т.к. будет докачивать всё необходимое по мере сборки.

Я создал директории ~/Proj/OSELAS-toolchain1.1.1 на своей машине и перенёс туда только что скаченный архив, зашел туда, разархивирую такой командой:
timur-tion@timur-ibm:~/Proj/OSELAS-toolchain1.1.1$ tar xjf OSELAS.Toolchain-1.1.1.tar.bz2



Как собирать toolchain написано здесь: http://www.ptxdist.org/software/geode/GeoTerm-Quickstart.pdf на странице 10.

timur-tion@timur-ibm:~/Proj/OSELAS-toolchain1.1.1/OSELAS.Toolchain-1.1.1$ cd /opt/
timur-tion@timur-ibm:/opt$ ls
timur-tion@timur-ibm:/opt$ mkdir OSELAS.Toolchain-1.1.1
timur-tion@timur-ibm:/opt$ sudo mkdir OSELAS.Toolchain-1.1.1
[sudo] password for timur-tion: 
timur-tion@timur-ibm:/opt$ sudo chmod a+rwx OSELAS.Toolchain-1.1.1/
timur-tion@timur-ibm:/opt$ 

возвращаемся в ~/Proj/OSELAS-toolchain1.1.1
timur-tion@timur-ibm:~/Proj/OSELAS-toolchain1.1.1/OSELAS.Toolchain-1.1.1$ ptxdist select
bash: ptxdist: command not found



вспоминаем, что для компиляции toolchain-a нам всё-таки нужен сам ptxdist (сокращение от PenguTroniX Distributive) и он должен быть установлен.
http://www.pengutronix.de/software/ptxdist/index_en.html
http://www.pengutronix.de/software/ptxdist/download/
http://www.pengutronix.de/software/ptxdist/download/v1.0/
сохранил это: http://www.pengutronix.de/software/ptxdist/download/v1.0/ptxdist-1.0.2.tgz в ~/Proj/ptxdist/ затем:
timur-tion@timur-ibm:~/Proj/ptxdist$ tar xf ptxdist-1.0.2.tgz 
timur-tion@timur-ibm:~/Proj/ptxdist$ ls
ptxdist-1.0.2  ptxdist-1.0.2.tgz
timur-tion@timur-ibm:~/Proj/ptxdist$ cd ptxdist-1.0.2/
timur-tion@timur-ibm:~/Proj/ptxdist/ptxdist-1.0.2$ ls
autoconf    config        CREDITS        INSTALL          rules
autogen.sh  configure     debian         Makefile.in      scripts
bin         configure.ac  Documentation  README           tests
ChangeLog   COPYING       generic        REVISION_POLICY  TODO

прочитал README

Цитирую: In order to build ptxdist, you need three archives: ptxdist-.tgz (mandatory) ptxdist--patches.tgz (mandatory) ptxdist--projects.tgz (optional) скачал с http://www.pengutronix.de/software/ptxdist/download/v1.0/ в ~/Proj/ptxdist/
http://www.pengutronix.de/software/ptxdist/download/v1.0/ptxdist-1.0.0-projects.tgz
http://www.pengutronix.de/software/ptxdist/download/v1.0/ptxdist-1.0.2-patches.tgz

обращаю внимание, что проекты(projects) под версию 1.0.0 !!!

Вот что имеем:
timur-tion@timur-ibm:~/Proj/ptxdist$ ls
ptxdist-1.0.0-projects.tgz  ptxdist-1.0.2-patches.tgz
ptxdist-1.0.2               ptxdist-1.0.2.tgz

разархивируем там же проекты и патч
timur-tion@timur-ibm:~/Proj/ptxdist$ tar xf ptxdist-1.0.2-patches.tgz 
timur-tion@timur-ibm:~/Proj/ptxdist$ tar xf ptxdist-1.0.0-projects.tgz 
timur-tion@timur-ibm:~/Proj/ptxdist$ ls
ptxdist-1.0.0               ptxdist-1.0.2              ptxdist-1.0.2.tgz
ptxdist-1.0.0-projects.tgz  ptxdist-1.0.2-patches.tgz

Заходим внутрь ptxdist-a версии 1.0.0, где лежат только проекты и переносим их в 1.0.2:
timur-tion@timur-ibm:~/Proj/ptxdist$ cd ptxdist-1.0.0
timur-tion@timur-ibm:~/Proj/ptxdist/ptxdist-1.0.0$ ls
projects
timur-tion@timur-ibm:~/Proj/ptxdist/ptxdist-1.0.0$ cp -r  projects/ ../ptxdist-1.0.2

наша директория, с которой будем работать: ptxdist-1.0.2, вот что в ней:
timur-tion@timur-ibm:~/Proj/ptxdist/ptxdist-1.0.0$ cd ../ptxdist-1.0.2/
timur-tion@timur-ibm:~/Proj/ptxdist/ptxdist-1.0.2$ ls
autoconf    config        CREDITS        INSTALL      README           tests
autogen.sh  configure     debian         Makefile.in  REVISION_POLICY  TODO
bin         configure.ac  Documentation  patches      rules
ChangeLog   COPYING       generic        projects     scripts

Ещё раз RTFM!!!
timur-tion@timur-ibm:~/Proj/ptxdist/ptxdist-1.0.2$ gedit README &

ключевая информация вот:
Installation
------------

To install PTXdist, just run

    ./configure --prefix=< installpath>

to configure the packet, then

    make

to build everything and

    make install

to install it. When you start using PTXdist, make sure your $PATH
environment variable points to /bin, because that's where
the ptxdist frontend program is being installed to.
В последнем предложении имеется в виду не директория /bin корневого каталога, а директория bin каталога, указанного в качестве целевого в < installpath>

сделал:
timur-tion@timur-ibm:~/Proj/ptxdist/ptxdist-1.0.2$ ./configure --prefix=/home/timur-tion/Proj/ptxdist

Ошибка! GCC не может создать исполняемый файл...

сделал:
timur-tion@timur-ibm:~/Proj/ptxdist/ptxdist-1.0.2$ sudo apt-get install build-essential


затем:
timur-tion@timur-ibm:~/Proj/ptxdist/ptxdist-1.0.2$ ./configure --prefix=/home/timur-tion/Proj/ptxdist
configure: error: Cannot find ncurses.h. Please install the ncurses development packet.


установил пакет libncurses5-dev (командой sudo apt-get install libncurses5-dev)

timur-tion@timur-ibm:~/Proj/ptxdist/ptxdist-1.0.2$ ./configure --prefix=/home/timur-tion/Proj/ptxdist
checking awk version... configure: error: we need GNU awk

установил пакет gawk

сделал:
timur-tion@timur-ibm:~/Proj/ptxdist/ptxdist-1.0.2$ ./configure --prefix=/home/timur-tion/Proj/ptxdist
configure: error: (f)lex could not be found, please install

далее также из-за ошибок установил пакеты flex, bison, expect 5.43.0-14, в итоге:
timur-tion@timur-ibm:~/Proj/ptxdist/ptxdist-1.0.2$ ./configure --prefix=/home/timur-tion/Proj/ptxdist
......................................

ptxdist version 1.0.2 configured.
Using '/home/timur-tion/Proj/ptxdist' for installation prefix.

Report bugs to ptxdist@pengutronix.de

ptxdist сконфигурирован.

теперь собственно сборка:
timur-tion@timur-ibm:~/Proj/ptxdist/ptxdist-1.0.2$ ls
autoconf    config.log     CREDITS        Makefile     REVISION_POLICY
autogen.sh  config.status  debian         Makefile.in  rules
bin         configure      Documentation  patches      scripts
ChangeLog   configure.ac   generic        projects     tests
config      COPYING        INSTALL        README       TODO
timur-tion@timur-ibm:~/Proj/ptxdist/ptxdist-1.0.2$ make

gcc -O0 -Wall -g -fPIC -c mconf.c -o mconf.o
gcc  mconf.o zconf.tab.o -o mconf
make[1]: Leaving directory `/home/timur-tion/Proj/ptxdist/ptxdist-1.0.2/scripts/kconfig'
done.

ptxdist построен, нужно проинсталлировать, многоточием показано, что часть вывода здесь опущена
timur-tion@timur-ibm:~/Proj/ptxdist/ptxdist-1.0.2$ make install
.....................
./projects/OSELAS.BSP-Pengutronix-GenericI586Glibc-3/kernelconfig.native
./config.log
./.done
./config.status
./Makefile
timur-tion@timur-ibm:~/Proj/ptxdist/ptxdist-1.0.2$ 

ptxdist проинсталлирован. Продолжаем строить toolchain.

заходим в папку с исходниками:
timur-tion@timur-ibm:~/Proj/ptxdist/ptxdist-1.0.2$ cd ../../
hello/                 OSELAS-toolchain1.1.1/ ptxdist/
timur-tion@timur-ibm:~/Proj/ptxdist/ptxdist-1.0.2$ cd ../../OSELAS-toolchain1.1.1/OSELAS.Toolchain-1.1.1/
timur-tion@timur-ibm:~/Proj/OSELAS-toolchain1.1.1/OSELAS.Toolchain-1.1.1$ 

сейчас ВАЖНО!!! Мы выбираем конфиг, по которому будем строить наш тулчейн.
нам нужен вот этот: arm-xscale-linux-gnu_gcc-4.0.4_glibc-2.3.6_linux-2.6.17.ptxconfig

делаем:
timur-tion@timur-ibm:~/Proj/OSELAS-toolchain1.1.1/OSELAS.Toolchain-1.1.1$ ptxdi
st select ptxconfigs/arm-xscale-linux-gnu_gcc-4.0.4_glibc-2.3.6_linux-2.6.17.ptx
config

bash: ptxdist: command not found


вспоминаем, что забыли в путь прописать путь к ptx (в мануале было написано, что надо).

timur-tion@timur-ibm:~/Proj/OSELAS-toolchain1.1.1/OSELAS.Toolchain-1.1.1$ export PATH=$PATH:/home/timur-tion/Proj/ptxdist/bin
timur-tion@timur-ibm:~/Proj/OSELAS-toolchain1.1.1/OSELAS.Toolchain-1.1.1$ ptxdis
t select ptxconfigs/arm-xscale-linux-gnu_gcc-4.0.4_glibc-2.3.6_linux-2.6.17.ptxc
onfig 

ptxdist: linking ptxconfigs/arm-xscale-linux-gnu_gcc-4.0.4_glibc-2.3.6_linux-2.6
.17.ptxconfig to ptxconfig
ptxdist: done.

Выбрали. Дальше по документу http://www.ptxdist.org/software/geode/GeoTerm-Quickstart.pdf мы должны:
timur-tion@timur-ibm:~/Proj/OSELAS-toolchain1.1.1/OSELAS.Toolchain-1.1.1$ ptxdist go

он начал долго-долго теперь что-то качать и компилировать... заняло около часа на IBM X40 (Centrino 1.2GHz,1.5 Gb RAM)
timur-tion@timur-ibm:~/Proj/OSELAS-toolchain1.1.1/OSELAS.Toolchain-1.1.1$ ls /op
t/OSELAS.Toolchain-1.1.1/arm-xscale-linux-gnu/gcc-4.0.4-glibc-2.3.6-kernel-2.6.17/bin/
arm-xscale-linux-gnu-addr2line  arm-xscale-linux-gnu-g++        arm-xscale-linux-gnu-gdbtui   arm-xscale-linux-gnu-readelf
arm-xscale-linux-gnu-ar         arm-xscale-linux-gnu-gcc        arm-xscale-linux-gnu-ld       arm-xscale-linux-gnu-run
arm-xscale-linux-gnu-as         arm-xscale-linux-gnu-gcc-4.0.4  arm-xscale-linux-gnu-nm       arm-xscale-linux-gnu-size
arm-xscale-linux-gnu-c++        arm-xscale-linux-gnu-gccbug     arm-xscale-linux-gnu-objcopy  arm-xscale-linux-gnu-strings
arm-xscale-linux-gnu-c++filt    arm-xscale-linux-gnu-gcov       arm-xscale-linux-gnu-objdump  arm-xscale-linux-gnu-strip
arm-xscale-linux-gnu-cpp        arm-xscale-linux-gnu-gdb        arm-xscale-linux-gnu-ranlib   ptxconfig
timur-tion@timur-ibm:~/Proj/OSELAS-toolchain1.1.1/OSELAS.Toolchain-1.1.1$ 

делаем заморозку toolchain-a:
timur-tion@timur-ibm:/opt/OSELAS.Toolchain-1.1.1$ sudo chown -R root *
[sudo] password for timur-tion: 
timur-tion@timur-ibm:/opt/OSELAS.Toolchain-1.1.1$ sudo chmod a-w -R *

Всё!

Используются технологии uCoz