Как собрать свою RootFS на базе Gentoo для кпк

Прежде чем преступить я объясню некоторые понятия:

  • 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/
...