Skip to content
because we don't need to leave this broken for another year
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.

Cross-compiling Firefox for armhf with clang

The first run in spring 2018 was done in an Ubuntu 14.04 Trusty container, but this flow has since been revised for a Debian Stretch amd64 container targeting Raspbian.

The instructions below are for a recent major release such as Firefox 65.0 as this was last revised in February 2019. To build Firefox ESR 60.5, see Trusty-specific notes have been moved to There is also a

While this is glaringly out-of-date relative to Firefox 68.0.1, Firefox ESR 60.8, and beyond, as of June 2019 they released Raspbian 10 Buster. That distro plays nicely with the gcc-based Firefox Bionic binaries and relieves the needs of most users.

If you attempt the build procedure below please expect to run into missing packages or other problems that you'll have to troubleshoot. Also keep an eye on the list of GitHub issues for what others have come across.

If you're interested in maintaining this for newer releases of Firefox, pull requests are welcome.

sudo dpkg --add-architecture armhf
sudo apt update
curl -sL | sudo -E bash -
sudo apt install -y gir1.2-atk-1.0:armhf gir1.2-freedesktop:armhf gir1.2-gdkpixbuf-2.0:armhf \
  gir1.2-notify-0.7:armhf gir1.2-pango-1.0:armhf libatk1.0-dev:armhf libgdk-pixbuf2.0-dev:armhf \
  libgirepository-1.0-1:armhf libgtk-3-dev:armhf libgtk2.0-dev:armhf \
  libpango1.0-dev:armhf libharfbuzz-dev:armhf libicu-dev:armhf libxt-dev:armhf \
  libstartup-notification0-dev:armhf libasound2-dev:armhf libcurl4-openssl-dev:armhf \
  libdbus-glib-1-dev:armhf libiw-dev:armhf libnotify-dev:armhf libpulse-dev:armhf fakeroot \
  devscripts build-essential dpkg-cross crossbuild-essential-armhf \
  libreadline-dev:armhf libbz2-dev:armhf libjsoncpp-dev:armhf \
  libnss3-tools debhelper autoconf2.13 cdbs clang-3.9 zip python nodejs

Install rustup:

curl -sSf | sh
# Edit ~/.bashrc, add Rust sourcing: . ~/.cargo/env
rustup target add armv7-unknown-linux-gnueabihf

Add Firefox bionic source packages and fetch source:

cat <<EOF | sudo tee /etc/apt/sources.list.d/firefox.list
deb [arch=armhf] bionic-updates main restricted
deb-src [arch=armhf] bionic-updates main restricted

sudo apt-key adv --recv-key --keyserver 3B4FE6ACC0B21F32
sudo apt update
apt-get source firefox:armhf
cd firefox-*

We need to patch to pass a cross-compile flag to its clang options. debian/rules has some apparmor conditions that are too Ubuntu-specific. The WebRTC module seems to have been patched but is missing essential ASFLAGS. Firefox 64.0 added a major change:

# * Explicitly set HOME=/tmp

which breaks existing build flows. Apply the complete armhf.patch to fix all of the above:

patch -p1 < path/to/firefox-armhf/armhf.patch

Then run dpkg-buildpackage:

PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig \
  CONFIG_SITE=/etc/dpkg-cross/cross-config.amd64 \
  dpkg-buildpackage -aarmhf -b -d

After configuration errors, replace mozconfig with the one from this repo. Make sure you've edited it to use your correct homedir paths. Then resume the build:

PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig \
  CONFIG_SITE=/etc/dpkg-cross/cross-config.amd64 \
  dpkg-buildpackage -aarmhf -b -d -nc

Monitor the build for the course of two hours. When errors arise, troubleshoot then resume. For example if you see this problem:

/bin/bash: ./obj-arm-linux-gnueabihf/dist/bin/shlibsign: cannot execute binary file: Exec format error

This means mozbuild made the mistake of running the armhf build of the signing tool. Point it back to the host binary:

rm obj-arm-linux-gnueabihf/dist/bin/shlibsign 
ln -s /usr/bin/shlibsign obj-arm-linux-gnueabihf/dist/bin/

Then resume with the -nc flag. Next, if you run into the following error minutes later:

dh_install: Cannot find (any matches for) "usr/lib/firefox/browser/chrome" (tried in "." and "debian/tmp")
dh_install: firefox missing files: usr/lib/firefox/browser/chrome
dh_install: Cannot find (any matches for) "usr/lib/firefox/plugin-container" (tried in "." and "debian/tmp")
dh_install: firefox missing files: usr/lib/firefox/plugin-container

This means that the whole usr/lib folder never got populated. Create it and copy build artifacts into there:

mkdir -p usr/lib
cp -rpf obj-arm-linux-gnueabihf/dist/* usr/lib/

Resume here and it will take a while for all localizations. If you reach the end you'll see the error:

gpg: skipped "Olivier Tilloy <>": No secret key
gpg: dpkg-sign.8YBNCg8D/firefox_65.0+build2-0ubuntu0.18.04.1_armhf.buildinfo: clear-sign failed: No secret key

dpkg-buildpackage: error: failed to sign .buildinfo file

Although the message may not sound positive, at that point you'll find a set of deb packages in your home directory. On a good day you might see a clean finish:

dpkg-buildpackage: info: binary-only upload (no source included)
You can’t perform that action at this time.