[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