Прежде чем преступить я объясню некоторые понятия:
- RootFS (рутфс) — это образ файловой системы который монтируется по месту /. Содержит необходимые программы для загрузки и работы ОС Linux, например: fsck, mount, modprobe, fdisk, ifconfig и другие.
- ToolChain (тулчейн) — это набор программ, библиотек и кросс-компиляторов для сборки программ под конкретную платформу.
- Gentoo — почему именно Gentoo? Потому что он у меня уже на ноутбуке :)
И так приступаем, начинаем со сборки тулчейна.
Ставим генератор тулчейнов
$ emerge crossdev
$ crossdev --help
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
-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?
Stage Options:
-s0, --stage0 Build just binutils
-s1, --stage1 Also build a C compiler (no libc/C++)
-s2, --stage2 Also build kernel headers
-s3, --stage3 Also build the C library (no C++)
-s4, --stage4 Also build a C++ compiler [default]
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-insight Build a cross insight
Target (-t) takes a tuple ARCH-VENDOR-OS-LIBC; see 'crossdev -t help'
И так просим crossdev сгенерировать нам тулчейн для такой архитектуры armv5te-iwmmxt-linux-gnueabi, это значит программы собранные этим тулчейом будут работать на процессорах типа armv5te, операции с плавающей точкой будут выполняться через блок iwmmxt (на кпк с процессором PXA27x он есть :) ), работать на операционной системе Linux, в качестве стандартной C библиотеки будет использоваться glibc (gnu)
$ crossdev -t armv5te-iwmmxt-linux-gnueabi --b 2.18-r3 --g 4.1.2 --k 2.6.27-r2 --l 2.7-r2
# или стабильное на данный момент пакеты
$ crossdev -S -t armv5te-iwmmxt-linux-gnueabi
Если у вас что то не собирается попробуйте другую версию и удалите старые результаты сборки /var/tmp/crossdev это может быть причиной ошибок.
После сборки в системе будут установлены такие пакеты:
cross-armv5te-iwmmxt-linux-gnueabi/binutils-2.18-r3
cross-armv5te-iwmmxt-linux-gnueabi/gcc-4.3.2-r3
cross-armv5te-iwmmxt-linux-gnueabi/glibc-2.7-r2
cross-armv5te-iwmmxt-linux-gnueabi/linux-headers-2.6.27-r2
Теперь если вы часто пользуетесь emerge --depclean советую добавить в /var/lib/portage/world выполнением следующих команд:
$ echo cross-armv5te-iwmmxt-linux-gnueabi/binutils >> /var/lib/portage/world
$ echo cross-armv5te-iwmmxt-linux-gnueabi/gcc >> /var/lib/portage/world
$ echo cross-armv5te-iwmmxt-linux-gnueabi/glibc >> /var/lib/portage/world
$ echo cross-armv5te-iwmmxt-linux-gnueabi/linux-headers >> /var/lib/portage/world
Что бы наш тулчейн не удалился (более новые версии crossdev делают это автоматически).
Создадим несколько скриптов
Подержка команды ebuild:
$ vim /usr/local/sbin/armebuild
#!/bin/bash
CBUILD=$(portageq envvar CHOST)
PORTAGE_CONFIGROOT="$SYSROOT"
if [[ "$1" == "--root" ]] ; then
ROOT="$2"
shift 2
else
ROOT="$SYSROOT"
fi
export CBUILD PORTAGE_CONFIGROOT ROOT
ebuild $*
Подержка команды emerge:
$ vim /usr/local/sbin/armemerge
#!/bin/bash
CBUILD=$(portageq envvar CHOST)
PORTAGE_CONFIGROOT="$SYSROOT"
if [[ "$1" == "--root" ]] ; then
ROOT="$2"
shift 2
else
ROOT="$SYSROOT"
fi
export CBUILD PORTAGE_CONFIGROOT ROOT
emerge $*
поддержка команды make (сборка ядра для кпк):
$ vim /usr/local/sbin/armmake
#!/bin/bash
make ARCH="arm" CROSS_COMPILE="armv5te-iwmmxt-linux-gnueabi-" $*
А также этот:
$ vim /usr/local/sbin/armquickokg
#!/bin/bash
CBUILD=$(portageq envvar CHOST)
PORTAGE_CONFIGROOT="$SYSROOT"
if [[ "$1" == "--root" ]] ; then
ROOT="$2"
shift 2
else
ROOT="$SYSROOT"
fi
export CBUILD PORTAGE_CONFIGROOT ROOT
quickpkg $*
Готово! Теперь armemerge работает как emerge только в режиме кросс компиляции. Подготовим $SYSROOT для работы и позаботитесь о том что бы в $SYSROOT/armv5te-iwmmxt-linux-gnueabi было достаточно места для разворачивания нашей рутфс
$ export SYSROOT=/usr/armv5te-iwmmxt-linux-gnueabi
$ mkdir -p $SYSROOT/{etc,dev,usr}
Инициализируем каталог устройств:
$ emerge makedev
$ cd $SYSROOT/dev
$ MAKEDEV -v generic -d .
Создадим ссылку на portage, укажем профиль:
$ ln -s /usr/portage $SYSROOT/usr/portage
$ cd $SYSROOT/etc
$ ln -s /usr/portage/profiles/default/linux/arm/10.0 make.profile
И на последок создадим файл make.conf:
$ vim $SYSROOT/etc/make.conf
CFLAGS="-O2 -march=armv5te -mtune=iwmmxt -fomit-frame-pointer"
CXXFLAGS="${CFLAGS}"
CTARGET="armv5te-iwmmxt-linux-gnueabi"
CHOST="armv5te-iwmmxt-linux-gnueabi"
CBUILD="i686-pc-linux-gnu"
ACCEPT_KEYWORDS="arm"
ARCH="arm"
MAKEOPTS="-j1"
PORTAGE_NICENESS="19"
PORTAGE_IONICE_COMMAND="ionice -c 1 -n 7 -p \${PID}"
USE="static -fortran -mudflap -ipv6 -openmp"
GENTOO_MIRRORS="http://www.kaa.org.ua/ ftp://ftp.linux.kiev.ua/pub/Linux/Gentoo/distfiles/"
LINGUAS="ua uk ru en"
Пробуем
$ armemerge -NDu world -p
These are the packages that would be merged, in order:
Calculating dependencies... done!
[ebuild R ] sys-apps/coreutils-6.9-r1 to /usr/armv5te-iwmmxt-linux-gnueabi/
...