[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