LLVM Cross-Compiler: Difference between revisions

From OSDev.wiki
Jump to navigation Jump to search
[unchecked revision][unchecked revision]
Content added Content deleted
No edit summary
No edit summary
Line 23: Line 23:
** make
** make
** binutils (a fairly recent version of binutils, try 2.21 or above if you get assembly compilation errors)
** binutils (a fairly recent version of binutils, try 2.21 or above if you get assembly compilation errors)
** subversion (if using svn build
** git (if using git build)
** cmake
** cmake


== Building ==
== Building ==


=== Subversion Build (Possibly Unstable) ===
=== Git Build (Possibly Unstable) ===
In bash, run
In bash, run
<source lang="bash">
<source lang="bash">
mkdir crossllvm
mkdir crossllvm
cd crossllvm
cd crossllvm
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
git clone http://llvm.org/git/llvm.git
cd llvm/tools
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
git clone http://llvm.org/git/clang.git
cd ../..
cd ../..
mkdir build
mkdir build
Line 73: Line 73:
==== -nostdinc++ ====
==== -nostdinc++ ====
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.
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.

=== Building libc++ ===

<source lang="bash">
$ git clone http://llvm.org/git/libcxx.git
$ export TRIPLE=-apple-
$ cd libcxx/lib
$ ./buildit
</source>

Built libc++ is not installed by default, you can use make install or copy files manually.



== TODO ==
== TODO ==


TODO: describe non-svn build from released tarballs.
TODO: describe non-svn build from released tarballs.

TODO: integrate libc++ build instructions

Revision as of 11:02, 29 May 2013

Difficulty level

Advanced

EDIT: A more up-to-date version with Clang 3.4 is posted here.

EDIT: A mostly working Clang cross-compiler is generated by this buildscript. Dissect it to learn more. TODO: move details to this page.

EDIT: EmbToolkit project recently added support to clang/llvm based cross compiler. TODO: Add note about how it works.

Introduction

About

Generally speaking, a cross-compiler is a compiler that runs on platform A (the host), but generates executables for platform B (the target). These two platforms may (but do not need to) differ in CPU, operating system, and/or executable format.

Clang (and llvm) are host cross compilers. They by default have the capability to cross compile, but also produce host binaries. See Usage

Requirements

  • A host system with a working compiler.
  • 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:
    • GCC (even if you have something like MinGW installed)
    • make
    • binutils (a fairly recent version of binutils, try 2.21 or above if you get assembly compilation errors)
    • git (if using git build)
    • cmake

Building

Git Build (Possibly Unstable)

In bash, run

mkdir crossllvm
cd crossllvm
git clone http://llvm.org/git/llvm.git
cd llvm/tools
git clone http://llvm.org/git/clang.git
cd ../..
mkdir build
cd build
cmake ../llvm
make

Now you have got llvm built!

Debian

Open a terminal

sudo apt-get install clang

Note, you might have to disable host functionality. See Useful Flags

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

-march=armv7-a -mfloat-abi=soft -ccc-host-triple arm-elf

Since 3.1, it can be shortened to

-target armv7--eabi -mcpu=cortex-a9

Useful Flags

Some usefull flags for OS development.

-ffreestanding

Indicated that the file should be compiled for a freestanding enviroment (like a kernel), not a hosted (userspace), environment.

-fno-builtin

Disable special handling and optimizations of builtin functions like strlen and malloc.

-nostdlib

Disables standard library

-nostdinc

Makes sure the standard library headers are not included.

-nostdinc++

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.

Building libc++

$ git clone http://llvm.org/git/libcxx.git
$ export TRIPLE=-apple-
$ cd libcxx/lib
$ ./buildit

Built libc++ is not installed by default, you can use make install or copy files manually.


TODO

TODO: describe non-svn build from released tarballs.