Project:Android/build

From Gentoo Wiki
Jump to:navigation Jump to:search

It is posible to build Gentoo RAP on your Android device from scratch. Actually, the precompiled tarball is itself made like this.

Warning
This guide is for development only, you are assumed to be familiar with Gentoo, Prefix, and toolchain

A working Gentoo is needed to follow this guide.

The target prefix directory EPREFIX is assumed to be /data/gentoo. The target architecture CTARGET is assumed to be armv7a-hardfloat-linux-gnueabi.

Compiler

If, as usually the case, no compiler is available on the device, you'll need to cross compile one. It is often useful to get the compiler into the EPREFIX as well, which is a process of cross triplet-prefix.

Cross triplet refers to the normal cross compiling as covered by the Embedded Handbook. While cross prefix in Prefix project is to build a package from an existing Gentoo instance into a different prefix. Cross triplet-prefix is doing the two things at once.

Prepare cross toolchain

Follow the corresponding session of Embedded Handbook.

Cross build

Follow the cross triplet counterpart, make sure to use an appropriate RAP profile, and preferably, turn off the nls and acl USE flags. In addition the new EPREFIX should be exported.

user $export EPREFIX=/data/gentoo

Make sure to export EPREFIX again upon opening a new shell.

Kernel headers and glibc

user $armv7a-hardfloat-linux-gnueabi-emerge sys-kernel/linux-headers sys-libs/glibc

Tune cross toolchain

ELFs needs to point to the dynamic linker in EPREFIX. Cross toolchain, which by default does not respect EPREFIX, should be tuned. It is done by tweaking specs file. An helper script rt-sysroot eases the tweaking.

FILE rt-sysrootruntime sysroot tuner
#!/usr/bin/env bash

: ${CTARGET:=$(portageq envvar CHOST)}
: ${BPREFIX:=$(portageq envvar PORTAGE_CONFIGROOT)}
: ${EPREFIX:=$(portageq envvar EPREFIX)}

specs_path=$(dirname $(${CTARGET}-gcc -print-libgcc-file-name))/specs
ROOT=${BPREFIX}usr/${CTARGET}${EPREFIX}/
osd=$(${CTARGET}-gcc -print-multi-os-directory)

std_path(){
        [[ -e $1 ]] || mkdir -p $1
        echo $(realpath $1)
}

dlprefix=$(std_path ${ROOT}lib/${osd})
libprefix=$(std_path ${ROOT}usr/lib/${osd})

${CTARGET}-gcc -dumpspecs | sed -r \
        -e "s,[^:]*(/lib/ld-linux[^.]*\.so(.[:digit:]+)?),${EPREFIX}\1,g" \
        -e "/^\*self_spec:/{n;s,$, -I${ROOT}usr/include -L${libprefix} -L${dlprefix},;}" \
        > ${specs_path}

echo "writing to ${specs_path}
set runtime sysroot to: ${EPREFIX}
compile time sysroot to: ${ROOT}"

The helper essentially let the cross compiler search for the headers and libraries in ${ROOT}/${EPREFIX} and point the interpreter field of ELFs to the dynamic linker inside EPREFIX.

Run the script:

user $CTARGET=armv7a-hardfloat-linux-gnueabi ./rt-sysroot

binutils and gcc

Build everything else:

user $armv7a-hardfloat-linux-gnueabi-emerge sys-devel/gcc sys-devel/binutils

Now you have a functioning native toolchain inside EPREFIX for the target device, copy the ROOT directory over the target device and test out.

Bootstrap

The remaining process is essentially bootstraping a Gentoo RAP into EPREFIX.

On the target device with a compiler in PATH, get the bootstrap script and execute it:

user $chmod 755 bootstrap-prefix.sh
user $./bootstrap-prefix.sh

Follow the prompts, give the correct EPREFIX, and wait till it finishes. Then a fresh Gentoo is built from scratch.