(Crosstoolchain documentation is now collected and indexed on CrossToolchains)

Building a Cross Compiler

Very few people need to build a cross-toolchain. It is a complicated business and unless you are doing something really quite obscure you should just install a suitable apt-able toolchain. Installation info is on CrossToolchains.

We'll say that again: MOST PEOPLE SHOULDN'T BE BUILDING THEIR OWN CROSS-TOOLCHAIN - THEY SHOULD JUST INSTALL A PRE-BUILT ONE LIKE ANY OTHER PACKAGE.

But there are reasons why you might need to do this.

I really do want to build a cross compiler

Pick the most relevant heading from the list below.

Nomenclature

Image for: Nomenclature

TARGET is the architecture the compiler builds code for. HOST (same as BUILD in this case) is the architecture the compiler runs on (and is currently being built on)

I want a combination of HOST x TARGET not in Debian (on jessie or later)

Image for: I want a combination of HOST x TARGET not in Debian (on jessie or later)

TARGET is a debian release architecture

If TARGET is a debian release architecture then this is fairly straightforward:

apt-get install cross-gcc-dev

This is available from jessie (Debian 8) onwards

TARGET_LIST=<targetarch> HOST_LIST=<hostarch> cross-gcc-gensource <gccver>

Fill in your own <targetarch>, <hostarch> and <gccver> above. (e.g. TARGET_LIST="armel armhf" HOST_LIST="amd64" cross-gcc-gensource 4.9) In jessie only '4.9' is supported as a gcc version.

This will generate (in a directory called cross-gcc-packages-<buildarch>) a cross-gcc-<gccver>-<arch> source package for each arch in the TARGET_LIST.

Note: in jessie cross-gcc-gensource will fail if dash is your default shell. (). Either set the /bin/sh link to bash sudo ln -sf bash /bin/sh or add SHELL := bash near the start of /usr/share/cross-gcc/template/rules.generic (fixed in cross-gcc 17)

cd cross-gcc-<gccver>-<arch>
sbuild -d jessie 

You will need sbuild 0.64.3 or later installed, and a suitable chroot or build env for the target suite. You will also need a <triplet>-binutils package.

Building corresponding binutils and gcc-metapackages

If the cross-binutils you need is not available on your arch, build one (or more) like this:

apt-get source cross-binutils
cd cross-binutils-0.23
sudo apt-get build-dep cross-binutils
TARGET_LIST="arm64" HOST_LIST="armhf" debian/rules control
TARGET_LIST="arm64" HOST_LIST="armhf" dpkg-buildpackage

To make your toolchain convenient to use you need a set of metapackages which provide links from tools to versioned tools (so gcc-arm-linux-gnueabihf links to gcc-4.9-arm-linux-gnueabihf etc). The cross-gcc-defaults package provides those:

apt-get source cross-gcc-defaults
cd cross-gcc-defaults-0.7
TARGET_LIST='armhf' debian/generate-pkgfiles.pl
dpkg-buildpackage

cross-gcc-defaults is available in the jessie external toolchain repository and in unstable.

A more manual build of cross-gcc, probably best done in a chroot, could be

cd packages/cross-gcc-4.9-<hostarch>
dpkg --add-architecture <hostarch>
apt-get update
[install build-deps]
dpkg-buildpackage

(This essentially automates the procedure described on MultiarchCrossToolchainBuild).

TARGET is not a debian release architecture

If TARGET is not a debian release architecture (debian-ports architecture or a new arch), then it may be much harder because you need to do a full kernel/libc/gcc bootstrap. The cross-toolchain-base package (in unstable) can do this for some architectures. The rebootstrap tool can do it for any architecture.

I want the very latest arm support

Linaro's cross-toolchains (tarball install, sadly) are very up to date with patches and support, and may well be useful. But they are supplied as a binary tarball, not as debian packages.

I want toolchain packages for wheezy

The packages on emdebian.org aimed at wheezy have been uninstallable for a long time. Install buildcross from experimental and use that to build your own.

<some instructions here would be helpful>