Самостоятельная сборка 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 *
|
Всё!
|