QtMoko/CrossBuildingOnDebian

From Openmoko

Revision as of 00:38, 9 November 2011 by Pini (Talk | contribs)

Jump to: navigation, search

Contents

Cross-building QtMoko on Debian

It is possible to cross-build QtMoko on a Debian box using only (em)debian tools.

This is a work in progress. The resulting package isn't fully functionnal yet:

  • no sound
  • no bluetooth.

Tools needed

Most of the magic is handled by the pdebuild-cross package:

$ sudo apt-get install pdebuild-cross

Configuration

The toolchain comes from the Emdebian project. Two configuration files from the multistrap package (pulled in by pdebuild-cross) are needed. It is best to copy them because they're not part of /etc:

$ sudo mkdir /etc/multistrap
$ sudo cp /usr/share/multistrap/{armel,crosschroot}.conf /etc/multistrap

Then modify the armel.conf file to use the Squeeze toolchain (with g++-4.4; the Lenny toolchain with g++-4.2 doesn't work for QtMoko) and to load our copy of crosschroot.conf:

[General]
include=/etc/multistrap/crosschroot.conf
omitrequired=false
configscript=
setupscript=/usr/share/multistrap/setcrossarch.sh
debootstrap=Debian Base Toolchains
aptsources=Debian Toolchains
tarballname=pdebuild-cross.tgz

[Toolchains]
packages=g++-4.4-arm-linux-gnueabi linux-libc-dev-armel-cross
reinstall=binutils-multiarch
source=http://www.emdebian.org/debian
keyring=emdebian-archive-keyring
suite=squeeze

You may also want to change the Debian mirror URIs in crosschroot.conf to use one near your location. I use a french one:

# Example multistrap configuration file for a sid build chroot
# Need to use cascading to select the toolchain for a cross arch.

[General]
arch=
directory=
# same as --tidy-up option if set to true
cleanup=true
# same as --no-auth option if set to true
# keyring packages listed in each debootstrap will
# still be installed.
noauth=false
# whether to add the /suite to be explicit about where apt
# needs to look for packages. Default is false.
explicitsuite=true
# extract all downloaded archives (default is true)
unpack=true
# the order of sections is not important.
# the debootstrap option determines which repository
# is used to calculate the list of Priority: required packages.
debootstrap=Debian Base
aptsources=Debian Base

# Lenny toolchains need -base from Lenny.
[Base]
packages=gcc-4.2-base
source=http://ftp.fr.debian.org/debian
keyring=debian-archive-keyring
suite=lenny
omitdebsrc=false

[Debian]
packages=dpkg-dev binutils-multiarch build-essential dpkg-cross aptitude
source=http://ftp.fr.debian.org/debian
keyring=debian-archive-keyring
suite=unstable
omitdebsrc=false

Finally update the MULTISTRAPFILE variable in your pdebuild-cross' configuration file (/etc/pdebuild-cross/pdebuild-cross.rc) to point to your multistrap armel config:

# this is your configuration file for pdebuild-cross.
# /etc/pdebuild-cross/pdebuild-cross.rc is the one meant for editing.
#
# read pbuilderrc (5) and pdebuild-cross (1) for notes on specific options.

# remember to change CROSSARCH, DEBBUILDOPTS and MULTISTRAPFILE to
# change your target cross-building architecture from armel.

CROSSARCH=armel
DEBBUILDOPTS="-aarmel"
MULTISTRAPFILE=/home/pini/debian/multistrap/armel.conf
BASETGZ=/var/lib/pdebuild-cross/pdebuild-cross.tgz
BUILDPLACE=/var/lib/pdebuild-cross/build/
BUILDRESULT=..
APTCACHE=/var/lib/pdebuild-cross/aptcache/
#HOOKDIR=/usr/share/pdebuild-cross/hookdir/
APTCACHEHARDLINK=no
PBUILDERSATISFYDEPENDSCMD=/usr/sbin/embuilddeps
PBUILDERSATISFYDEPENDSOPT="-m -a armel"
USEDEVPTS=yes
AUTO_DEBSIGN=no

# Only use when testing Xorg apps, not when building
# also remember to copy ~/.Xauthority into /home/$SUDO_USER/
# (mkdir /home/$SUDO_USER if necessary).
#BINDMOUNTS="/tmp"

You may want to change the BUILDPLACE path as well in case you're short of space in /var.

Creating the pbuilder chroot

As simple as:

$ sudo pdebuild-cross-create

Setting up the git workspace

First clone the QtMoko repo:

$ git clone -r git://github.com/radekp/qtmoko.git

Create your own branch:

$ cd qtmoko
$ git branch <my branch>

Merge in the translations branch

$ git merge origin/translations

Patch the debian files

$ wget -c http://wiki.openmoko.org/images/c/c7/QtMoko-pdebuild-cross-patch.txt
$ patch -p1 < QtMoko-pdebuild-cross-patch.txt

Building the QtMoko package

Create the orig tarball (once after each git merge):

$ tar czf ../qtmoko_36.orig.tar.gz -C .. --exclude .git --exclude .pc --exclude qtmoko/debian --transform 's:\./qtmoko:qtmoko-36:' ./qtmoko

Build:

$ pdebuild-cross

On my Zotac ZBox (amd64) the whole build takes five hours.

Personal tools

Cross-building QtMoko on Debian

It is possible to cross-build QtMoko on a Debian box using only (em)debian tools.

This is a work in progress. The resulting package isn't fully functionnal yet:

  • no sound
  • no bluetooth.

Tools needed

Most of the magic is handled by the pdebuild-cross package:

$ sudo apt-get install pdebuild-cross

Configuration

The toolchain comes from the Emdebian project. Two configuration files from the multistrap package (pulled in by pdebuild-cross) are needed. It is best to copy them because they're not part of /etc:

$ sudo mkdir /etc/multistrap
$ sudo cp /usr/share/multistrap/{armel,crosschroot}.conf /etc/multistrap

Then modify the armel.conf file to use the Squeeze toolchain (with g++-4.4; the Lenny toolchain with g++-4.2 doesn't work for QtMoko) and to load our copy of crosschroot.conf:

[General]
include=/etc/multistrap/crosschroot.conf
omitrequired=false
configscript=
setupscript=/usr/share/multistrap/setcrossarch.sh
debootstrap=Debian Base Toolchains
aptsources=Debian Toolchains
tarballname=pdebuild-cross.tgz

[Toolchains]
packages=g++-4.4-arm-linux-gnueabi linux-libc-dev-armel-cross
reinstall=binutils-multiarch
source=http://www.emdebian.org/debian
keyring=emdebian-archive-keyring
suite=squeeze

You may also want to change the Debian mirror URIs in crosschroot.conf to use one near your location. I use a french one:

# Example multistrap configuration file for a sid build chroot
# Need to use cascading to select the toolchain for a cross arch.

[General]
arch=
directory=
# same as --tidy-up option if set to true
cleanup=true
# same as --no-auth option if set to true
# keyring packages listed in each debootstrap will
# still be installed.
noauth=false
# whether to add the /suite to be explicit about where apt
# needs to look for packages. Default is false.
explicitsuite=true
# extract all downloaded archives (default is true)
unpack=true
# the order of sections is not important.
# the debootstrap option determines which repository
# is used to calculate the list of Priority: required packages.
debootstrap=Debian Base
aptsources=Debian Base

# Lenny toolchains need -base from Lenny.
[Base]
packages=gcc-4.2-base
source=http://ftp.fr.debian.org/debian
keyring=debian-archive-keyring
suite=lenny
omitdebsrc=false

[Debian]
packages=dpkg-dev binutils-multiarch build-essential dpkg-cross aptitude
source=http://ftp.fr.debian.org/debian
keyring=debian-archive-keyring
suite=unstable
omitdebsrc=false

Finally update the MULTISTRAPFILE variable in your pdebuild-cross' configuration file (/etc/pdebuild-cross/pdebuild-cross.rc) to point to your multistrap armel config:

# this is your configuration file for pdebuild-cross.
# /etc/pdebuild-cross/pdebuild-cross.rc is the one meant for editing.
#
# read pbuilderrc (5) and pdebuild-cross (1) for notes on specific options.

# remember to change CROSSARCH, DEBBUILDOPTS and MULTISTRAPFILE to
# change your target cross-building architecture from armel.

CROSSARCH=armel
DEBBUILDOPTS="-aarmel"
MULTISTRAPFILE=/home/pini/debian/multistrap/armel.conf
BASETGZ=/var/lib/pdebuild-cross/pdebuild-cross.tgz
BUILDPLACE=/var/lib/pdebuild-cross/build/
BUILDRESULT=..
APTCACHE=/var/lib/pdebuild-cross/aptcache/
#HOOKDIR=/usr/share/pdebuild-cross/hookdir/
APTCACHEHARDLINK=no
PBUILDERSATISFYDEPENDSCMD=/usr/sbin/embuilddeps
PBUILDERSATISFYDEPENDSOPT="-m -a armel"
USEDEVPTS=yes
AUTO_DEBSIGN=no

# Only use when testing Xorg apps, not when building
# also remember to copy ~/.Xauthority into /home/$SUDO_USER/
# (mkdir /home/$SUDO_USER if necessary).
#BINDMOUNTS="/tmp"

You may want to change the BUILDPLACE path as well in case you're short of space in /var.

Creating the pbuilder chroot

As simple as:

$ sudo pdebuild-cross-create

Setting up the git workspace

First clone the QtMoko repo:

$ git clone -r git://github.com/radekp/qtmoko.git

Create your own branch:

$ cd qtmoko
$ git branch <my branch>

Merge in the translations branch

$ git merge origin/translations

Patch the debian files

$ wget -c http://wiki.openmoko.org/images/c/c7/QtMoko-pdebuild-cross-patch.txt
$ patch -p1 < QtMoko-pdebuild-cross-patch.txt

Building the QtMoko package

Create the orig tarball (once after each git merge):

$ tar czf ../qtmoko_36.orig.tar.gz -C .. --exclude .git --exclude .pc --exclude qtmoko/debian --transform 's:\./qtmoko:qtmoko-36:' ./qtmoko

Build:

$ pdebuild-cross

On my Zotac ZBox (amd64) the whole build takes five hours.