[llvm-dev] Building an LLVM cross-compiler

Martin Storsjö via llvm-dev llvm-dev at lists.llvm.org
Fri Nov 6 14:48:03 PST 2020


On Fri, 6 Nov 2020, Cág via llvm-dev wrote:

> The process, in my opinion, should go like this:
> 1. Get the sources (llvm, lld, compiler-rt, libunwind, libcxx...).
> 2. Build an LLVM cross-compiler toolchain using native distribution's
> compiler (i.e. build an x86_64 clang executable that targets aarch64).
> 3. Cross-compile libc and other libraries/dependencies to run the
> userland.
> 4. Cross-compile the userland.
>
> It stops after that.  To build compiler-rt you need C headers, libc
> runtimes, *and libclang_rt.a*.  You can't cross-compile libc because you
> don't have compiler-rt because you don't have libc.  Chicken or egg.

Yes, for such a full from-scratch setup, the procedure is a bit fiddly to 
get right, and exactly how to do it is very dependent on how configurable 
the lower level components of your target platform are for such bootstrap 
setups.

I regularly build my toolchain that targets mingw, in exactly this way. 
First I build the compiler, then I install the target "libc"'s headers, 
then build the mingw equivalent of the libc.

Here, the "libc" consists of import libraries (that are generated from 
symbol listings using llvm-dlltool) and static libraries, so libclang_rt 
isn't needed yet. (The autoconf scripts for these bits define 
AC_NO_EXECUTABLES, which avoids bailing out due to the compiler not being 
able to link an executable.)

After this step, I build the compiler-rt builtins, and this is configured 
with -DCMAKE_C_COMPILER_WORKS=1 to (iirc) make it not bail out even though 
the toolchain still can't link anything. After building the compiler-rt 
builtins, and installing them, the toolchain finally is complete enough to 
link a working C program.

After this stage, higher level runtimes like libc++ can be built on top, 
followed by other compiler-rt libraries.

See https://github.com/mstorsjo/llvm-mingw for the full set of scripts I 
use to build my setup; built-all.sh is the toplevel script you can start 
following if you want to dig in.

// Martin


More information about the llvm-dev mailing list