LLVM Cross-Compiler: Difference between revisions

[unchecked revision][unchecked revision]
Content deleted Content added
No edit summary
m Bot: Replace deprecated source tag with syntaxhighlight
 
(14 intermediate revisions by 8 users not shown)
Line 1:
{{In_Progress}}
{{rating|3}}
 
EDIT: [http://www.embtoolkit.org EmbToolkit project] recently added support to clang/llvm based cross compiler.
TODO: Add note about how it works.
 
= Introduction =
NOTE: This article is not complete yet.
Having working and production ready llvm/clang cross-compiler involves much more work than just what is explained here
(such that having llvm/clang use correct target associated sysroot, static linker, C/C++ libraries, etc.)
See [http://clang.llvm.org/UniversalDriver.html clang Universal driver].
For working and production ready clang/llvm cross-compiler use dedicated tools (such as [http://www.embtoolkit.org EmbToolkit]) generating one for you.
=== About ===
 
Line 12 ⟶ 15:
=== Requirements ===
 
* A host system with a ''working'' compiler (can be GCC, Clang, etc).
 
* A bash shell or comparable environment. If you are not using a bash shell, you might have to modify some of the command lines below. If you have just installed the basic [[Cygwin]] package, you have to run the setup.exe again and install the following packages:
** GNU Make or CMake
** [[GCC]] (even if you have something like MinGW installed)
** GNU Binutils (a fairly recent version of Binutils, try 2.21 or above if you get assembly compilation errors)
** make
** GIT or SVN (if building from sources)
** binutils (a fairly recent version of binutils, try 2.21 or above if you get assembly compilation errors)
** gitCurl (if building from source using gitthe linked buildarticle)
** cmake
 
== Building ==
 
=== GitChecking Buildout (Possibly Unstable)sources ===
 
In bash, run
Clang/LLVM sources can be checked out either with GIT or SVN.
<source lang="bash">
 
For GIT, in bash:
 
<syntaxhighlight lang="bash">
mkdir crossllvm
cd crossllvm
Line 31 ⟶ 36:
cd llvm/tools
git clone http://llvm.org/git/clang.git
cd ../..projects
git clone http://llvm.org/git/compiler-rt.git
</syntaxhighlight>
 
For SVN, in bash:
 
<syntaxhighlight lang="bash">
mkdir crossllvm
cd crossllvm
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
cd ../projects
svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
</syntaxhighlight>
 
=== Building from sources (Possibly Unstable) ===
After having checked out the sources (see above), in bash, from the "crossllvm" directory:
<syntaxhighlight lang="bash">
mkdir build
cd build
../llvm/configure --enable-optimized
cmake ../llvm
make
make install
</source>
</syntaxhighlight>
Now you have got llvm built!
 
Note: This Autoconf build has been removed from current versions of the LLVM build. All new builds must use CMake.
A faster and more up-to-date way is posted [http://exocortex.madfire.net/post/2013/05/23/compiling-llvm-trunk/ here]. It uses ninja for much faster building.
 
Or with CMake (adjust the source path as needed):
 
<syntaxhighlight lang="bash">
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE:STRING=Release ../llvm/
make
make install
</syntaxhighlight>
 
Now you have got LLVM and Clang built!
 
Alternatively, a faster and more up-to-date way for building from source (using ninja) is available [http://atta-metta.net/blog/2013/05/23/compiling-llvm-trunk/ here]. The linked article was written in May of 2013, so all of the article's provided custom patches are no longer required. Assuming you are using recent versions (released during or after June 2013) of compiler-rt, lldb, and libc++ then you can safely skip installing the provided patches within the article and proceed with compiling using the unmodified content of the git repos the article instructs you to download.
 
A Clang cross-compiler is generated by [https://github.com/berkus/metta/blob/develop/build_toolchain.sh this buildscript]. Dissect it to learn more. It uses some gcc and binutils to provide a fully working toolchain.
Line 45 ⟶ 82:
=== Debian ===
Open a terminal
<sourcesyntaxhighlight lang="bash">
sudo apt-get install clang
</syntaxhighlight>
</source>
Note, you might have to disable host functionality. See Useful Flags
 
== Building libc++ ==
 
<syntaxhighlight lang="bash">
$ git clone http://llvm.org/git/libcxx.git
$ export TRIPLE=-apple-
$ cd libcxx/lib
$ ./buildit
</syntaxhighlight>
 
Built libc++ is not installed by default, you can use make install or copy files manually.
 
 
== Usage ==
After building you will have a compiler able to output multiple output formats regardless of your current platform.
 
For example, for cross compiling to ARM, you can use
<sourcesyntaxhighlight lang="bash">
-march=armv7-a -mfloat-abi=soft -ccc-host-triple arm-elf
</syntaxhighlight>
</source>
Since 3.1, it can be shortened to
<sourcesyntaxhighlight lang="bash">
-target armv7--eabi -mcpu=cortex-a9
</syntaxhighlight>
</source>
An example for compiling to a generic X86 ELF target would be:
<syntaxhighlight lang="bash">
--target=i686-pc-none-elf -march=i686
</syntaxhighlight>
 
=== Useful Flags ===
Line 74 ⟶ 128:
Makes sure the standard C++ library headers are not included. This makes sense if you build a custom version of libc++ and want to avoid including system one.
 
=== BuildingUsing libc++system roots ===
Due to Clang's dependency on ld, you may get the error message "/usr/bin/ld: this linker was not configured to use sysroots". If you receive this error, you'll probably have to compile binutils with sysroot support. There is information how to do this [[GCC Cross-Compiler#Binutils]] - note the "--with-sysroot" flag.
 
== TODO ==
<source lang="bash">
$ git clone http://llvm.org/git/libcxx.git
$ export TRIPLE=-apple-
$ cd libcxx/lib
$ ./buildit
</source>
 
TODO: describe non-svn build from released tarballs.
Built libc++ is not installed by default, you can use make install or copy files manually.
TODO: [http://www.embtoolkit.org EmbToolkit project] recently added support to clang/llvm based cross compiler, ddd note about how it works.
 
 
== TODO ==
 
[[Category:Compilers]]
TODO: describe non-svn build from released tarballs.