[llvm-dev] Cross compiling C++ program

Jonathan Roelofs via llvm-dev llvm-dev at lists.llvm.org
Fri Aug 4 12:54:33 PDT 2017



On 8/4/17 1:14 PM, Goran Mekić via llvm-dev wrote:
> On Thu, Aug 03, 2017 at 08:22:24AM -0600, Jonathan Roelofs wrote:
>> IIUC, you don't want to cross compile llvm itself (which is what those
>> instructions are for), but instead you want to *use* llvm to cross compile
>> things.
>>
>> To build your sysroot, you'll need to cross-build:
>>
>>    1) A libc. Good choices for that for baremetal are: newlib or musl.
>>    2) Builtins. In llvm, that's provided in the compiler-rt repo. Otherwise
>> you can use libgcc from an arm-none-eabi-gcc toolchain.
>>    3) If you want c++, you'll also need:
>>       3A) c++ abi library. llvm provides this as libcxxabi. There's also
>> libsupc++, and libcxxrt, depending on what licenses you're comfortable with.
>>       3B) An unwinder. llvm provides libunwind. There's also one packaged in
>> libgcc_s (depending on how it was built), and another from the old HP
>> libunwind project (different codebase, but same name as the llvm one).
>>       3C) A c++ standard library. llvm provides this as libcxx. There's also
>> libstdc++.
>>
>>
>> To start with, I recommend using the cmake cache in:
>> $clang_src/cmake/caches/BaremetalARM.cmake. You'll want the stuff in it that
>> references the armv7em-none-eabi triple. To use it, do something like:
>>
>> $  cmake -G <build system>
>> -DBAREMETAL_ARMV7EM_SYSROOT=path/to/your/v7em/sysroot -C
>> path/to/BaremetalARM.cmake [other CMake Options]
>>
>> Assuming your sysroot has libc headers in it, that should get you a clang
>> that's capable of compiling basic things, which you can use to build all the
>> libraries above.
>>
>>
>> Jon
> 
> Hello,
> 
> Your input was very valuable, but I must be too noob so I have to ask. I tried to read as much as I could about musl, compiler-rt and libunwind to understand what are those libs and I decided to go with a "relexed" licenced alternatives. :o) If I got it right, the order of repos I need to compile is:
> 
> - musl
> - compiler-rt
> - libcxxabi
> - libunwind
> - libcxx
> - clang (with the suggestion about baremetal cache)


Not quite. You'll need clang built in order to build the other things. 
(I guess you could use your existing toolchain to do that, but IIUC, you 
want to use clang for all of it & bootstrap a full clang-based 
toolchain). For that, the usual order is to:

1) Pick a directory as your sysroot
2) Install the libc headers there (without having built it)
3) Build clang w/ baremetal cache, pointing it at the partially built 
sysroot.
4) Build your libc.
4A) Test your libc.
4B) Install your libc in your sysroot.
5) Build libcxxabi. (it's build needs to know where the source for 
libcxx lives)
5A) Test libcxxabi. (testing it requires knowing where source for libcxx 
lives. use remote executors & linker scripts to run on your board, or in 
qemu)
5B) Install libcxxabi in your sysroot.
6) Build libunwind.
6A) Test libunwind. (testing it requires knowing where source for libcxx 
lives. use remote executors & linker scripts to run on your board, or in 
qemu)
6B) Install libunwind in your sysroot.
7) Build libcxx.
7A) Test libcxx. (use remote executors & linker scripts to run on your 
board, or in qemu)
7B) Install libcxx in your sysroot.


A note on linker scripts: support for them in lld is still a bit rough 
around the edges, so you may want to use the linker that comes with your 
board (presumably binutils ld).

> 
> If you know any doc on how to get clang++ compile for any bare metal arm, I'll be glad to RTFM. :o)

Sorry, I don't have a doc for that. We're getting closer to making it 
work "out of the tin", but it's not there yet. We (wearing my 
CodeSourcery hat) are working on it, but it's going to take some time 
before it "just works" upstream.


Jon

> 
> 
> 
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> 

-- 
Jon Roelofs
jonathan at codesourcery.com
CodeSourcery / Mentor Embedded / Siemens


More information about the llvm-dev mailing list