Cross Compiling Firefox on ubuntu the multiarch way

Preparing multiarch chroot

For testing, you will want a oneiric chroot.

sudo debootstrap --variant=buildd oneiric /srv/oneiric
sudo chroot /srv/oneiric/
mount -t proc proc /proc

Set up the /etc/apt/sources.list inside the chroot :

# use arch=i386 if you have 32bit Linux install
deb [arch=amd64] oneiric main universe
deb [arch=armel] oneiric main universe
deb-src oneiric main universe

We need some packages not yet in oneiric, so we create /etc/apt/sources.list.d/linaro-maintainers.list

deb oneiric main
deb-src oneiric main
deb oneiric main
deb-src oneiric main

Enable multiarch for dpkg in in /etc/dpkg/dpkg.cfg.d/multiarch

foreign-architecture armel

In /etc/apt/apt.conf.d/10local disable installing recommends:

APT::Install-Recommends "0";
APT::Install-Suggests "0";

Install toolchain and essentials

apt-get update
apt-get install g++-arm-linux-gnueabi build-essential

Drag in build-dependencies for firefox

Ideally, we would just:

apt-get build-dep -aarmel firefox

But this doesn't work yet. So we walk through firefox build dependencies by hand, and split them to ones we want for armel (DEB_HOST_ARCHITECTURE) and ones we want for x86/amd64 (DEB_BUILD_ARCHITECTURE). Thumb of rule is that anything with -dev and/or multi-arch: same goes for armel and ones with multi-arch: foreign go with build machine architecture.

apt-get install libx11-dev:armel libxt-dev:armel libgtk2.0-dev:armel liborbit2-dev:armel libidl-dev:armel libxft-dev:armel libfreetype6-dev:armel libxrender-dev:armel libxinerama-dev:armel libgnome2-dev:armel libgconf2-dev:armel libgnomeui-dev:armel libstartup-notification0-dev:armel libasound2-dev:armel libcurl4-openssl-dev:armel libdbus-glib-1-dev:armel libiw-dev:armel mesa-common-dev:armel libnotify-dev:armel libgnomevfs2-dev:armel libdbusmenu-gtk-dev:armel

apt-get install cdbs debhelper m4 autotools-dev autoconf2.13 quilt patchutils bzip2 zip mozilla-devscripts hardening-wrapper lsb-release yasm xvfb imagemagick libidl-dev libglib2.0-dev

As you notice, some packages (libidl-dev libglib2.0-dev) are needed for both host and build environment. This is because firefox builds some tools it uses during build time.

Finally, we need to create a symlink for pkg-config:

cd /usr/bin
ln -s /usr/share/pkg-config-crosswrapper arm-linux-gnueabi-pkg-config

Proceeding to build

Finally something simple:

apt-get source firefox=8.0+build1-0ubuntu0.11.10.3linaro1
cd firefox*
dpkg-buildpackage -aarmel 2>&1|tee ../firefox.log

Work in progress

  • Cross-toolchain still doesn't search multiarch paths. These were hacked in for this demo into debian/rules
  • pkg-config wrapper symlink should come with cross-toolchain
  • apt-get build-dep should work for cross-arch


Platform/DevPlatform/CrossCompile/FirefoxCrossCompile (last modified 2012-02-09 19:53:02)