[llvm-dev] Cross compiling C++ program

Jonathan Roelofs via llvm-dev llvm-dev at lists.llvm.org
Fri Aug 4 15:03:35 PDT 2017



On 8/4/17 3:50 PM, Goran Mekić via llvm-dev wrote:
> On Fri, Aug 04, 2017 at 01:54:33PM -0600, Jonathan Roelofs 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
> ~/arm-sysroot
> 
>> 2) Install the libc headers there (without having built it)
> What I did was mv musl-*/include ~/arm-sysroot/usr/include.

I think you need to copy them, not move them.

> 
>> 3) Build clang w/ baremetal cache, pointing it at the partially built
>> sysroot.
>   cmake -G 'Unix Makefiles' -DBAREMETAL_ARMV7EM_SYSROOT=~/arm-sysroot -C ../../code/clang/cmake/caches/BaremetalARM.cmake ../../code/clang

Sorry, I wasn't explicit enough. You need to define all of the variables 
that the cache is looking for.

> loading initial cache file ../../code/clang/cmake/caches/BaremetalARM.cmake
> -- Found LLVM_CONFIG as /usr/local/bin/llvm-config
> -- Building with -fPIC
> -- Could NOT find Z3 (missing:  Z3_LIBRARIES Z3_INCLUDE_DIR) (Required is at least version "4.5")
> -- Clang version: 4.0.1
> CMake Error at /usr/local/llvm40/lib/cmake/llvm/LLVM-Config.cmake:203 (message):
>    Library `BinaryFormat' not found in list of llvm libraries.
> Call Stack (most recent call first):
>    /usr/local/llvm40/lib/cmake/llvm/AddLLVM.cmake:508 (llvm_map_components_to_libnames)
>    cmake/modules/AddClang.cmake:86 (llvm_add_library)
>    lib/AST/CMakeLists.txt:6 (add_clang_library)
> 
> -- Configuring incomplete, errors occurred!
> See also "/usr/home/meka/repos/clang/build/clang/CMakeFiles/CMakeOutput.log".

I think it found an installed llvm, and is trying to use that to build 
clang against. First, the clang and llvm's versions have to match. 
Second, when I mentioned building clang, I really meant building 
llvm+clang... sorry.

$ cmake -G 'Unix Makefiles' -DBAREMETAL_ARMV7EM_SYSROOT=~/arm-sysroot -C 
path/to/copy/of/edited/BaremetalARM.cmake path/to/llvm

Where your path/to/llvm has the symlinks:

   *  path/to/llvm/tools/clang -> path/to/clang
   *  path/to/llvm/runtimes/compiler_rt path/to/compiler_rt

And by "edited BaremetalARM.cmake" I mean you can strip out the other 
targets in there that you don't need.


Jon

> 
> 
> 
>> 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).
> Thank you!
> 
>> 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.
> I will test what ever you throw my way regarding this (or write a doc).
> 
> 
> 
> _______________________________________________
> 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