External Toolchain Support
FreeBSD needs support for external toolchains to ease testing of new compiler versions, support compilers that don't make sense to integrate into the base, and speed builds (by avoiding building of bootstrap compilers). This page documents efforts towards this.
The XCC approach works with top level build targets (buildworld, buildkernel, etc) and overrides common make variables such as CC, CXX, and AS during the cross building portions of the build with values specified by the XCC, XCPP, XAS, etc variables. This method touches few files and is relatively easy to understand, but has drawbacks including the inability to build individual programs easily.
How to use
If is possible to replace both the compiler and binutils. It is possible to replace the compiler and use the built-in binutils. To replace binutils, you must also replace the compiler.
Both the compiler and binutils must be configured to support --sysroot to find headers and libraries.
Using an external compiler
To use an external compiler such as clang, set the variables XCC, XCXX, and XCPP when building and installing. You must generally set all three. For example:
$ make XCC=/usr/local/bin/clang XCXX=/usr/local/bin/clang++ XCPP=/usr/local/bin/clang-cpp buildworld ...
If your versions full paths end in cc, c++, and cpp, then you may use the CROSS_COMPILER_PREFIX variable to set all three (Note that this is a prefix, not a path):
$ ls /tmp/toolchain/ cross-c++ cross-cc cross-cpp $ make CROSS_COMPILER_PREFIX=/tmp/toolchain/cross- buildworld ...
If the compiler is clang and the target architecture is not the same as the build host then an appropriate target triple will be created and passed to clang to support native cross compilation.
Using an external binutils
To use an external binutils, set the XAS, XAR, XLD, XNM, XOBJDUMP, XRANLIB, and XSTRINGS. As with the compiler, there is a CROSS_BINUTILS_PREFIX variable. If the both the compiler and binutils have the same prefix a CROSS_TOOLCHAIN_PREFIX variable can be used to set both.
To use XCC, you must not set any of the variables that can be overridden by X* variables in /etc/make.conf or /etc/src.conf as Makefile.inc1 will be unable to change them.
External, cross-building gcc toolchains support is still somewhat weak (which means doesn't work)
Cross building generally works only with clang 3.4 or whatever the current in-tree compiler is (and often slightly newer tress).
There are some bootstrapping issues still if you want to build the in-tree compiler as part of the build.
Patches have been committed to HEAD. Works with:
Use pre seeded configurations
A collections of xtoolchain ports is available. LLVM ports are of the form devel/xtoolchain-llvm<version> and GCC/binutils are of the form devel/<darch>-xtoolchain-gcc. The current set can be found on Freshports
For example, to build using powerpc64-xtoolchain-gcc, you would do:
pkg install devel/powerpc64-xtoolchain-gcc make CROSS_TOOLCHAIN=powerpc64-gcc TARGET=powerpc TARGET_ARCH=powerpc64 buildworld make CROSS_TOOLCHAIN=powerpc64-gcc TARGET=powerpc TARGET_ARCH=powerpc64 installworld DESTDIR=/sysroots/powerpc64 make CROSS_TOOLCHAIN=powerpc64-gcc TARGET=powerpc TARGET_ARCH=powerpc64 distribution DESTDIR=/sysroots/powerpc64
Use cross compiler to build native compiler
cd /usr/ports/base/binutils make CROSS_TOOLCHAIN=powerpc64-gcc TARGET=powerpc TARGET_ARCH=powerpc64 CROSS_SYSROOT=/sysroots/powerpc64 package cd /usr/ports/base/gcc make CROSS_TOOLCHAIN=powerpc64-gcc TARGET=powerpc TARGET_ARCH=powerpc64 CROSS_SYSROOT=/sysroots/powerpc64 package