[[gentoo-on-n8x0:|back]]
====== Initial cross-bootstrap ======
**Read this if you want to know how I ported Gentoo and/or want to do it yourself.**
First I tried using [[http://dev.gentoo.org/~armin76/arm/|existing arm OABI stages]]. Two problems. You'll immediately hit [[http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=462677|#462677]]. That can possibly be fixed by using kernel >=2.6.25. However one of my goals is minimal intervention in device preinstalled software (initfs, kernel, maemo image). Second: although Gentoo has [[http://www.gentoo.org/doc/en/change-chost.xml|some documented way]] of changing CHOST, I don't believe it is possible to perform OABI->EABI migration. Correct me if I'm wrong.
Another interesting approach is to convert maemo image into Gentoo using [[http://dev.gentoo.org/~vapier/bootstrap-portage|bootstrap-portage]] script.
Alternatively, Gentoo could be built from scratch using [[http://www.linuxfromscratch.org/|LFS]] approach. However this may be hard because of busybox. Actually I managed to build full GNU stack (coreutils, diffutils, etc) to /usr/local on vanilla maemo.
Anyway, I chose cross-compilation.
===== Requirements =====
* existing gentoo installation
* n8x0 tablet
* 4gb sd card
* luck
* free time
===== Step 1, cross-build minimal working system =====
Install cross-development tools:
emerge crossdev crossdev-wrappers
Build cross-toolchain:
crossdev -S armv6j-unknown-linux-gnueabi
Create convenient cross-portage infrastructure:
emerge-wrapper --init
Change profile from busybox to fully-powered GNU utils:
rm /usr/armv6j-unknown-linux-gnueabi/etc/make.profile
ln -s /usr/portage/profiles/default/linux/arm/10.0/ /usr/armv6j-unknown-linux-gnueabi/etc/make.profile
Tweak make.conf:
nano /usr/armv6j-unknown-linux-gnueabi/etc/make.conf
My tweaks:
* Remove ~arm from ACCEPT_KEYWORDS((I prefer running stable branch and add ~arch keywords on a per-package basis))
* USE='-* zlib minimal unicode ncurses'
* Set CFLAGS (see [[gentoo-on-n8x0:cflags|CFLAGS page]])
* Remove FEATURES, VIDEO_CARDS, INPUT_DEVICES, USE_EXPAND and UCLIBC_CPU_DEFAULT
Try to cross-build mininal system (I hope it will pass successfully one day):
emerge-armv6j-unknown-linux-gnueabi -vND system
Los of stuff builds, but libperl fails. It won't build. At all. Even don't try. Emerge all remaining packages that don't depend on libperl with ''--oneshot''.
So. We have minimal gentoo system (without perl).
===== Step 2, chroot into Gentoo on device, perform full native rebuild =====
From your tablet:
Transfer gentoo from build machine:
cd /path/to/gentoo/chroot &&\
ssh root@ 'cd /usr/armv6j-unknown-linux-gnueabi && tar -czp * -O -' | tar -xvzp
Mount misc system stuff into chroot:
cd /path/to/gentoo/chroot &&\
mount -t proc proc proc &&\
mount -o bind /dev dev &&\
cp -L /etc/resolv.conf etc/resolv.conf
Enter chroot:
chroot /path/to/gentoo/chroot /bin/bash
Wooo-haaa! You're inside your n8x0 gentoo installation!
Remove cross-build related stuff from make.conf (see [[gentoo-on-n8x0:cflags|CFLAGS page]]):
cat > /etc/make.conf << 'EOF'
CHOST='armv6j-unknown-linux-gnueabi'
CFLAGS='-Os -pipe -march=armv6j -mtune=arm1136jf-s -mfpu=vfp'
CXXFLAGS='${CFLAGS}'
USE='-* zlib minimal unicode ncurses'
EOF
Sync portage tree:
emerge --sync
Build missing stuff from 'system':
emerge -v1 automake
Check that all 'system' built:
emerge -vuND system
Rebuild bash (I got strange failures without this):
emerge -v1 bash
Tweak USE flags in make.conf. I set USE='-ipv6 -fortran'
Reemerge natively gcc/glibc (~15 hours using 'performance' cpu governor). Do not forget to plug in battery charger.
Rebuild natively whole world.
emerge -ve system
Profit! You have fully-functional native arm gentoo chroot.