[llvm-dev] Cross compiling C++ program
Jonathan Roelofs via llvm-dev
llvm-dev at lists.llvm.org
Fri Aug 4 14:34:46 PDT 2017
On 8/4/17 3:04 PM, Matthias Braun wrote:
> You may also take a look at the ELLCC project (www.ellcc.org
> <http://www.ellcc.org>). As far as I understand it they produce and
> package cross toolchains for a number of popular targets.
AFAIU, ELLCC doesn't support baremetal. It only has linux targets.
Jon
>
> - Matthias
>
>> On Aug 4, 2017, at 12:54 PM, Jonathan Roelofs via llvm-dev
>> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>>
>>
>>
>> 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 <mailto:llvm-dev at lists.llvm.org>
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>
>> --
>> Jon Roelofs
>> jonathan at codesourcery.com <mailto:jonathan at codesourcery.com>
>> CodeSourcery / Mentor Embedded / Siemens
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org <mailto: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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170804/3acd8659/attachment-0001.html>
More information about the llvm-dev
mailing list