[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