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.> 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 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".> 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). -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 833 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170804/b9dd1ea6/attachment.sig>
Jonathan Roelofs via llvm-dev
2017-Aug-04 22:03 UTC
[llvm-dev] Cross compiling C++ program
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/clangSorry, 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
On Fri, Aug 04, 2017 at 04:03:35PM -0600, Jonathan Roelofs wrote:> > > 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.On a new directories and fresh untar of musl, I don't think there's a difference> > > 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/clangln -s `which clang40` path/to/llvm/tools/clang> * path/to/llvm/runtimes/compiler_rt path/to/compiler_rtln -s path/to/llvm/projects/compiler-rt path/to/llvm/runtimes/compiler_rt Is that right?> > And by "edited BaremetalARM.cmake" I mean you can strip out the other > targets in there that you don't need.So I have copied BaremetalARM.cmake into llvm/cmake/caches/BaremetalARM.cmake to be able to alter it, I've put all other repos in llvm/projects and the command is: # cmake -G 'Unix Makefiles' -DBAREMETAL_ARMV7EM_SYSROOT=~/arm-sysroot -DBAREMETAL_ARMV6M_SYSROOT=~/arm-sysroot -DBAREMETAL_ARMV7M_SYSROOT=~/arm-sysroot -C ../../code/llvm/cmake/caches/BaremetalARM.cmake ../../code/llvm Before adding all repos into llvm/projects, it complained about 'Specified distribution component 'clang' doesn't have a target' (just an example). Now I have 'Specified distribution component 'builtins-armv6m-none-eabi' doesn't have a target' as error. -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 833 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170805/52db4043/attachment.sig>